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/)