Article image
Bruno Silvestre
Bruno Silvestre15/08/2022 17:00
Compartilhe

List-comprehension, o que é e porque usar

  • #Python

E ai família DIO, tudo certo com vocês?

Eu sou o Bruno, sou entusiasta da linguagem Python e decidi passar um pouco de conteúdo aos que estão querendo se aprofundar mais na linguagem.

Dessa vez eu vou trazer pra vocês o conceito de "list comprehension", recurso muito utilizado no python, espero que aproveitem :)

Pré-Requisitos: 

- Básico de Python (iterações e listas)

Suponhamos que você queira montar uma lista com os dados de um coleção, por exemplo você quer adicionar vários quadrados perfeitos a uma lista.

Um método de fazer isso é o abaixo:

quadrados = []				# Declara a variável 'quadrados' como uma lista vazia
for i in range(1, 11): 		# Itera sobre os números de 1 a 10
  quadrados.append(i*i) 	# Adiciona o número ao quadrado na lista
print(quadrados) 			# Imprime a lista no console
=========================
OUTPUT: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Um código bem simples de exemplo, porém mal otimizado.

Toda vez que uma iteração do for é executada, ela invoca o método 'append', que como comentarei mais em outro artigo, é uma operação muito custosa.

Para evitar esse tipo de situação, o python veio como uma solução chamada "list comprehension <3".

Vou reescrever o código acima utilizando esse conceito.

quadrados = [i*i for i in range(1, 11)]
print(quadrados)
=========================
OUTPUT: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Consegue perceber as semelhanças e as diferenças? Em uma simples linha nós iteramos sobre uma coleção (o range - que na verdade é um generator, mas isso é assunto pra outra hora), e adicionamos elementos a uma lista aplicando uma operação. Simples né? Vamos a outro exemplo.

Imagine agora que você deseja adicionar todos os números impares em uma lista (quase o exemplo da capa hehe). Um método de fazer isso é o abaixo:

impares = []				# Declara a variável 'quadrados' como uma lista vazia
for i in range(1, 11):		# Itera sobre os números de 1 a 10
  if i%2 == 1:
      impares.append(i)
print(impares)
=========================
OUTPUT: [1, 3, 5, 7, 9]

Mas e agora, temos uma condição no meio do laço for, como a gente transforma isso em uma linha?

Sem problemas, da pra colocar com um if no list-comprehension também. A sintaxe fica a seguinte:

impares = [i for i in range(1, 11) if i%2==1]
print(impares)
=========================
OUTPUT: [1, 3, 5, 7, 9]

Dica da vez: enquanto você não estiver seguro em usar o list-comprehension, a vezes demora pra sintaxe entrar na cabeça, é super normal, escreva seu método, função ou procedimento utilizando a sintaxe com o 'append' primeiro e depois tente transformar em list-comprehension. Com o tempo vai se tornar natural.

Utilizar o list-comprehension é um benefício tanto pro programa quanto pro programador, já que além de ser MUITO mais otimizado, deixa o código mais limpo e mais fácil de entender o que está acontecendo.

Então sempre que puder, use e abuse desse recurso. Espero que esse conhecimento seja útil para vocês. Até mais DIO Family. ;)

Compartilhe
Comentários (1)
Diogo
Diogo - 15/08/2022 17:33

Bacana !, em relação a performance, seria legal um gerador também


#exemplo

# ao invés de [] usa ()
quadrados = (i*i for i in range(1, 11))

Quanto a diferença de bits em memória em relação ao gerador e a lista e absurda !