python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python关键字yield

Python关键字yield的使用场景及用法详解

作者:檀越@新空间

在 Python 编程语言中,yield是一个至关重要的关键字,它用于定义生成器函数(generator function),yield的出现使得 Python 能够优雅地实现惰性计算(lazy evaluation),本文给大家详细介绍了Python中关键字yield的使用场景及用法,需要的朋友可以参考下

一、yield 的基本概念

在 Python 编程语言中,yield是一个至关重要的关键字,它用于定义生成器函数(generator function)。与普通函数使用return返回结果不同,生成器函数使用yield产生一个值,同时"冻结"函数的当前状态,使得下次调用时可以从冻结点继续执行。

yield的出现使得 Python 能够优雅地实现惰性计算(lazy evaluation),这种特性在处理大数据集或无限序列时尤为有用。传统函数在返回结果后会释放所有资源并忘记之前的执行状态,而生成器函数则能够记住它的状态,在需要时继续产生下一个值。

二、生成器函数与普通函数的区别

生成器函数与普通函数在定义上非常相似,唯一的区别在于前者使用yield而非return。但这种表面上的微小差异带来了行为上的巨大不同:

例如,比较以下两个函数:

# 普通函数
def squares(n):
    result = []
    for i in range(n):
        result.append(i*i)
    return result

# 生成器函数
def squares_gen(n):
    for i in range(n):
        yield i*i

第一个函数会一次性生成所有平方数并存储在列表中,而第二个函数则会在每次迭代时生成一个平方数,内存效率更高。

三、yield 的工作机制

理解yield的工作机制对于掌握生成器至关重要。当 Python 解释器遇到包含yield语句的函数时,它会将其特殊处理为一个生成器函数。调用生成器函数时,不会立即执行函数体,而是返回一个生成器对象。

生成器对象实现了迭代器协议,即包含__iter__()和__next__()方法。每次调用next()函数或在 for 循环中迭代时,生成器函数会从上次暂停的位置继续执行,直到遇到下一个yield语句,此时yield后的表达式值会被返回给调用者,函数状态再次被冻结。

当函数执行完毕(或遇到 return 语句)时,生成器会抛出StopIteration异常,表示迭代结束。这个异常通常被 for 循环等迭代上下文自动处理。

四、yield 的常见使用场景

def read_large_file(file_path):
    with open(file_path, 'r') as f:
        for line in f:
            yield line.strip()
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
def filter_even(numbers):
    for n in numbers:
        if n % 2 == 0:
            yield n

def square(numbers):
    for n in numbers:
        yield n ** 2

# 使用管道
numbers = range(100)
result = square(filter_even(numbers))

五、yield 的高级用法

除了基本用法外,yield还有一些更高级的应用:

def chain(*iterables):
    for it in iterables:
        yield from it
gen = (x*x for x in range(10))  # 生成器表达式
def accumulator():
    total = 0
    while True:
        value = yield total
        if value is None:
            break
        total += value

六、性能考量

使用生成器可以带来显著的性能优势,特别是在内存使用方面。由于生成器是惰性求值的,它们:

然而,生成器也有一些限制:

以上就是Python中关键字yield的使用场景及用法详解的详细内容,更多关于Python关键字yield的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文