60 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Generators | |||
|  | localeTitle: Geradores | |||
|  | --- | |||
|  | ## Geradores
 | |||
|  | 
 | |||
|  | Geradores são um tipo especial de função que permite retornar valores sem finalizar uma função. Isso é feito usando a palavra-chave `yield` . Semelhante ao `return` , a expressão de `yield` retornará um valor para o chamador. A principal diferença entre os dois é que o `yield` suspenderá a função, permitindo que mais valores sejam retornados no futuro. | |||
|  | 
 | |||
|  | Os geradores são iteráveis para que possam ser usados de forma limpa com loops forícios ou qualquer outra coisa que seja iterada. | |||
|  | 
 | |||
|  | ```python | |||
|  | def my_generator():  | |||
|  |     yield 'hello'  | |||
|  |     yield 'world'  | |||
|  |     yield '!'  | |||
|  |   | |||
|  |  for item in my_generator():  | |||
|  |     print(item)  | |||
|  |   | |||
|  |  # output:  | |||
|  |  # hello  | |||
|  |  # world  | |||
|  |  # !  | |||
|  | ``` | |||
|  | 
 | |||
|  | Como outros iteradores, os geradores podem ser passados para a `next` função para recuperar o próximo item. Quando um gerador não tem mais valores para gerar, um erro `StopIteration` é gerado. | |||
|  | 
 | |||
|  | ```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  | |||
|  | ``` | |||
|  | 
 | |||
|  | Os geradores são particularmente úteis quando você precisa criar um grande conjunto de valores, mas não precisa mantê-los todos na memória ao mesmo tempo. Por exemplo, se você precisar imprimir o primeiro milhão de números de fibonacci, você normalmente retornaria uma lista de um milhão de valores e iteraria na lista para imprimir cada valor. No entanto, com um gerador, você pode retornar um valor de cada vez: | |||
|  | 
 | |||
|  | ```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)  | |||
|  | ``` | |||
|  | 
 | |||
|  | ### Mais Informações
 | |||
|  | 
 | |||
|  | *   [PEP 255](https://www.python.org/dev/peps/pep-0255/) | |||
|  | *   [Wiki Python](https://wiki.python.org/moin/Generators) | |||
|  | *   [Documentação da declaração de rendimento](https://docs.python.org/2/reference/simple_stmts.html#yield) |