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.

que precisa se adaptar ao novo formato.

def log(message, *values): # A única diferença

if not values:

print(message)

else:

values_str = ', '.join(str(x) for x in values)

print('%s: %s' % (message, values_str))

log('My numbers are', 1, 2)

log('Hi there') # Muito melhor!

>>>

My numbers are: 1, 2

Hi there

Veja que os argumentos não precisam mais estar numa lista, mas se você já tem

uma lista e quiser chamar uma função com argumentos expansíveis como esta

nossa log, pode-se usar o operador * também na chamada da função. O * instrui

o Python para passar os itens na sequência como se fossem argumentos

posicionais.

favorites = [7, 33, 99]

log('Favorite colors', *favorites)

>>>

Favorite colors: 7, 33, 99

Existem dois problemas a considerar quando decidimos aceitar uma quantidade

variável de argumentos posicionais.

O primeiro problema é que os argumentos variáveis são sempre transformados

em uma tupla antes de passados para sua função. Isso significa que, caso o

chamador da função use o operador * em um gerador, este será iterado até a

exaustão. A tupla resultante incluirá todos os valores produzidos pelo gerador, o

que pode consumir uma grande quantidade de memória e causar o travamento do

programa.

def my_generator():

for i in range(10):

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!