python基础
python基础
gyhhl一 基本数据类型
Python 默认拥有以下内置数据类型:
类型 | 类别 |
---|---|
文本类型: | str |
数值类型: | int , float , complex |
序列类型: | list , tuple , range |
映射类型: | dict |
集合类型: | set , frozenset |
布尔类型: | bool |
二进制类型: | bytes , bytearray , memoryview |
数据类型的转换
方法 | 说明 |
---|---|
int(x [,base ]) | 将x转换为一个整数 |
float(x ) | 将x转换到一个浮点数 |
complex(real [,imag ]) | 创建一个复数 |
str(x ) | 将对象 x 转换为字符串 |
repr(x ) | 将对象 x 转换为表达式字符串 |
eval(str ) | 用来计算在字符串中的有效 Python 表达式,并返回一个对象 |
tuple(s ) | 将序列 s 转换为一个元组 |
list(s ) | 将序列 s 转换为一个列表 |
chr(x ) | 将一个整数转换为一个字符 |
unichr(x ) | 将一个整数转换为 Unicode 字符 |
ord(x ) | 将一个字符转换为它的整数值 |
hex(x ) | 将一个整数转换为一个十六进制字符串 |
oct(x ) | 将一个整数转换为一个八进制字符串 |
字符串方法
方法 | 描述 |
---|---|
capitalize() | 把首字符转换为大写。 |
casefold() | 把字符串转换为小写。 |
center() | 返回居中的字符串。 |
count() | 返回指定值在字符串中出现的次数。 |
encode() | 返回字符串的编码版本。 |
endswith() | 如果字符串以指定值结尾,则返回 true。 |
expandtabs() | 设置字符串的 tab 尺寸。 |
find() | 在字符串中搜索指定的值并返回它被找到的位置。 |
format() | 格式化字符串中的指定值。 |
format_map() | 格式化字符串中的指定值。 |
index() | 在字符串中搜索指定的值并返回它被找到的位置。 |
isalnum() | 如果字符串中的所有字符都是字母数字,则返回 True。 |
isalpha() | 如果字符串中的所有字符都在字母表中,则返回 True。 |
isdecimal() | 如果字符串中的所有字符都是小数,则返回 True。 |
isdigit() | 如果字符串中的所有字符都是数字,则返回 True。 |
isidentifier() | 如果字符串是标识符,则返回 True。 |
islower() | 如果字符串中的所有字符都是小写,则返回 True。 |
isnumeric() | 如果字符串中的所有字符都是数,则返回 True。 |
isprintable() | 如果字符串中的所有字符都是可打印的,则返回 True。 |
isspace() | 如果字符串中的所有字符都是空白字符,则返回 True。 |
istitle() | 如果字符串遵循标题规则,则返回 True。 |
isupper() | 如果字符串中的所有字符都是大写,则返回 True。 |
join() | 把可迭代对象的元素连接到字符串的末尾。 |
ljust() | 返回字符串的左对齐版本。 |
lower() | 把字符串转换为小写。 |
lstrip() | 返回字符串的左修剪版本。 |
maketrans() | 返回在转换中使用的转换表。 |
partition() | 返回元组,其中的字符串被分为三部分。 |
replace() | 返回字符串,其中指定的值被替换为指定的值。 |
rfind() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rindex() | 在字符串中搜索指定的值,并返回它被找到的最后位置。 |
rjust() | 返回字符串的右对齐版本。 |
rpartition() | 返回元组,其中字符串分为三部分。 |
rsplit() | 在指定的分隔符处拆分字符串,并返回列表。 |
rstrip() | 返回字符串的右边修剪版本。 |
split() | 在指定的分隔符处拆分字符串,并返回列表。 |
splitlines() | 在换行符处拆分字符串并返回列表。 |
startswith() | 如果以指定值开头的字符串,则返回 true。 |
strip() | 返回字符串的剪裁版本。 |
swapcase() | 切换大小写,小写成为大写,反之亦然。 |
title() | 把每个单词的首字符转换为大写。 |
translate() | 返回被转换的字符串。 |
upper() | 把字符串转换为大写。 |
zfill() | 在字符串的开头填充指定数量的 0 值。 |
二 python运算符
- 算术运算符
1
2
3
4
5
6
7
8
9
10a = 10
b = 3
print(a + b) # 13 加法
print(a - b) # 7 减法
print(a * b) # 30 乘法
print(a / b) # 3.333... 除法
print(a // b) # 3 整除
print(a % b) # 1 取模
print(a ** b) # 1000 幂运算 - 赋值运算符
1
2
3
4
5a = 5
a += 2 # 等同于 a = a + 2 → 7
a -= 1 # 6
a *= 3 # 18
a /= 2 # 9.0 - 比较运算符
1
2
3
4
5
6print(a == b) # 等于
print(a != b) # 不等于
print(a > b) # 大于
print(a < b) # 小于
print(a >= b) # 大于等于
print(a <= b) # 小于等于 - 逻辑运算符
1
2
3
4
5x = True
y = False
print(x and y) # False 与
print(x or y) # True 或
print(not x) # False 非 - 成员运算符
1
2
3pytcolors = ['red', 'green', 'blue']
print('red' in colors) # True
print('yellow' not in colors) # True - 身份运算符
1
2
3
4
5
6
7
8a = [1, 2, 3]
b = a # b引用同一个列表对象
c = [1, 2, 3] # c创建了一个新列表对象
print(a == b) # True - 值相同
print(a is b) # True - 是同一个对象
print(a == c) # True - 值相同
print(a is c) # False - 不是同一个对象 - 位运算符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29& 两个位都为1时,结果才为1
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
print(a & b) # 12 = 0000 1100
| 两个位有一个为1时,结果就为1
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
print(a | b) # 61 = 0011 1101
^ 个位不同时结果为1,相同时为0
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
print(a ^ b) # 49 = 0011 0001
~ 所有位取反(包括符号位)
a = 60 # 60 = 0011 1100
print(~a) # -61 = 1100 0011
<< 所有位向左移动,右侧补0
a = 5 # 5 = 0000 0101
print(a << 1) # 10 = 0000 1010
print(a << 2) # 20 = 0001 0100
>> 所有位向右移动,左侧补符号位
a = 10 # 10 = 0000 1010
b = -10 # -10 = 1111 0110 (补码表示)
print(a >> 1) # 5 = 0000 0101
print(b >> 1) # -5 = 1111 1011
三python集合数据类型
Python 编程语言中有四种集合数据类型:
列表(List)是一种有序和可更改的集合。允许重复的成员。
元组(Tuple)是一种有序且不可更改的集合。允许重复的成员。
集合(Set)是一个无序和无索引的集合。没有重复的成员。
词典(Dictionary)是一个无序,可变和有索引的集合。没有重复的成员。
1 | # 创建列表 |
1 | # 创建元组(不可变) |
1 | # 创建集合(无序且不重复) |
1 | # 创建字典 |
四条件语句
1 | # if语句 |
五循环语句
- while循环
只要条件为真,就可以执行一组语句。
break 语句,即使 while 条件为真,也可以停止循环:
如果使用 continue 语句,我们可以停止当前的迭代,并继续下一个:
通过使用 else 语句,当条件不再成立时,我们可以运行一次代码块1
2
3
4
5
6
7# while循环
count = 0
while count < 5:
print(count)
count += 1
else:
print("循环结束") - for 循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14# for循环
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
print(fruit)
# 使用range
for i in range(5): # 0到4
print(i)
for i in range(2, 6): # 2到5
print(i)
for i in range(1, 10, 2): # 1开始,步长为2,到9
print(i)
六函数
在 Python 中,使用 def 关键字定义函数:
1 | def my_function(): |
七 匿名函数
python 使用 lambda 来创建匿名函数
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
基本语法
1 | lambda [arg1 [,arg2,.....argn]]:expression |
八 类和对象
1 | 创建类 |
封装
将复杂的流程包起来,内部处理,让使用者只需要通过简单的操作步骤,就能实现。指的是隐藏对象中一些不希望外界所访问到的属性或者方法
- 隐藏属性:只允许在类的内部使用
在属性名或者方法名前加两个下划线1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class person:
name="jame"
__age=28
p=person()
print(p.name)
print(p.age)
此时会报错。age是隐藏属性
第一种访问方法
此时age名称其实被改为 _person__age
print(p._person__age) #此时即可访问
第二种访问方法:内部访问
class person:
name="jame"
__age=28
def age(self):
person.__age=18
print(f"{person.name}的年龄为{person.__age}")
p=person()
print(p.name)
p.age() - 私有属性
单下划线开头,外部可使用,但是通过import from 无法导入
九继承
继承允许我们定义继承另一个类的所有方法和属性的类。
父类是继承的类,也称为基类。
子类是从另一个类继承的类,也称为派生类。
9.1创建父类
1 | class person: |
9.2创建子类
1 | class Person: |
9.3单继承
1 | class Father: |
9.4方法的重写(在子类定义与父类相同名称的方法)
1 | class Father: |
9.5多继承
多个父类具有同名属性,遵循就近原则
1 | class Father: |
9.6多态
同一种行为具有不同的表现形式
- 继承
- 重写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Animal:
"""父类"""
def shout(self):
print("动物会叫")
class Cat(Animal):
"""子类 猫"""
def shout(self):
print("喵喵")
class Dog(Animal):
def shout(self):
print("汪汪汪")
cat=Cat()
cat.shout()
dog=Dog()
dog.shout() - 多态性:一种调用方式,不同的执行结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class Animal(object):
"""父类"""
def eat(self):
print("动物会吃")
class Pig(Animal):
"""子类 猪"""
def eat(self):
print("猪吃饲料")
class Dog(Animal):
def eat(self):
print("狗吃狗粮")
def text(obj): #obj形参
obj.eat()
animal=Animal()
pig=Pig()
dog=Dog()
text(animal)
text(pig)
text(pig)9.7静态方法 / 类方法
静态方法没有self,cls参数限制
静态方法不能访问实例属性1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Person(object):
#静态方法
def study(name):
print(f"{name}会学习")
Person.study("张三")
p=Person()
p.study("张三")
类方法不能访问到实例属性
# 使用@classmethod标识为类方法。
# 第一个参数必须是类对象
class Person(object):
def sleep(cls):
print("睡觉")
print(cls) # 类对象本身
Person.sleep()
十单例模式和魔法方法
10.1 init()和 new()
- init():
初始化对象 - new():
new(): object基类体提供的内置的静态的方法 —创建对象
作用1:再内存中为对象分配空间,2,返回对象的引用
10.2单例模式
优点:可以节省内存空间
弊端:多线程访问的时容易引发多线程安全问题
10.2.1方式
1通过@classmethod
2通过装饰器实现
3通过重写new()实现
设计流程
- 定义一个类属性,初始值为None
- 重写new()方法
- 进行判断,如果属性是None,把new()对象返回的对象引用保存进去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26class A(object):
pass
a1=A()
a2=A()
print(a1)
print(a2)
# 内存地址
# <__main__.A object at 0x000002AC75A3B9D0>
# <__main__.A object at 0x000002AC75A39DE0>
此时内存地址不同
#单例模式对象的内存地址都一样,只有一个对象
class sing(object):
obj=None
def __new__(cls, *args, **kwargs):
print("我new属性")
if cls.obj==None:
cls.obj=super().__new__(cls)
return cls.obj
def __init__(self):
print("我是__init__()")
s=sing()
print(s)
s1=sing()
print(s1)
此时内存地址都是同一个4返回类属性中记录的对象引用。
5通过导入模块实现
十一迭代器
列表、元组、字典和集合都是可迭代的对象。它们是可迭代的容器,您可以从中获取迭代器(Iterator)。
所有这些对象都有用于获取迭代器的 iter() 方法:
- 从元组返回一个迭代器,并打印每个值:
1
2
3
4
5
6
7
8
9
10
11mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
for 循环实际上创建了一个迭代器对象,并为每个循环执行 next() 方法。
mystr = "banana"
for x in mystr:
print(x)创建迭代器
要把对象/类创建为迭代器,必须为对象实现 iter() 和 next() 方法。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22class Mymunber:
def __iter__(self):
self.a=1
return self
def __next__(self):
x=self.a
self.a+=1
return x
myclass=Mymunber()
it=iter(myclass)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
输出
1
2
3
4
5十二 生成器
生成器表达式
生成器函数
python中使用了yield关键字的函数就称之为生成器函数 - yield的作用
类似return 将指定值或者多个值返回给调用者
yield语句一次返回一个结果,再每个结果中间,挂其函数,执行next()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31def gen():
print("开始了")
yield "a"
yield 'b'
g=gen()
print(next(g))
print(next(g))
# print(next(g))
# print(next(g))
def gen(n):
li=[]
# for i in range(n):
# li.append(i)
a=0
while a<n:
li.append(a)
a+=1
print(li)
gen(7)
def gen(n):
li=[]
a=0
while a<n:
li.append(a)
# print(a)
yield a
# print(a)
a+=1
print(li)
for i in gen(5):
print(i)十三线程
多线程
线程:是cpu调度的基本单位,每一个进程至少会有一个线程
进程:是操作系统进行资源分配的基本单位1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41import time
import threading
# target: 执行的任务 没有小括号
# args: 以元组的形式传参
# kwarfs: 以字典的形式给任务传参
def sing(name):
print(f"{name}唱歌")
time.sleep(2)
print("唱完了")
def dance(name2):
print(f"{name2}跳舞")
time.sleep(2)
print("跳完了")
# 主程序入口
if __name__=='__main__':
#创建子线程
t1=threading.Thread(target=sing,args=("张三",)) #以元组形式传参,只有一个元素后面加逗号
t2=threading.Thread(target=dance,args=("李四",))
# print(t1)
# 守护线程 主线程执行结束,子线程也会跟着结束
t1.daemon=True
t2.daemon=True
#开启子线程
t1.start()
t2.start()
# 阻塞主线程join():暂停的作用,等子线程执行结束后,主线程才会继续执行
t1.join()
t2.join()
# 获取线程名字
print(t1.name)
print(t2.name)
#更改线程名
t1.name="子线程一"
t2.name="子线程二"
print(t1.name)
print(t2.name)
print("表演结束")多线程的特点
- 多线程之间执行是无序的
- 线程之间资源共享
- 资源竞争
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29# 1 线程阻塞
# 2 互斥锁
a=0
b=1000000
lock=threading.Lock()
def add():
lock.acquire() # 加锁
for i in range(b):
global a
a=a+1
print("第一次:",a)
lock.release() #解锁
def add2():
lock.acquire()
for i in range(b):
global a
a=a+1
print("第二次:",a)
lock.release()
# add()
# add2()
if __name__=='__main__':
first=threading.Thread(target=add)
second=threading.Thread(target=add2)
first.start()
# first.join()
second.start()十四进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43# 进程不共享全局变量
# multiprocessing模块提供了process类代表进程对象
# process参数
# 1. target:执行任务目标名
# 2. args:以元组形式传参
# 3. kwargs:以字典形式传参
# 方法
# 1. start()
# 2. is alive() 判断进程是否存活
# 3. join() 主进程等待子进程执行结束
# 属性
# 1. name: 当前进程的别名
# 2. pid: 当前进程编号
def sing():
print("子进程编号",os.getpid(),"父进程",os.getppid())
print("唱歌")
def dance():
print("子进程编号", os.getpid(), "父进程", os.getppid())
print("跳舞")
if __name__=='__main__':
p1=multiprocessing.Process(target=sing,name="子进程1")
p2=multiprocessing.Process(target=dance,name="子进程2")
# 开启
p1.start()
p2.start()
print(p1.name)
print(p2.name)
print(p1.pid)
print(p2.pid)
print("主进程编号",os.getpid(),"主进程的父进程:",os.getppid())
"""
子进程1
子进程2
42116
39392
主进程编号 11908 主进程的父进程: 40648
子进程编号 42116 父进程 11908
唱歌
子进程编号 39392 父进程 11908
跳舞
"""进程间的通信
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41put():放入数据
get():取出数据
empty():判断队列是否为空
qsize():返回当前队列包含的消息
full():判断队列是否满了
# from queue import Queue
# 初始化一个队列
from multiprocessing import Process,Queue
# from queue import Queue
# 初始化一个队列
# q=Queue() #最多可接受3条消息
# q.put("123")
# q.put("456")
# q.put("789")
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.empty())
li=["张三","李四"]
def wdate(q):
for i in range(5):
print(f"{i}已经放入")
q.put(i)
print("写入的数据",li)
def rdate(q):
while True:
if q.empty():
break
else:
print("取出数据",q.get())
# print("读取的数据",li)
if __name__=='__main__':
q=Queue()
p1=Process(target=wdate,args=(q,))
p2 = Process(target=rdate,args=(q,))
p1.start()
p1.join()
p2.start()
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果