前段时间在读trac 中wiki模块的源码的时候,发现了很多地方都使用了yiled这一关键词,
感觉是在需要返回某个值的地方通过yield来代替return,
不是很明白其用法,所以仔细研究下。
一个使用了yiled关键字的函数就不再是一个普通的函数了,而是一个生成器函数(generator function),
当函数被调用的时候将返回一个迭代器(iterator)。
所以下面将分别讲解迭代器和生成器这两个概念。
一. 迭代器(Iterator)
写道
迭代器是一个对象,它实现了迭代器协议,
一般需要实现如下两个方法
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身
对于for语言大家可能都不陌生,我们很多时候需要对一些容器对象进行遍历就会使用到for循环:
l=[0,1,2,3,4,5,6]
for i in l:
print i
l是一个type为list的对象,这段for-in代码在运行的时候其实是调用了l的__iter__()函数,返回了一个实现了__next__()或next()(各个版本的python可能不一样,我试验的时候所使用的版本为2.6.2)的迭代器对象,每循环一次就会通过next取下一个元素。
当然我们完全没有必要先把所有的元素都算出来放到一个list里或者其他容器类里进行循环,这样比较浪费空间。
我们可以直接创建自己的一个迭代器。
# -*- coding: utf-8 -*-
'''''Fibonacci iterator'''
class Fib:
'''''一个可以生成Fibonacci 数列的迭代器'''
def __init__(self, max):
self.max = max
def __iter__(self):
self.a = 0
self.b = 1
return self
def next(self):
fib = self.a
if fib > self.max:
raise StopIteration
self.a, self.b = self.b, self.a + self.b
return fib
定义好了这个Fibonacci迭代器,我们就可以来使用它了。
from fibonacci2 import Fib
for n in Fib(1000):
print n
当调用Fib(1000)的时候,将生成一个迭代器对象,每一次循环都将调用一次next取到下一个值。
所以我们可以看出迭代器有一个很核心的东西就是在循环中,迭代器可以记住之前的状态。
二.生成器
前面我们说了,任何使用了yield关键字的函数都不再是普通的函数了,我们还是来看实例吧,这样比较容易理解
def fib(max):
a, b = 0, 1
while a < max:
yield a
a, b = b, a + b
这里简单的几行代码就实现了上面的迭代器类那么一大堆代码所实现的功能
使用的时候和上面很类似:
from fibonacci import fib
for n in fib(1000):
print n
引文fib函数使用了yield所以它是一个生成器函数,当我们调用fib(1000)的时候它其实是返回了一个迭代器,且这个迭代器可以控制生成器函数的运行。
我们通过这个返回的迭代器的动作控制fib这个生成器函数的运行。
每当调用一次迭代器的next函数,生成器函数运行到yield之处,返回yield后面的值且在这个地方暂停,所有的状态都会被保持住,直到下次next函数被调用,或者碰到异常循环退出。
所以生成器的概念还是很简单的。
三.总结
1.for-in语句在底层都是对一个迭代器对象进行操作的
2.使用了yield关键字的函数就是一个生成器函数,被调用的时候生成一个可以控制自己运行的迭代器。
分享到:
相关推荐
另一个文件“iterator.consol.py”很可能包含了一些示例代码,展示了如何在Python交互式环境中使用迭代器,包括创建自定义迭代器类、使用内置的迭代器函数(如`enumerate()`、`zip()`等)以及处理异常。 总的来说,...
此外,生成器是一种特殊的迭代器,它们通过使用`yield`语句在运行时生成值。这使得生成器函数在处理大量数据或无限序列时特别有用,因为它们只在需要时生成下一个值,节省了内存。 总之,Python的迭代和迭代器机制...
Python中的迭代器协议 Python中的迭代器协议是指在Python中实现迭代器的...通过使用Python中的迭代器协议,可以方便地实现可迭代对象的迭代,并且可以自定义迭代器的行为,从而提高了Python程序的可读性和可维护性。
在本课程的"第3章-1 2PYTHON迭代器"中,你将学习到如何创建自定义迭代器,这通常通过定义包含`__iter__()`和`__next__()`方法的类来完成。此外,还可能涉及生成器函数,这是一种特殊的迭代器,它使用`yield`关键字来...
在Python中,你可以使用内置的`iter()`函数将可迭代对象转换为迭代器。以下是一个简单的例子: ```python s = 'ab' it = iter(s) print(it.next()) # 输出 'a' print(it.next()) # 输出 'b' it.next() # 抛出 ...
在Python中,可以使用内置的`iter()`函数创建迭代器对象。例如,对于一个列表,我们可以这样做: ```python list = [1,2,3,4] it = iter(list) # 创建迭代器对象 ``` 接着,通过调用`next()`函数,我们可以依次...
### Python迭代:使用`groupby`进行数据分组与汇总 在Python编程中,迭代是一种常见的操作,尤其在处理大量数据时尤为重要。本文将通过一个具体的示例来讲解如何使用Python标准库中的`itertools.groupby`函数来进行...
总之,在Python中使用`yield`创建生成器是一种非常有效的方法来处理大量数据或需要按需生成数据的情况。通过理解`yield`的工作机制以及如何使用`next()`和`send()`方法,你可以充分利用生成器的优势来提高程序性能。
以上内容详细介绍了Python生成器、迭代、yield关键字以及send()传参的相关知识点,并通过具体的代码示例来说明了它们的使用方法和技巧。通过学习这些内容,可以更加深入地理解Python语言的高级特性,提高编程效率和...
通过使用`yield`,我们可以创建自定义的迭代过程,同时利用`next()`和`send()`来控制生成器的行为。这种机制对于内存敏感的应用场景,如处理大型文件或无限序列,具有显著的优势。为了深入学习Python,可以参考推荐...
### Python迭代器与生成器详解 #### 手动创建迭代器 在Python中,迭代器是一种可以记住遍历位置的对象。一个数据集合类的对象通常可以通过迭代器方式访问其内部每一个项目。迭代器有两种基本的方法:`__iter__()` ...
### Python中`yield`的关键概念与使用详解 #### 前言 在Python编程语言中,`yield`关键字提供了一种高效且灵活的方式来处理大型数据集或无限序列,尤其是在涉及迭代器、生成器等概念时更为突出。本文将详细介绍`...
初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和普通函数不一样,yield 到底用来做什么,为什么要设计 yield ?本文将由浅入深地讲解 yield 的概念和...
在Python编程语言中,`yield`关键字是一种特殊的功能,它被用于创建生成器(generator)。生成器是一种特殊的迭代器,可以动态地生成值,而无需一次性加载所有数据。这种特性在处理大量数据或无限序列时非常有用,...
在Python编程语言中,`yield`关键字主要用于生成器(generator),它允许函数作为一个迭代器,一次生成一个值,而不是一次性生成所有值。这种方式在处理大量数据或需要节省内存时非常有用。本文将深入探讨如何使用`...
Python中的`yield`关键字是其语法的一大特色,它在生成器(Generator)中扮演着核心角色。生成器是一种特殊的迭代器,它允许我们定义一个函数,该函数可以在执行过程中暂停并保存状态,以便下次调用时能从暂停的地方...
迭代器是一种可以记住遍历位置的对象,支持for循环和next()函数,而生成器是一种特殊的迭代器,使用yield语句产生值,支持惰性计算和动态控制迭代过程。文章还提供了迭代器和生成器的示例代码,帮助读者更好地理解和...
在Python中,`yield`函数是生成器(generator)的核心组成部分,它允许函数成为一个可迭代的对象,而不是一次性返回所有结果。生成器是一种特殊的迭代器,它们不会立即计算所有的值,而是根据需要在运行时逐个生成。...