yield:生成器
任何使用yield的函数都称之为生成器,如:
def count(n): while n > 0: yield n #生成值:n n -= 1
另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解生成器就是一个迭代器。
使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用next()方法返回序列值。
c = count(5) c.next() >>> 5 c.next() >>>4
生成器函数只有在调用next()方法的时候才开始执行函数里面的语句,比如:
def count(n): print "cunting" while n > 0: yield n #生成值:n n -= 1
在调用count函数时:c=count(5),并不会打印"counting"只有等到调用c.next()时才真正执行里面的语句。每次调用next()方法时,count函数会运行到语句yield n
处为止,next()的返回值就是生成值n
,再次调用next()方法时,函数继续执行yield之后的语句(熟悉Java的朋友肯定知道Thread.yield()方法,作用是暂停当前线程的运行,让其他线程执行),如:
def count(n): print "cunting" while n > 0: print 'before yield' yield n #生成值:n n -= 1 print 'after yield'
上述代码在第一次调用next方法时,并不会打印"after yield"。如果一直调用next方法,当执行到没有可迭代的值后,程序就会报错:
Traceback (most recent call last): File "", line 1, in StopIteration
所以一般不会手动的调用next方法,而使用for循环:
for i in count(5): print i,
实例: 用yield生成器模拟Linux中命令:tail -f | grep python
用于查找监控日志文件中出现有python字样的行。
import time def tail(f): f.seek(0,2)#移动到文件EOF,参考:[seek](http://docs.python.org/2/library/stdtypes.html?highlight=file#file.seek) while True: line = f.readline() #读取文件中新的文本行 if not line: time.sleep(0.1) continue yield line def grep(lines,searchtext): for line in lines: if searchtext in line: yield line
调用:
flog = tail(open('warn.log')) pylines = grep(flog,'python') for line in pylines: print line,
用yield实现斐波那契数列:
def fibonacci(): a=b=1 yield a yield b while True: a,b = b,a+b yield b
调用:
for num in fibonacci(): if num > 100: break print num,
yield中return的作用:
作为生成器,因为每次迭代就会返回一个值,所以不能显示的在生成器函数中return 某个值,包括None值也不行,否则会抛出“SyntaxError”的异常,但是在函数中可以出现单独的return,表示结束该语句。
通过固定长度的缓冲区不断读文件,防止一次性读取出现内存溢出的例子:
def read_file(path): size = 1024 with open(path,'r') as f: while True: block = f.read(SIZE) if block: yield block else: return
如果是在函数中return 具体某个值,就直接抛异常了
>>> def test_return(): ... yield 4 ... return 0 ... File "<stdin>", line 3 SyntaxError: 'return' with argument inside generator
与yield有关的一个很重要的概念叫**协程**,下次好好研究研究。
参考:
http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
《Python 参考手册》
相关推荐
总结来说,Python的`yield`关键字和生成器提供了一种高效、内存友好的迭代方式,特别适用于处理大量数据流。与`return`相比,`yield`的优势在于它可以保存函数状态并在后续调用中恢复执行,这在需要分步处理或延迟...
在Python编程语言中,`yield`关键字是用来创建生成器(generator)的重要工具,它与`return`类似但有所不同。生成器是一种特殊的迭代器,能够节省内存资源,因为它们不一次性生成所有值,而是按需生成。这篇文档主要...
Python中的`yield`关键字是用来创建生成器(generator)的关键元素,生成器是一种特殊的迭代器,它们允许我们在需要时逐个生成结果,而不是一次性生成所有结果,从而节省内存资源,尤其适用于处理大量数据或无限序列...
在Python编程语言中,参数生成器是一种非常实用的工具,特别是在处理大量数据或者需要动态生成参数的场景下。参数生成器通常通过生成器函数来实现,这种函数在执行时不会一次性生成所有结果,而是每次调用`yield`...
任何使用yield的函数都称之为生成器,如: def count(n): while n > 0: yield n #生成值:n n -= 1 另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解...
Python中的列表生成式和列表生成器是两种不同的数据生成方式,它们在处理大量数据时具有重要的作用,特别是在节省内存资源方面。列表生成式简洁高效,而列表生成器则更加节省内存,适合处理大数据集。 **列表生成式...
您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield 的概念。 如何生成斐波那契數列 斐波那契(Fibonacci)數...
- 而使用yield生成器,它不会一次性把所有值计算出来,而是按需生成,即每次产生一个值,并且返回,直到没有更多值产生。这种方式可以显著减少内存的消耗。 3. yield的实现方式和使用示例: ```python def test(n):...
生成器是Python中处理迭代数据的强大工具。它们提供了一种高效的方式来逐个产生值,而不是一次性生成所有值。通过本文的介绍,你应该对如何在Python中使用生成器有了更深入的理解。掌握生成器的使用,将有助于你编写...
在Python编程语言中,`yield`关键字是一个非常强大的特性,它使我们能够轻松地创建生成器(generators)。生成器是一种特殊的迭代器,可以让你在一个函数执行过程中保存当前的状态,并在下一次调用时恢复到之前的...
在Python编程语言中,生成器(Generator)是一种特殊的迭代器,它通过`yield`语句实现,能够让我们在运行时动态地生成序列,而无需一次性将所有数据存储在内存中。这种方式大大节省了内存资源,尤其对于处理大量数据...
但是有一些话题,大多数学生只有很少,或者完全没有任何接触,尤其是“生成器和yield关键字”。我猜这对大多数新手Python程序员也是如此。 有事实表明,在我花了大功夫后,有些人仍然不能理解生成器和yield关键字。...
Python生成器是Python编程语言中的一个强大特性,它允许开发者创建迭代器,而无需显式地定义`__iter__`和`__next__`方法。生成器在内存管理上非常高效,因为它们按需生成值,而不是一次性生成所有数据。这在处理大量...
在Python编程语言中,迭代器、生成器、with语句和上下文管理器以及修饰符是四个非常重要的概念,它们在处理数据流和资源管理时起着关键作用。以下是关于这些知识点的详细解释: 1. **迭代器**: - 迭代器是一种...
以上内容详细介绍了Python生成器、迭代、yield关键字以及send()传参的相关知识点,并通过具体的代码示例来说明了它们的使用方法和技巧。通过学习这些内容,可以更加深入地理解Python语言的高级特性,提高编程效率和...
在Python编程中,生成器(generator)和yield表达式是两个非常重要的概念,它们是迭代器协议的实现方式之一,使得程序员能够以更加高效和节省内存的方式处理数据流。 首先,我们来了解迭代器(Iterator)和可迭代...