生成器
生成器的本质就是迭代器
def func (): print(1) print(9) yield 2 #我的函数走到这了 print(5) yield 6 #我的函数走到这了 p=func()#生成一个生成器 print(p.__iter__()) #生成器内存地址 print(p.__next__()) #调用生成器 print(p.__next__())
range
print([list(range(12))]) #[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]
错误示范
def func(): print(4) yield 2 print(6) print(9) yield 5print(q.__iter__())#这样生成一个生成器 print(q.__next__())#这样生成一个生成器 print(q.__next__())#这样生成一个生成器
大批量数据的时候首先要想到生成器
def func(): print(9) print(7) yield 1 print(5) yield 2 o=func() #生成一个生成器 print(o.__next__()) #调用 print(o.__next__()) #调用
碰到return就结束函数
碰到yield不结束就挂起
生成器的好处就是非常省内存
第一次调用生成器的时候使用send里边的值必须是None
def func(): print(3) print(7) yield 2 print(9) yield 6 p=func() print(p.send(None)) #send后面必须写None print(p.__next__())
附加
def func(): yield 6 yield 9 o=func() ret=o.__next__() print(ret+8) #可在print里面直接添加 print(o.__next__()) # ret = func() # 把生成器的地址给了ret # print('is ret',ret.__next__()) # # 执行ret这个变量的指向的生成器地址 # print('is ret',ret) # # 在全局空间找到一个变量叫做ret的,打印它的值 值就是生成器的地址
用生成器读文件
格式如下:
def func(): with open('xxx文件名','r',encoding='utf-8')as f: for i in f: i=i.strip('\r\n') yield i o=func() for i in range(输入想要读取多少行文件): print(o.__next__())
推导式
列表推导式:
print([i for i in (range)(12)])
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
集合推导式:
print({i for i in range(10)})
结果:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
字典推导式:
print({i:i+1 for i in range(9)})
结果:
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9}
生成器推导式:
创建生成器
o=(i for i in range(10)) print(o)
结果:
<generator object <genexpr> at 0x000002B5C6B02ED0>
生成器的取值
o=(i for i in range(10))
print(o.__next__()) #0
print(o.__next__()) #1
print(o.__next__()) #2
print(o.__next__()) #3
print(o.__next__()) #4
结果:
0
1
2
3
4