Powiedzmy, że mam funkcję Python, która zwraca wiele wartości w krotce:
def func():
return 1, 2
Czy istnieje dobry sposób na zignorowanie jednego z wyników zamiast przypisywania go do zmiennej tymczasowej? Powiedz, że gdybym był zainteresowany tylko pierwszą wartością, czy istnieje lepszy sposób niż ten:
x, temp = func()
~
składni do ignorowania określonej zmiennej zwracanejOdpowiedzi:
Jedną z powszechnych konwencji jest użycie „_” jako nazwy zmiennej dla elementów krotki, które chcesz zignorować. Na przykład:
źródło
Możesz użyć
x = func()[0]
do zwrócenia pierwszej wartości,x = func()[1]
do zwrócenia drugiej itd.Jeśli chcesz uzyskać wiele wartości jednocześnie, użyj czegoś takiego
x, y = func()[2:4]
.źródło
func()[2:4]
jeśli chcesz tylko niektóre zwracane wartości._, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
jest mniej jasne niż wielokrotne wywoływanie funkcji, ale to tylko moja opinia. Jeśli twoja funkcja zwraca tyle pozycji, myślę, że lepiej byłoby użyć numpy:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...x, __, y = func()
Jeśli używasz Python 3, możesz użyć gwiazdki przed zmienną (po lewej stronie przypisania), aby była to lista podczas rozpakowywania.
źródło
a, *_ = f()
do zignorowania dowolnej liczby zwracanych wartości poa
.Pamiętaj, że kiedy zwracasz więcej niż jeden przedmiot, naprawdę zwracasz krotkę. Możesz więc robić takie rzeczy:
źródło
Powszechną praktyką jest używanie zmiennej fikcyjnej
_
(pojedynczy podkreślnik), jak wiele osób wskazało tutaj wcześniej.Jednak, aby uniknąć kolizji z innymi zastosowaniami tej nazwy zmiennej (patrz ta odpowiedź), lepszym rozwiązaniem może być użycie
__
(podwójnego podkreślenia) zamiast zmiennej odchodzącej , jak wskazuje ncoghlan . Na przykład:źródło
a, _, _ = 1,8,9
.:). Do tego momentu przechowuje wynik ostatniej wykonanej instrukcji, który jeśli chcesz złapać, zwykle używasz zmiennej do przechowywania tej wartości. I dlatego „_” jest sugerowaną nazwą zmiennej, która ma przechwytywać niepotrzebne wartości. Wartości „_” zostaną zastąpione wkrótce po wykonaniu innej instrukcji. W przypadku „_ _” wartość pozostanie tam, dopóki GC go nie usunie.Trzy proste opcje.
Oczywisty
Ohydny
I są sposoby, aby to zrobić za pomocą dekoratora.
źródło
_
zmienną. To oczywiste, że ignorujesz wartośćx, _ = func()
jest ohydny ix = func()[0]
oczywisty. Przypisywanie do zmiennej, a następnie jej nie używanie? Funkcja zwraca krotkę; indeksuj to jak krotkę.;)
lista dostępowe, takie jaka[0]
,a[:]
(lista kopii),a[::2]
(co dwa elementy) ia[i:] + a[:i]
(Obrót liście), są w istocie również oczywiste kanonicznych.Prawdopodobnie najlepszym rozwiązaniem jest nazywanie rzeczy zamiast zwracania bezsensownych krotek. Chyba że za kolejnością zwracanych przedmiotów kryje się jakaś logika.
Możesz nawet użyć namedtuple, jeśli chcesz dodać dodatkowe informacje o tym, co zwracasz (to nie jest tylko słownik, to są współrzędne):
Jeśli obiekty w twoim słowniku / krotce są ściśle ze sobą powiązane, dobrym pomysłem może być nawet zdefiniowanie dla niej klasy. W ten sposób będziesz mógł zdefiniować interakcję między obiektami tego typu i podać interfejs API, jak z nimi pracować. Naturalne pytanie: Kiedy powinienem używać klas w Pythonie? .
źródło
To wydaje mi się najlepszym wyborem:
Nie jest tajemniczy ani brzydki (jak metoda func () [index]) i wyraźnie określa twój cel.
źródło
To nie jest bezpośrednia odpowiedź na pytanie. Raczej odpowiada na to pytanie: „Jak wybrać konkretną funkcję z wielu możliwych opcji?”.
Jeśli jesteś w stanie napisać funkcję (tzn. Nie ma jej w bibliotece, której nie można zmodyfikować), dodaj argument wejściowy wskazujący, czego chcesz od funkcji. Zrób z niej nazwany argument o wartości domyślnej, aby w „zwykłym przypadku” nawet nie musieć go podawać.
Ta metoda daje funkcji „zaawansowane ostrzeżenie” dotyczące pożądanego wyjścia. W rezultacie może ominąć niepotrzebne przetwarzanie i wykonać tylko pracę niezbędną do uzyskania pożądanego wyniku. Ponieważ Python wykonuje dynamiczne pisanie, typ zwracany może się zmienić. Zauważ, jak przykład zwraca skalar, listę lub krotkę ... cokolwiek chcesz!
źródło
Jeśli jest to funkcja, której używasz cały czas, ale zawsze odrzucasz drugi argument, argumentowałbym, że mniej bałagan jest tworzenie aliasu dla funkcji bez użycia drugiej wartości zwracanej
lambda
.źródło
Jeśli masz wiele danych wyjściowych z funkcji i nie chcesz wywoływać jej wiele razy, myślę, że najlepszym sposobem na wybranie wyników byłoby:
Jako minimum działający przykład, pokazujący, że funkcja jest wywoływana tylko raz:
A wartości są zgodne z oczekiwaniami:
Dla wygody można również użyć indeksów list w języku Python:
Zwraca: a = 3 ib = 12
źródło