Każdego dnia coraz bardziej kocham Pythona.
Dzisiaj pisałem kod taki jak:
for i in xrange(N):
do_something()
Musiałem coś zrobić N razy. Ale za każdym razem nie zależało od wartości i
(zmienna indeksu). Zdałem sobie sprawę, że tworzę zmienną, której nigdy nie używałem ( i
), i pomyślałem: „Z pewnością istnieje bardziej pythonowy sposób zrobienia tego bez potrzeby stosowania tej bezużytecznej zmiennej indeksu”.
A więc ... pytanie brzmi: czy wiesz, jak wykonać to proste zadanie w bardziej (pytonicznie) piękny sposób?
coding-style
for-loop
python
Manuel Aráoz
źródło
źródło
range
zamiast tego.Odpowiedzi:
Nieco szybszym podejściem niż zapętlenie
xrange(N)
jest:źródło
Użyj zmiennej _, jak się nauczyłem , zadając to pytanie , na przykład:
źródło
Po prostu używam
for _ in range(n)
, to jest od razu do rzeczy. W Pythonie 2 wygeneruje całą listę ogromnych liczb, ale jeśli używasz Pythona 3, nie stanowi to problemu.źródło
ponieważ funkcja jest obywatelem pierwszej klasy, możesz napisać małe opakowanie (od odpowiedzi Alexa)
wtedy możesz przekazać funkcję jako argument.
źródło
_ Jest tym samym, co x. Jednak jest to idiom Pythona, który służy do wskazania identyfikatora, którego nie zamierzasz używać. W Pythonie te identyfikatory nie zajmują pamięci ani nie przydzielają miejsca, jak zmienne w innych językach. Łatwo o tym zapomnieć. To tylko nazwy wskazujące na obiekty, w tym przypadku liczba całkowita w każdej iteracji.
źródło
Uważam, że różne odpowiedzi są naprawdę eleganckie (szczególnie Alex Martelli), ale chciałem oszacować wydajność z pierwszej ręki, więc przygotowałem następujący scenariusz:
Wymyśliłem również alternatywne rozwiązanie, które opiera się na rozwiązaniu Martelliego i używa
map()
do wywołania funkcji ładunku. OK, trochę oszukałem, ponieważ pozwoliłem sobie na to, by ładunek akceptował parametr, który zostanie odrzucony: nie wiem, czy istnieje sposób na obejście tego. Niemniej jednak oto wyniki:więc użycie mapy daje poprawę o około 30% w stosunku do standardowej pętli i dodatkowe 19% w porównaniu ze standardem Martelli.
źródło
Załóżmy, że zdefiniowałeś funkcję do_something jako funkcję i chcesz wykonać ją N razy. Może możesz spróbować następujących rzeczy:
źródło
fn() for fn in itertools.repeat(do_something, N)
i zapisać wstępne generowanie tablicy ... to jest mój ulubiony idiom.A co z prostą pętlą while?
Masz już zmienną; dlaczego tego nie użyć?
źródło