15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

for sublist2 in sublist1:

flat.extend(sublist2)

As abrangências de lista também suportam mais de uma condição if. Comandos

if múltiplos em um mesmo nível de laço são equivalentes a um único if com

múltiplas condições ligadas logicamente por uma operação and implícita. Por

exemplo, digamos que se queira filtrar uma lista de números para obter apenas

os valores pares maiores que quatro. As duas abrangências de lista a seguir são

equivalentes.

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

b = [x for x in a if x > 4 if x % 2 == 0]

c = [x for x in a if x > 4 and x % 2 == 0]

As condições podem ser especificadas a cada nível de laço depois da expressão

for. Por exemplo, imagine que se queira filtrar uma matriz de forma que as

únicas células remanescentes sejam as divisíveis por 3 em linhas cuja soma seja

10 ou mais. Usar abrangências de lista para isso fica até curto, mas é

extremamente difícil de ler.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

filtered = [[x for x in row if x % 3 == 0]

for row in matrix if sum(row) >= 10]

print(filtered)

>>>

[[6], [9]]

Embora esse exemplo seja um tanto rebuscado, na prática veremos situações em

que essas expressões parecem ser apropriadas. Eu aconselho jamais usar

abrangências de lista assim complexas. O código resultante é dificílimo de

compreender, especialmente por outras pessoas. O que se economiza em número

de linhas não justifica a dificuldade posterior.

Como regra, evite usar mais que duas expressões em uma abrangência de lista,

podendo ser duas condições, dois laços ou uma condição e um laço. No

momento em que a coisa fique mais complicada que isso, é melhor usar

comandos if e for normais e escrever uma função auxiliar (consulte o Item 16:

“Prefira geradores em vez de retornar listas”).

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!