生成器
生成器的本质就是迭代器
通过函数变成一个生成器
1 def func(): 2 print(1) 3 yield 5 # 我的函数走到这了 4 print(2) 5 yield 9 # 我的函数走到这了 6 7 g = func() # 生成一个生成器 8 9 print(g.__next__()) 10 print(g.__next__()) 11 print(list(range(10000)))
每次遇到yield会返回并标记
下次从yield下面的函数开始运行
一共只有一个生成器
1 def func(): 2 print(1) 3 # return 5 4 yield 5 5 print(func().__next__()) # 这样生成一个生成器 6 print(func().__next__()) # 这样生成一个生成器 7 print(func().__next__()) # 这样生成一个生成器 8 print(func().__next__()) # 这样生成一个生成器 9 print(func().__next__()) # 这样生成一个生成器
遇到yield就返回 再次打印还是从头开始 每次打印都生成一个新的生成器
函数遇到return就结束 遇到yield不结束就挂起
yield作用 挂起 返回值 接受值
生成器一定是一个迭代器 迭代器不一定是生成器
生成器是可以让程序员自己定义的一个迭代器
生成器的好处 可以节省空间
生成器的特性 一次性的 惰性机制 从上到下
send 相当于 next + 传的值 第一次接触生成器时,如果要用send send的值必须是None 一般建议使用__next__
yield from 将可迭代对象元素挨个返回
python2 3x 版本操作区别
python2 iter() next()
python3 iter() next() __next__() __iter__()
推导式
列表推导法 [结果 语法] [ ] 是容器
集合推导法 [结果 语法}
字典推导法 {键:值 语法}
没有元组的推导式
看着像元组的推导式 其实是一个生成器推导式
推导器可以节省代码
推导式不宜太长 可读性差
外部需要容器包一下 里边第一个位置是结果 剩下的是语法 每个间隔用空格隔开