15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

A função opera da forma esperada por três razões:

• O Python suporta os closures (fechamentos): funções que fazem referência a

variáveis a partir do escopo em que foram definidas. É por isso que a função

auxiliar (em nosso exemplo chamada helper) é capaz de acessar o argumento

group estando dentro de sort_priority.

• As funções são objetos de primeira classe em Python, ou seja, podemos nos

referir a eles diretamente, atribuí-los a variáveis como se fossem valores

discretos, passá-los como argumentos para outras funções, compará-las em

expressões e comandos if e muitas outras coisas. Por essa razão, o método

sort pôde aceitar um closure como valor para o argumento key.

• O Python possui regras específicas para comparar tuplas. Primeiro são

comparados os itens de índice zero, depois no índice um, depois dois, e assim

por diante. É por isso que o valor de retorno do closure chamado helper causa

dois grupos distintos de números na ordem de classificação.

Seria bacana se esta função retornasse a existência de itens de alta prioridade,

para que a interface de usuário possa agir de acordo. Implementar esse

comportamento parece bastante direto. Já existe uma função de closure para

decidir em qual grupo cada número está. Por que não usar o closure para

também levantar uma flag quando existirem itens de alta prioridade? Dessa

forma, a função pode retornar o valor da flag depois de ter sido modificado pelo

closure.

No código a seguir, isso foi implementado de uma forma aparentemente óbvia:

def sort_priority2(numbers, group):

found = False

def helper(x):

if x in group:

found = True # Parece simples

return (0, x)

return (1, x)

numbers.sort(key=helper)

return found

Posso rodar a função com as mesmas entradas de antes.

found = sort_priority2(numbers, group)

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!