Python基础——yield的使用与解释

要了解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 ('下', '中', '上')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值