As **expressões geradoras** em [[Linguagem de programação Python|Python]] são uma forma eficiente de criar iteradores. Elas são sintaticamente semelhantes às [[Compreensão de listas em Python|compreensões de lista]], mas em vez de construir e armazenar uma lista inteira na memória de uma vez, elas geram os elementos "sob demanda" (lazy evaluation). Isso significa que os valores são produzidos apenas quando solicitados, o que é particularmente útil para lidar com grandes conjuntos de dados, pois economiza memória e pode melhorar o desempenho.
# Sintaxe
Uma expressão geradora usa **parênteses `()`** em vez de colchetes `[]` (usados em compreensões de lista) para definir a lógica de geração:
```python
gerador = (expressao for item in iteravel if condicao)
```
# Como Funcionam
Quando uma expressão geradora é executada, ela não retorna uma lista, mas sim um **objeto gerador** (um tipo de iterador). Este objeto pode ser iterado para produzir os valores um por um.
**Exemplo de Criação:**
```python
colors = ['black', 'white']
sizes = ['S', 'M', 'L']
# Cria uma expressão geradora
combinacoes = (f'{c} {s}' for c in colors for s in sizes)
# O resultado é um objeto gerador, não uma lista
# print(combinacoes) # Saída: <generator object <genexpr> at 0x...>
```
# Consumindo uma Expressão Geradora
Para obter os valores de um objeto gerador, você pode:
1. **Usar a função `next()`**: Para obter um valor por vez.
```python
print(next(combinacoes)) # Saída: 'black S'
print(next(combinacoes)) # Saída: 'black M'
# ... e assim por diante até que o gerador se esgote
```
Quando o gerador não tem mais elementos, ele levanta uma exceção `StopIteration`.
2. **Iterar com um loop `for`**: Esta é a forma mais comum e idiomática de consumir geradores.
```python
for item in combinacoes:
print(item)
# Saída:
# black S
# black M
# black L
# white S
# white M
# white L
```
3. **Converter para uma lista (ou outra coleção)**: Embora isso anule o benefício de economia de memória para grandes conjuntos de dados, é possível converter o gerador em uma lista se todos os elementos forem necessários de uma vez.
```python
lista_combinacoes = list(combinacoes)
# print(lista_combinacoes)
# Saída: ['black S', 'black M', 'black L', 'white S', 'white M', 'white L']
```
# Vantagens
* **Eficiência de Memória**: Não armazena todos os resultados na memória, ideal para grandes datasets.
* **Avaliação Preguiçosa**: Os valores são calculados apenas quando são necessários, o que pode economizar tempo de processamento se nem todos os valores forem consumidos.
:: **Referência** :: [PEP 289 – Generator Expressions](https://peps.python.org/pep-0289/)