Digamos que eu tenho uma função Python que retorna vários valores em uma tupla:
def func():
return 1, 2
Existe uma boa maneira de ignorar um dos resultados, em vez de apenas atribuir a uma variável temporária? Digamos que se eu estivesse interessado apenas no primeiro valor, existe uma maneira melhor do que isso:
x, temp = func()
~
como a sintaxe para ignorar uma variável de retorno especialRespostas:
Uma convenção comum é usar um "_" como um nome de variável para os elementos da tupla que você deseja ignorar. Por exemplo:
fonte
Você pode usar
x = func()[0]
para retornar o primeiro valor,x = func()[1]
retornar o segundo e assim por diante.Se você deseja obter vários valores por vez, use algo como
x, y = func()[2:4]
.fonte
func()[2:4]
se você quiser apenas alguns dos valores de retorno._, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
é menos claro do que chamar a função várias vezes, mas essa é apenas a minha opinião. Se a sua função retornos que muitos itens, acho que usando numpy seria preferível:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...x, __, y = func()
Se você estiver usando o Python 3, poderá usar a estrela antes de uma variável (no lado esquerdo de uma atribuição) para que seja uma lista na descompactação.
fonte
a, *_ = f()
para ignorar o número arbitrário de valores retornados depoisa
.Lembre-se, quando você devolve mais de um item, está realmente retornando uma tupla. Então você pode fazer coisas assim:
fonte
A prática comum é usar a variável dummy
_
(sublinhado único), como muitos indicaram aqui antes.No entanto, para evitar colisões com outros usos desse nome de variável (consulte esta resposta), pode ser uma prática melhor usar
__
(sublinhado duplo) como uma variável descartável, conforme apontado por ncoghlan . Por exemplo:fonte
a, _, _ = 1,8,9
:). Até esse ponto, ele armazena o resultado da última instrução executada que, se você quiser capturar, normalmente usaria uma variável para armazenar esse valor. E é por isso que '_' é o nome da variável sugerido para capturar valores de lixo eletrônico. Os valores '_' são substituídos logo após a execução de outra instrução. No caso de '_ _', o valor permaneceria lá até que o GC o limpasse.Três escolhas simples.
Óbvio
Hediondo
E há maneiras de fazer isso com um decorador.
fonte
_
variável. É muito óbvio que você está ignorando um valorx, _ = func()
é hediondo ex = func()[0]
óbvio. Atribuindo a uma variável e depois não a usando? A função está retornando uma tupla; indexe-o como uma tupla.;)
, lista acessores, tais comoa[0]
,a[:]
(cópia lista),a[::2]
(cada dois elementos), ea[i:] + a[:i]
(girar uma lista), são, de facto, também óbvio e canónica.A melhor solução provavelmente é nomear as coisas em vez de retornar tuplas sem sentido. A menos que haja alguma lógica por trás da ordem dos itens devolvidos.
Você pode até usar o nomeado duplo se desejar adicionar informações extras sobre o que está retornando (não é apenas um dicionário, são coordenadas):
Se os objetos no seu dicionário / tupla estiverem fortemente ligados, pode ser uma boa ideia definir uma classe para ele. Dessa forma, você também poderá definir a interação entre objetos desse tipo e fornecer uma API sobre como trabalhar com eles. Uma pergunta natural a seguir: Quando devo usar classes em Python? .
fonte
Esta parece ser a melhor escolha para mim:
Não é enigmático ou feio (como o método func () [index]) e indica claramente seu objetivo.
fonte
Esta não é uma resposta direta à pergunta. Em vez disso, responde a esta pergunta: "Como escolho uma saída de função específica dentre muitas opções possíveis?".
Se você conseguir escrever a função (ou seja, ela não estiver em uma biblioteca que não possa ser modificada), adicione um argumento de entrada que indique o que você deseja da função. Crie um argumento nomeado com um valor padrão para que, no "caso comum", você nem precise especificá-lo.
Este método fornece a função "aviso avançado" em relação à saída desejada. Conseqüentemente, ele pode pular o processamento desnecessário e fazer apenas o trabalho necessário para obter a saída desejada. Também porque o Python faz digitação dinâmica, o tipo de retorno pode mudar. Observe como o exemplo retorna um escalar, uma lista ou uma tupla ... o que você quiser!
fonte
Se essa é uma função que você usa o tempo todo, mas sempre descarta o segundo argumento, eu diria que é menos confuso criar um alias para a função sem o segundo valor de retorno usando
lambda
.fonte
Quando você tem muitos resultados de uma função e não deseja chamá-lo várias vezes, acho que a maneira mais clara de selecionar os resultados seria:
Como um exemplo de trabalho mínimo, também demonstrando que a função é chamada apenas uma vez:
E os valores são os esperados:
Por conveniência, os índices da lista Python também podem ser usados:
Retorna: a = 3 eb = 12
fonte