>>> defmy_range(start,stop,step=1): ... print('start...') ... while start < stop: ... yield start ... start+=step ... print('end...') ... >>> g=my_range(0,3) >>> g <generator object my_range at 0x104105678>
1 2 3 4 5 6 7
生成器内置有__iter__和__next__方法,所以生成器本身就是一个迭代器
>>> g.__iter__ <method-wrapper '__iter__' of generator object at 0x1037d2af0> >>> g.__next__ <method-wrapper '__next__' of generator object at 0x1037d2af0>
defeater(): print('ready to eat') whileTrue: food = yield print('get the food: %s, and start to eat' % food)
1 2 3 4 5 6 7 8 9 10 11
可以拿到函数的生成器对象持续为函数体send值:
g = eater() # 得到生成器对象 g >>> <generator object eater at 0x101b6e2b0> next(g) # 需要事先'初始化'一次,让函数挂起在food = yield,等待调用g.send()方法为其传值 >>> ready to eat g.send('包子') >>> get the food: 包子, and start to eat g.send('鸡腿') >>> get the food: 鸡腿, and start to eat
[expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ]
#类似于 res=[] for item1 in iterable1: if condition1: for item2 in iterable2: if condition2 ... for itemN in iterableN: if conditionN: res.append(expression)
1 2 3 4 5 6 7 8
针对下述场景:
egg_list=[] for i inrange(10): egg_list.append('鸡蛋%s' %i) 用列表生成式可以一行解决
# egg_list=['鸡蛋%s' %i for i in range(10)]
生成式表达式
1 2 3 4 5 6 7 8 9 10 11 12 13
创建一个生成器对象有两种方式: 1 调用带yield关键字的函数
2 生成器表达式 ---> 与列表生成式的语法格式相同,只需要将[]换成()即可: (expression for item in iterable if condition) 对比列表生成式返回的是一个列表,生成器表达式返回的是一个生成器对象
>>> [x*x for x inrange(3)] [0, 1, 4] >>> g=(x*x for x inrange(3)) >>> g <generator object <genexpr> at 0x101be0ba0>