1. 生成器本身是迭代器 1.写迭代器的方式 1.生成器函数 2.生成器表达式 3.各种推导式 2.生成器函数 函数内部有yield, yield返回->return yield把函数分段进行 生成器可以使用for循环来获得里面的元素 def func yield g=func() 1.此时g并不是函数执行,而是获得一个生成器 生成器本身是迭代器,所以再用_next_方法去里面一个一个的取. 取到yield,当yield取完,没有yield的时候,会跑出StopIteration 2.send()的用法和yield基本一致,就是send还有一个额外的功能,给上一个yield传值 而且传值会发生在取值之前,send不能给最后一个yield传值,也不能在第一次执行生成器的时候使用
3. 生成器表达式:基本上和推导式表达式一样,就是括号不一样而已 1.形式g=(结果 for循环 if条件) 2.特点: 1.省内存 2.惰性机制,只能手动一个一个的取 3.只能向前 4.各种推导式 1.列表推导式[结果 for循环 if条件] 2.字典推导式{key:value for循环 if条件} 3.集合推导式{key for循环 if条件} 5.生成器表达式和列表推导式的区别 1.列表推导式一次性加载,比较耗内存,生成器表达式几乎不占内存,只有在使用的时候才分配 使用内存(惰性机制) 2.结果不一样,列表推导式的结果是列表,生成器表达式的结果是生成器 6.yield from 把可迭代对象中每一项数据作为生成器结果返回