要了解yield的作用,首先需明白什么是生成器(type为generator),在了解生成器之前需要了解什么是可迭代对象(iterables,可迭代序列):
list comprehension
使用list comprehension创建一个list,而list是一种可迭代对象:
>>> for i in [n**2 for n in range(n) if n%2==0]:
print(i)
0
4
16
36
64
任何允许使用for x in seq
处理的seq
都是可迭代对象,当有大量数据并把所有值放到内存中时,这种处理方式可能不是你所需要的(过于浪费内存),也许你需要的正是一个生成器:
generator
>>> g = (n**2 for n in range(10) if n%2==0)
>>> for i in g:
print(i)
0
4
16
36
64
>>> for i in g:
print(g)
>>>
>>>
这和使用list comprehension解析的唯一区别在于实用( )
代替了[ ]
。注意,你不能对一个生成器遍历两次(阅后即焚),每个生成器只能被使用一次,
yield
yield
是一个关键字,类似return,不同之处,yield返回的是一个生成器:
def gen_generator():
for i in range(10):
if i%2==0:
yield i**2
def main():
print(type(gen_generator()))
for i in gen_generator():
print(i)
if __name__=='__main__':
main()
执行结果:
<class 'generator'>
0
4
16
36
64
有用的itertools
我们使用itertools
来仿真田忌赛马的故事:
>>> import iteratools
>>> horses = '上中下'
>>> itertools.permutations(horses)
<itertools.permutations at 0x2d7b180>
>>> for i in itertools.permutations(horses):
print(i)
('上', '中', '下')
('上', '下', '中')
('中', '上', '下')
('中', '下', '上')
('下', '上', '中')
('下', '中', '上')
horses = '上中下'
QiWang, ChuWang = list(itertools.permuations(horses)), list(itertools.permulations(horses))
for x in QiWang, ChuWang:
print(x[0], 'vs', x[1])
结果:
('上', '中', '下') vs ('上', '中', '下')
('上', '中', '下') vs ('上', '下', '中')
('上', '中', '下') vs ('中', '上', '下')
('上', '中', '下') vs ('中', '下', '上')
('上', '中', '下') vs ('下', '上', '中')
('上', '中', '下') vs ('下', '中', '上')
('上', '下', '中') vs ('上', '中', '下')
('上', '下', '中') vs ('上', '下', '中')
('上', '下', '中') vs ('中', '上', '下')
('上', '下', '中') vs ('中', '下', '上')
('上', '下', '中') vs ('下', '上', '中')
('上', '下', '中') vs ('下', '中', '上')
('中', '上', '下') vs ('上', '中', '下')
('中', '上', '下') vs ('上', '下', '中')
('中', '上', '下') vs ('中', '上', '下')
('中', '上', '下') vs ('中', '下', '上')
('中', '上', '下') vs ('下', '上', '中')
('中', '上', '下') vs ('下', '中', '上')
('中', '下', '上') vs ('上', '中', '下')
('中', '下', '上') vs ('上', '下', '中')
('中', '下', '上') vs ('中', '上', '下')
('中', '下', '上') vs ('中', '下', '上')
('中', '下', '上') vs ('下', '上', '中')
('中', '下', '上') vs ('下', '中', '上')
('下', '上', '中') vs ('上', '中', '下')
('下', '上', '中') vs ('上', '下', '中')
('下', '上', '中') vs ('中', '上', '下')
('下', '上', '中') vs ('中', '下', '上')
('下', '上', '中') vs ('下', '上', '中')
('下', '上', '中') vs ('下', '中', '上')
('下', '中', '上') vs ('上', '中', '下')
('下', '中', '上') vs ('上', '下', '中')
('下', '中', '上') vs ('中', '上', '下')
('下', '中', '上') vs ('中', '下', '上')
('下', '中', '上') vs ('下', '上', '中')
('下', '中', '上') vs ('下', '中', '上')