Compreensões e geradores

Transformações e filtros em compreensões, percursos aninhados e consumo de iteradores.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Compreensões

[expressao for x in xs if condicao] percorre, filtra e transforma os valores aceites, construindo uma lista nova.

xs = [-2, 0, 3, 4]
print([x * x for x in xs if x > 0])  # [9, 16]
print(["par" if x % 2 == 0 else "ímpar" for x in range(4)])
# ['par', 'ímpar', 'par', 'ímpar']
  • O if final filtra entradas; a if condicao else b escolhe um resultado por entrada e não reduz o número de posições.
  • Os for seguem a ordem dos ciclos: [x for linha in matriz for x in linha] percorre cada linha e os seus valores. Aplana apenas um nível.
  • {expressao for x in xs} cria um conjunto sem repetidos; {chave: valor for x in xs} cria um dicionário, conservando o último valor para cada chave repetida.
  • Criar uma lista exterior nova não impede efeitos: [linha.append(9) for linha in xs] altera as linhas e produz valores None. Usa um ciclo para efeitos; uma compreensão para calcular resultados.

Pares e intervalos

  • for i in range(n) seguido de for j in range(i + 1, n) visita cada par de posições uma vez, sem pares de uma posição consigo própria.
  • Reservas semiabertas [a,b[[a,b[ e [c,d[[c,d[, com a < b e c < d, conflituam quando max(a, c) < min(b, d). Se apenas se tocam no extremo, não há conflito. Intervalos fechados exigem outra condição.

Iteráveis e iteradores

  • Um iterável permite obter um percurso; listas e strings são exemplos.
  • Um iterador conserva a posição desse percurso: iter(xs) cria-o, next(it) pede o próximo valor.
  • Ao esgotar, lança StopIteration, que for trata para terminar.
  • Uma lista permite novos percursos; um iterador esgotado não reinicia. map, filter e geradores consomem-se desta forma.

Geradores e yield

Uma expressão (expressao for x in xs) cria um gerador, que produz os resultados a pedido em vez de guardar logo uma lista.

Observar suspensão e consumo
def contagem(n):
    while n > 0:
        yield n
        n -= 1

g = contagem(3)
print(next(g))
print(list(g))
print(list(g))
Resultado

Executa o código para ver a saída e os gráficos.

A saída é 3, [2, 1] e [].

  • Chamar contagem(3) cria o gerador; o corpo começa no primeiro pedido.
  • yield entrega um valor e suspende, conservando nomes e ponto de execução; o pedido seguinte retoma com n -= 1.
  • return termina, sem produzir outro valor.

Para gerar intervalos inteiros inclusivos:

  1. Percorre cada (inicio, fim) com range(inicio, fim + 1) e usa yield valor.
  2. Exige inicio <= fim; conserva a ordem e as repetições da entrada.
  3. Uma lista de intervalos vazia não produz valores; um intervalo de um só valor produz-o uma vez.

Lista ou gerador

NecessidadeEscolha
Índices ou vários percursos sem recalcularLista com resultados guardados
Consumir uma vez, valor a valorGerador, evitando a lista intermédia

sum(x * x for x in range(4)) dá 14.

  • Se guardares esse gerador, a segunda soma dá zero porque já foi consumido; criar outro repete o cálculo.
  • Produção adiada pode reduzir memória, mas não elimina o trabalho de transformar todos os valores consumidos.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.