Jaki jest zwykły/najczystszy sposób napisania tego w języku Python?Rozpakowywanie Tupla: zmienna fikcyjna względem indeksu
value, _ = func_returning_a_tuple()
czyli
value = func_returning_a_tuple()[0]
Jaki jest zwykły/najczystszy sposób napisania tego w języku Python?Rozpakowywanie Tupla: zmienna fikcyjna względem indeksu
value, _ = func_returning_a_tuple()
czyli
value = func_returning_a_tuple()[0]
wydaje się być jaśniejszy i można go uogólnić.
Co się stanie, jeśli funkcja zwróci krotkę z więcej niż 2 wartościami?
Co, jeśli logika programu jest zainteresowana czwartym elementem krotnej krotki?
Co się stanie, jeśli rozmiar zwróconej krotki będzie różny?
Żadne z tych pytań nie wpływa na idiom oparty na indeksach, ale w przypadku idiomu z wieloma przypisaniami.
Dla wydobycia pojedynczy element, indeksowanie jest nieco bardziej idiomatyczne. Podczas wydobywania dwóch lub więcej elementów rozpakowywanie staje się bardziej idiomatyczne. To tylko obserwacja empiryczna z mojej strony; Nie znam żadnych stylów polecających lub nakazujących wybór! -)
Gdybyś docenią wygodny sposób, aby to zrobić w python3.x, sprawdź propozycję powiększenia python (PEP) 3132 na tej page of What's New w Pythonie:
Dłuższy Iterable rozpakowywania. Możesz teraz pisać takie rzeczy, jak a, b, *rest = some_sequence
. A nawet *rest, a = stuff
. Obiekt odpoczynku jest zawsze listą (prawdopodobnie pustą); prawa strona może być dowolna. Przykład:
(a, *rest, b) = range(5)
Ustawia a
do 0
, b
do 4
i rest
do [1, 2, 3]
.
Do listy/listowe Generator z par klucz/wartość myślę, że użycie zmiennej manekina może być całkiem fajna, szczególnie tam, gdzie potrzebuje wartość rozpakowaniu należy stosować więcej niż jeden raz (unikając powtarzającego indeksowanie), np:
l = [('a', 1.54), ('b', 4.34), ('c', 3.22), ('d', 6.43)]
s = [x * (1.0 - x) * (2.0 - x) for _, x in l]
kontra:
s = [x[0] * (1.0 - x[0]) * (2.0 - x[0]) for x in l]
inną rzeczą jest, aby pamiętać, że podczas rozpakowywania i indeksowania są mniej więcej tak drogie, jak siebie, rozszerzony rozpakowanie wydaje się być o rząd wielkości mniejszą.
Pythona 3,2 funkcji% timeit w ipython:
Zwykły rozpakowanie:
>>> x = (1, 2)
>>> %timeit y, _ = x
10000000 loops, best of 3: 50 ns per loop
>>> %timeit y, _ = x
10000000 loops, best of 3: 50.4 ns per loop
powiększonym rozpakowanie:
>>> x = (1, 2, 3)
>>> %timeit y, *_ = x
1000000 loops, best of 3: 1.02 us per loop
>>> %timeit y = x[0]
10000000 loops, best of 3: 68.9 ns per loop