Python3 基础
已学习的包
1 | from collections import Iterable # 可迭代 |
常用内置函数
1 | abs(-45) # 获取数字的绝对值 |
自动关闭资源-上下文管理器
1 | white open("file name") as f: |
闭包
内部函数调用外部函数变量
注意一:如果内部函数没有调用外部函数变量(包含外部函数局部变量),则无法构成闭包,没有__closure__属性
注意二:如果内部函数局部变量有相同的变量名被赋值,则认为是新建的局部变量,并没有调用外部变量,同样也无法构成闭包。可以通过nonlocal声明该变量为非局部变量解决这个问题
1 | def out_method(a): |
高级特性
切片
1
2
3
4
5
6'''
start: 开始位置,如果为负数则从末尾起算,空则从最左侧起算
end:结束位置,如果为负数则从末尾起算,空则从最右侧结束
step:间隔
'''
list[start:end:step]迭代
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19'''
所有的列表 map set都可以通过for...in...的格式迭代
判断是否可迭代:
from collections import Iterable
print(isinstance(list, Iterable))
列表:
for i in list:
如需获取索引可通过:for i,v in enumerate(list)
map:
默认map迭代的是key,需要同时迭代key和value:map kv: for k,v in map.items():
set:
for i in set:
多值遍历:
for x, y in [(1, 1), (2, 4), (3, 9)]:
'''列表生成式
1
2
3
4
5
6
7
8
9
10
11
12
13'''
格式:[表达式 生成器 条件]
'''
# 举例:
list = [x * x for x in range(1, 11) if x % 2 == 0]
# 嵌套:
list = [m + n for m in 'ABC' for n in 'XYZ']
# dict:
list = [k + '=' + v for k, v in d.items()]
# if else:
list = [x if x % 2 == 0 else -x for x in range(1, 11)]
# 生成 dict:
dict1 = {i * i: i + 1 for i in range(1, 11) if i % 2 == 0}生成器
生成器可以延迟生成数据,可有效防止一次性创建过多数据造成的内存压力
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'''
判断是否是生成器:
from types import GeneratorType
print(isinstance(gene, GeneratorType))
方式一 生成器:
将列表生成式的[]更改为(),如:[x for x in range(0, 10)] -> (x for x in range(0, 10))
g = (x for x in range(0, 10))
即可next(g) 或 for i in g:
方式二 生成器函数:
def frange(start, end, step):
x = start
while x < end:
yield x # 会阻塞在此,直到外部消费了x值,才继续下一步
x += step
f = frange(0, 10, 0.5)
即可next(g) 或 for i in f:
方式三 生成器类
class GeneratorTest():
def __init__(self):
self.i = 0
def __iter__(self):
return self # 因为自身就是生成器,所以返回self
def __next__(self): # 允许next形成生成器
if self.i >= 5:
raise StopIteration()
self.i += 1
return self.i
'''迭代器
1
2
3
4
5
6
7
8from collections import Iterable
from collections import Iterator
'''
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
'''
装饰器
1 | # 无参数装饰器 |
偏函数
当函数的参数个数太多,需要简化时,使用
functools.partial
可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
1 | # 如有大量的字符串需要转换成8进制数值,每次都编写base=8过于繁琐 |
协程
1 | # 手动实现协程 |
类
1 | ''' |
枚举
1 | from enum import Enum,IntEnum,unique |