60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Generators | |||
|  | localeTitle: 发电机 | |||
|  | --- | |||
|  | ## 发电机
 | |||
|  | 
 | |||
|  | 生成器是一种特殊类型的函数,它允许您在不结束函数的情况下返回值。它通过使用`yield`关键字来实现。与`return`类似, `yield`表达式将向调用者返回一个值。两者之间的关键区别在于`yield`将暂停该函数,允许将来返回更多值。 | |||
|  | 
 | |||
|  | 生成器是可迭代的,因此它们可以与for循环或任何其他迭代一起使用。 | |||
|  | 
 | |||
|  | ```python | |||
|  | def my_generator():  | |||
|  |     yield 'hello'  | |||
|  |     yield 'world'  | |||
|  |     yield '!'  | |||
|  |   | |||
|  |  for item in my_generator():  | |||
|  |     print(item)  | |||
|  |   | |||
|  |  # output:  | |||
|  |  # hello  | |||
|  |  # world  | |||
|  |  # !  | |||
|  | ``` | |||
|  | 
 | |||
|  | 与其他迭代器一样,生成器可以传递给`next`函数以检索下一个项目。当生成器没有更多值可以生成时,会引发`StopIteration`错误。 | |||
|  | 
 | |||
|  | ```python | |||
|  | g = my_generator()  | |||
|  |  print(next(g))  | |||
|  |  # 'hello'  | |||
|  |  print(next(g))  | |||
|  |  # 'world'  | |||
|  |  print(next(g))  | |||
|  |  # '!'  | |||
|  |  print(next(g))  | |||
|  |  # Traceback (most recent call last):  | |||
|  |  #   File "<stdin>", line 1, in <module>  | |||
|  |  # StopIteration  | |||
|  | ``` | |||
|  | 
 | |||
|  | 当您需要创建大量值但不需要将它们全部保存在内存中时,生成器特别有用。例如,如果您需要打印第一百万个斐波那契数字,通常会返回一百万个值的列表并迭代列表以打印每个值。但是使用生成器,您可以一次返回一个值: | |||
|  | 
 | |||
|  | ```python | |||
|  | def fib(n):  | |||
|  |     a = 1  | |||
|  |     b = 1  | |||
|  |     for i in range(n):  | |||
|  |         yield a  | |||
|  |         a, b = b, a + b  | |||
|  |   | |||
|  |  for x in fib(1000000):  | |||
|  |     print(x)  | |||
|  | ``` | |||
|  | 
 | |||
|  | ### 更多信息
 | |||
|  | 
 | |||
|  | *   [PEP 255](https://www.python.org/dev/peps/pep-0255/) | |||
|  | *   [Python Wiki](https://wiki.python.org/moin/Generators) | |||
|  | *   [收益表文件](https://docs.python.org/2/reference/simple_stmts.html#yield) |