Kiedy spotykam się z sytuacją, mogę to zrobić w javascript, zawsze myślę, czy istnieje foreach
funkcja, to wygoda. Przez cały rozumiem funkcję opisaną poniżej:
def foreach(fn,iterable):
for x in iterable:
fn(x)
po prostu robią to na każdym elemencie i nie zwróciły ani nie zwróciły, myślę, że powinna to być funkcja wbudowana i powinna być szybsza niż pisanie w czystym Pythonie, ale nie znalazłem tego na liście, lub po prostu nazwałem inną nazwę? czy po prostu brakuje mi tutaj niektórych punktów?
Może się pomyliłem, ponieważ wywołanie funkcji w Pythonie kosztuje dużo, zdecydowanie nie jest to dobra praktyka na przykład. Zamiast pętli out, funkcja powinna wykonywać pętlę w boku, tak jak jej ciało wygląda tak, jak to zostało wspomniane w wielu sugestiach dotyczących kodu w Pythonie:
def fn(*args):
for x in args:
dosomething
ale pomyślałem, że każdy jest nadal mile widziany na podstawie dwóch faktów:
- W normalnych przypadkach ludzie po prostu nie dbają o wydajność
- Czasami API nie akceptowało iterowalnego obiektu i nie można przepisać jego źródła.
źródło
for
samej pętli?for
służy.list.each(func)
jest czystszy niżfor item in list: func(item)
IMO. Problem polega na tym, że Python wykonał dobrą robotę zastępując funkcjonalne ulubione, takie jakmap()
ifilter()
wyrażeniami listowymi, które po prostu rozszerzają jego wbudowanefor
iif
(które są jednorodne i czytelne), a specyfikacja.each()
może temu przeszkodzić.sum(0 for _ in map(f, seq))
to czytelne obejście.Odpowiedzi:
Każde wystąpienie "foreach", które widziałem (PHP, C #, ...) robi w zasadzie to samo, co instrukcja "for" w Pythonie.
Są mniej więcej równoważne:
Więc tak, w Pythonie jest „foreach”. Nazywa się „za”.
To, co opisujesz, to funkcja „mapy tablicy”. Można to zrobić za pomocą list składanych w Pythonie:
źródło
Python nie posiada
foreach
oświadczenie per se . Posiadafor
pętle wbudowane w język.Jeśli naprawdę chcesz, możesz zdefiniować własną
foreach
funkcję:Na marginesie,
for element in iterable
składnia pochodzi z języka programowania ABC, będącego jednym z wpływów Pythona.źródło
map
w ten sposób nie zadziała w Pythonie 3, gdziemap
jest leniwe. Oznacza to, że teraz zwraca iterator, a nie już obliczoną listę. Efekty uboczne nie pojawią się, dopóki nie przejdziesz przez wynikową listę.for
pętla, a jeśli iterowalna jest długa (być może nieskończona) lub wartości zwracane przez funkcję są duże, zrywa się zMemoryError
.for
pętli, a także o składaniu list.Inne przykłady:
Python Foreach Loop:
Python For Loop:
źródło
map
można wykorzystać do sytuacji wspomnianej w pytaniu.Na przykład
W przypadku funkcji, które przyjmują wiele argumentów, można podać więcej argumentów do odwzorowania:
Zwraca listę w pythonie 2.xi iterator w pythonie 3
W przypadku, gdy twoja funkcja przyjmuje wiele argumentów, a argumenty są już w postaci krotek (lub dowolnej iterowalnej od Pythona 2.6), możesz użyć
itertools.starmap
. (który ma bardzo podobną składnię do tego, czego szukałeś). Zwraca iterator.Na przykład
daje nam 8 i 9
źródło
map
iforeach
mają inne znaczenie.map
zwraca listę wyników (co oznacza utworzenie listy, wyliczalnej struktury lub struktury, która zostanie zużyta, a zatem nie zostanie wywołana od razu),foreach
wywołuje funkcję na każdym elemencie, ignorując wynik.Foreach
musi natychmiast zwrócić wynik. Mówienie, że tworzenie iteratora zamiast foreach jest preferowane, to totalna bzdura.map()
gdy wynik jest ignorowany, jest anty-wzorcem. Zamiast tego powinieneś użyć pętli for.map
i ignorowanie wyników spowoduje niepożądane wyniki w Pythonie 3, ponieważmap
jest teraz leniwie oceniane tylko wtedy, gdy lista wynikowa jest zużyta. Jeśli wynikmap
nigdy nie zostanie wykorzystany, wywołania nigdy nie są stosowane.To robi foreach w Pythonie 3
źródło
Tak, chociaż używa tej samej składni co pętla for.
źródło
forEach
Jeśli dobrze cię zrozumiałem, masz na myśli, że jeśli masz funkcję „func”, chcesz sprawdzić dla każdej pozycji na liście, czy funkcja func (pozycja) zwraca prawdę; jeśli osiągniesz prawdę dla wszystkich, zrób coś.
Możesz użyć „all”.
Na przykład: Chcę uzyskać listę wszystkich liczb pierwszych z zakresu 0-10:
źródło
Oto przykład konstrukcji „foreach” z jednoczesnym dostępem do indeksów elementów w Pythonie:
źródło
Spójrz na ten artykuł . Obiekt iteratora nditer z numpy pakietu , wprowadzony w NumPy 1.6, zapewnia wiele elastycznych sposobów odwiedzania wszystkich elementów jednej lub więcej tablic w sposób systematyczny.
Przykład:
źródło
Jeśli szukasz tylko bardziej zwięzłej składni, możesz umieścić pętlę for w jednej linii:
Po prostu oddziel dodatkowe instrukcje średnikiem.
Może to nie być zgodne z lokalnym przewodnikiem po stylu, ale może mieć sens zrobienie tego w ten sposób, gdy bawisz się w konsoli.
źródło
Myślę, że to odpowiada na twoje pytanie, ponieważ jest to jak pętla „dla każdego”.
Poniższy skrypt działa w Pythonie (wersja 3.8):
źródło