理解 Python3 yield关键字

理解 Python3 yield关键字

本文面向初学Python者解释yield关键字的用法。首先我们需要理解几个关键概念,如迭代器和生成器,然后用一个具体示例来说明如何使用yield。如果你已经知道了这些必要概念,可以跳过直接进入yield部分。

1. 迭代器

集合是一组数据项,集合可以被迭代。迭代即按照某种顺序获取集合中的每个元素。Python中dict,list,set,tuple都是集合。下面看个示例来说明如何迭代一组整数:

import random

def list_of_random(number_of_values):
    res = []
    for _ in range(0, number_of_values):
        # append a random interger to the result
        res.append(random.randint(0, 100))
    return res

for value in list_of_random(10):
    if value > 60:
        # if we foudn a value bigger than 60 print it and exit
        print('Value is {0}'.format(value))
        break

我们迭代list_of_random(10) 函数的执行结果,其返回随机数列表。需要注意的是,list_of_random在被迭代之前需要先生成10个数值。顺便说下,for后面的_是隐式变量,因为并不要使用索引值,所以使用_代替。

2. 生成器

现在我们已经知道了如何迭代集合。假设我们需要迭代list_of_random ,但不是10个数,而是100万或更多,那么我们需要消耗内存存储函数生成100万个整数。利用生成器可以减少内存占用并加快运行速度。因为如果发现一个数大于60则无需创建100万个整数列表。
下面使用生成器实现同样功能,这里需要注意的是,如果在迭代中使用[],则需要先等待创建100万个整数。

import random

for value in (random.randint(0, 100) for _ in range(0, 10000000)):
    if value > 60:
        print('Value is {0}'.format(value))
        break

3. 使用yield示例

我们已经知道了如何使用生成器,yield就像return的替代,但是yield中的函数返回生成器。下面通过示例来看:

import random

def list_of_random(number_of_values):
    for _ in range(0, number_of_values):
        yield random.randint(0, 100)

for value in list_of_random(10):
    if value > 60:
        print('Value is {0}'.format(value))
        break

看下函数list_of_random,并没有往list中增加任何元素,仅仅对每个随机整数使用yield。有时使用()一行代码写完更好。但对于更复杂的函数,则需要在函数中使用yield关键字。

4. 总结

如果Python应用需要消耗大量内存为了集合添加或追加等操作,可以尝试使用yield。当在函数中使用yield关键字时,函数内代码并没有实际执行,而是在使用for…in迭代操作是才执行。使用yield生成器可以实现懒加载,提升应用程序执行效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值