生成器:自动实现了迭代器协议(对象必须提供一个next方法,执行改方法要么返回迭代中的下一项,要么就引起一个StopIteration的异常,以终止迭代(只能往后走不能往前进))
第一种形式:idter=(i for i in range(10))
idter为一个生成器,有next()方法,idter.__next__()---------python3 idter.next()----------------python2
第二种形式:
函数中的生成器:
def test():
yield 1
yield 2
yield和return都是返回函数的值,但是yield可以多次返回,只需要用next()方法来实现
生成器的好处
吃饱子问题:
def prduct_baozi():
ret=[]
for i in range(100):
ret.append('包子%s' % i)
return ret
生成器可以保留函数的执行的上一次的状态
生成器总结:
语法上和函数的类似:生成器函数和常规的函数几乎是相同的,他们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return返回一个值
自动实现迭代器协议:对于生成器,python会自动实现迭代器协议,以便于应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next()方法,并且,在没有可以返回的时候,生成器会自动产生StopIteration异常
状态挂起: 生成器使用yield语句返回一个值,yield语句挂起改生成器的状态,保留足够的信息,以便之后从它离开的地方继续执行
优点:生成器的好处是延迟计算,一次返回一个结果也就是说,它不会一次生成所有的结果,这对于大多数的数据处理来说
列表解析:
sum([i for i in range(100000000000000000)]) #占用内存太大,机器容易卡死
生成器表达式:
sum(i for i in range(100000000000) ) #几乎不占内存
优点:生成器还可以有效的提高代码的可读性