生成器
生成器的本质就是迭代器
通过函数变成一个生成器
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 54 yield 55 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__()
推导式
列表推导法 [结果 语法] [ ] 是容器
集合推导法 [结果 语法}
字典推导法 {键:值 语法}
没有元组的推导式
看着像元组的推导式 其实是一个生成器推导式
推导器可以节省代码
推导式不宜太长 可读性差
外部需要容器包一下 里边第一个位置是结果 剩下的是语法 每个间隔用空格隔开