Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Como funciona esse tipo de FOR de uma unica linha em python?

Num curso de Regressão Linear aqui da Alura, o professor usou essa notação de FOR:

[ (y_i - y_previsto) ** 2 for y_i, y_previsto in zip(y, previstos) ]

Eu também vi outra versão dessa FOR:

[(y[i] - y_previsto[i]) ** 2 for i in range(len(y))]

Tenho algumas perguntas:

1 - Em Python, como esse tipo de estrutura funciona?

2 - Nesse código, o que esta sendo feito? e em que ordem?

3 - Na primeira versão do código, o que a função ZIP esta fazendo? E o que ela retorna?

4 - y e previstos ambos são arrays, com a mesma quantidade de itens. O resultado desse código então vai sempre retornar um novo array que possui cada um dos os erros(no caso as diferenças) ? Eu entendi corretamente?

5 - Existe alguma diferença de comportamento desse tipo de FOR em uma unica linha para o FOR tradicional do Python?

6 - Também, existe alguma vantagem de utilização desse tipo de FOR em linha? talvez uma vantagem logica ou computacional?

2 respostas
solução!

Olá William, tudo bem com você?

Para facilitar o entendimento, vou dividir cada resposta em segmentos específicos. Assim, será mais claro acompanhar cada parte da explicação.

Como esse tipo de estrutura funciona em Python?

Esse tipo de estrutura é conhecido como list comprehension. É uma maneira concisa e direta de criar listas. A sintaxe básica é [expressão for item in iterável]. Isso significa que você pode aplicar uma expressão a cada item em um iterável, como uma lista, por exemplo, e criar uma nova lista com os resultados.

Exemplo simples de uso:

# Criando uma lista com os quadrados dos números de 0 a 9
quadrados = [x**2 for x in range(10)]
print(quadrados )  # Saída: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

O que está sendo feito nesse código e em que ordem?

[ (y_i - y_previsto) ** 2 for y_i, y_previsto in zip(y, previstos) ]

Esse código acima calcula os quadrados das diferenças entre os valores reais (y_i) e os valores previstos (y_previsto) para cada par de valores correspondentes de y e previstos. Ele itera sobre cada par de valores e calcula o quadrado da diferença entre eles.

A ordem de execução é a seguinte:

  • Para cada par de valores (y_i, y_previsto) nos iteráveis y e previstos, respectivamente.
  • Calcule a diferença entre y_i e y_previsto.
  • Eleve essa diferença ao quadrado.
  • Adicione o resultado à lista resultante.

Na primeira versão do código, o que a função zip está fazendo? E o que ela retorna?

A função zip combina os elementos de dois ou mais iteráveis em tuplas. Cada tupla contém os elementos correspondentes dos iteráveis de entrada.

Exemplo simples de uso:

# Combinando elementos de duas listas em tuplas
numeros = [1, 2, 3]
letras = ['a', 'b', 'c']
combinados = zip(numeros, letras)
print(list(combinados))  # Saída: [(1, 'a'), (2, 'b'), (3, 'c')]

No contexto do código que você apresentou, zip(y, previstos) combina os elementos de y e previstos em tuplas, onde cada tupla contém um par de valores correspondentes de y e previstos em cada iteração.

O resultado desse código sempre retornará um novo array que possui cada um dos erros (no caso as diferenças)?

Sim, isso mesmo. O resultado dessa list comprehension será uma lista que contém o quadrado das diferenças entre cada par de valores correspondentes de y e previstos.

Existe alguma diferença de comportamento desse tipo de FOR em uma única linha para o FOR tradicional do Python?

Em termos de comportamento, não há diferença. A diferença está na sintaxe e na concisão do código. A list comprehension é geralmente mais concisa e legível do que usar um loop for tradicional para criar listas.

Existe alguma vantagem de utilização desse tipo de FOR em linha? Talvez uma vantagem lógica ou computacional?

Sim, existem algumas vantagens:

  • Concisão: Como mencionado anteriormente, as list comprehensions são mais concisas e claras do que os loops for tradicionais, o que pode tornar o código mais fácil de entender e manter.
  • Eficiência: List comprehensions são geralmente mais eficientes em termos de desempenho do que os loops for tradicionais, especialmente para operações simples.
  • Legibilidade: Em muitos casos, uma list comprehension pode expressar a intenção do código de forma mais clara e direta do que um loop for tradicional. Porém nesse ponto, é importante dizer que a legibilidade é subjetiva e pode variar de pessoa para pessoa. Em alguns casos, um loop for tradicional pode ser mais legível, especialmente para iterações mais complexas ou para pessoas menos familiarizadas com a sintaxe das list comprehensions.

Espero ter ajudado e ter me feito claro, William. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Obrigado Rafael por explicar

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software