在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor)。
一、迭代器(iterator)
在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器
迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发 StopIteration。任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且 捕捉StopIteration异常来确定何时离开。
使用迭代器一个显而易见的好处就是:每次只从对象中读取一条数据,不会造成内存的过大开销。
比如要逐行读取一个文件的内容,利用readlines()方法,我们可以这么写:
for line in open("test.txt").readlines(): print line
这样虽然可以工作,但不是最好的方法。因为他实际上是把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了。
利用file的迭代器,我们可以这样写:
for line in open("test.txt"): #use file iterators print line
这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行。
二、生成器(constructor)
生成器函数在Python中与迭代器协议的概念联系在一起。简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。函数也许会有个return语句,但它的作用是用来yield产生值的。
不像一般的函数会生成值后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效
>>> def g(n): ... for i in range(n): ... yield i **2 ... >>> for i in g(5): ... print i,":", ... 0 : 1 : 4 : 9 : 16 :
要了解他的运行原理,我们来用next方法看看:
>>> t = g(5) >>> t.next() 0 >>> t.next() 1 >>> t.next() 4 >>> t.next() 9 >>> t.next() 16 >>> t.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
在运行完5次next之后,生成器抛出了一个StopIteration异常,迭代终止。
再来看一个yield的例子,用生成器生成一个Fibonacci数列:
def fab(max): a,b = 0,1 while a < max: yield a a, b = b, a+b >>> for i in fab(20): ... print i,",", ... 0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 ,
看到这里应该就能理解生成器那个很抽象的概念了吧~~
相关推荐
在Python编程语言中,`yield`关键字是一种特殊的功能,它被用于创建生成器(generator)。生成器是一种特殊的迭代器,可以动态地生成值,而无需一次性加载所有数据。这种特性在处理大量数据或无限序列时非常有用,...
Python中的`yield`关键字是其语法的一大特色,它在生成器(Generator)中扮演着核心角色。生成器是一种特殊的迭代器,它允许我们定义一个函数,该函数可以在执行过程中暂停并保存状态,以便下次调用时能从暂停的地方...
在Python编程语言中,`yield`关键字是用来创建生成器(generator)的重要工具,它与`return`类似但有所不同。生成器是一种特殊的迭代器,能够节省内存资源,因为它们不一次性生成所有值,而是按需生成。这篇文档主要...
### Python中`yield`的关键概念与使用详解 #### 前言 在Python编程语言中,`yield`关键字提供了一种高效且灵活的方式来处理大型数据集或无限序列,尤其是在涉及迭代器、生成器等概念时更为突出。本文将详细介绍`...
# Python中的`yield`用法详解 ## 一、引言 在Python编程语言中,`yield`关键字是一个非常强大的特性,它使我们能够轻松地创建生成器(generators)。生成器是一种特殊的迭代器,可以让你在一个函数执行过程中保存...
在Python编程语言中,`yield`关键字是一个非常特殊的功能,它在函数中使用时将该函数转换为一个生成器(generator)。生成器是一种特殊的迭代器,它可以动态地生成值,而不是一次性生成所有值。理解`yield`的作用...
通过Python库`ffmpeg_progress_yield`,开发者可以更容易地在Python程序中集成FFmpeg的功能,而无需直接处理复杂的命令行参数。 该库的核心功能可能包括: 1. **进度反馈**:`ffmpeg_progress_yield`可能提供一种...
在Python中,`yield`函数是生成器(generator)的核心组成部分,它允许函数成为一个可迭代的对象,而不是一次性返回所有结果。生成器是一种特殊的迭代器,它们不会立即计算所有的值,而是根据需要在运行时逐个生成。...
接触python,yield就有点难度啦、都知道包含这个yield的函数就不是普通函数啦。就是一个生成器函数。 类型: 白话,他跟return的区别就是。他会为用户保留一个断点。return,程序执行一次之后,就会一切重新开始。...
Python中的`yield`关键字是用来创建生成器(generator)的关键,生成器是一种特殊的迭代器,它在执行过程中可以记住上次离开的状态,以便下次迭代时能够接着上次的状态继续执行。这种特性使得生成器在处理大量数据...
您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念。 如何生成斐波那契數列 斐波那契(Fibonacci)數...
今天在看其他同事的代码时,发现一个没使用过的python关键字 :yield 先问了一下同事,听他说了几句,有个模糊的印象,仅仅是模糊而已。于是自己去搜搜资料看。看了半天,逐渐清晰了。不过在工作机制以及应用上...
在Python编程语言中,`yield`关键字是一个非常重要的特性,它与生成器(generators)紧密相关,而生成器又是一种特殊的迭代器(iterables)。理解`yield`的工作原理对于高效地处理大量数据和节省内存资源至关重要。 ...
在Python编程语言中,`yield`关键字扮演着非常特殊的角色,它是生成器(generators)的核心组成部分。生成器是Python中一种高效的迭代器实现方式,它们允许开发者在内存中逐个产生值,而不是一次性生成所有值,从而...
Python中的`yield`关键字是用来创建生成器(generator)的关键元素,生成器是一种特殊的迭代器,它们允许我们在需要时逐个生成结果,而不是一次性生成所有结果,从而节省内存资源,尤其适用于处理大量数据或无限序列...
为了理解yield是什么,首先要明白生成器(generator)是什么,在讲生成器之前先说说迭代器(iterator),当创建一个列表(list)时,你可以逐个的读取每一项,这就叫做迭代(iteration)。 >>> mylist = [1, 2, 3] >>> ...
yield在python中初学时,觉得比较难理解。yield的作用: ①返回一个值、②接收调用者的参数 分析下面的代码: #!/usr/bin/env python3 # -*- coding:utf-8 -*- def consumer(): r = '' while True: n = yield r ...