Najlepszym źródłem informacji jest oficjalny samouczek Pythona dotyczący rozumienia list . Listy składane są prawie takie same jak pętle for (z pewnością każde rozumienie list można zapisać jako pętlę for), ale często są one szybsze niż użycie pętli for.
Spójrz na to dłuższe rozumienie listy z samouczka ( if
część filtruje rozumienie, tylko części, które przechodzą instrukcję if, są przekazywane do końcowej części rozumienia listy (tutaj (x,y)
):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Działa dokładnie tak samo, jak ta zagnieżdżona pętla for (i, jak mówi samouczek, zwróć uwagę, jak kolejność for i if są takie same).
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Główną różnicą między rozumieniem listy a pętlą for jest to, że ostatnia część pętli for (w której coś robisz) pojawia się na początku, a nie na końcu.
Przejdźmy do pytań:
Jakiego typu musi być obiekt, aby użyć go do struktury pętli?
Iterable . Dowolny obiekt, który może wygenerować (skończony) zbiór elementów. Należą do nich wszelkie kontenery, listy, zestawy, generatory itp.
Jaka jest kolejność, w jakiej i i j są przypisywane do elementów w obiekcie?
Są przypisywane dokładnie w tej samej kolejności, w jakiej są generowane z każdej listy, tak jakby były w zagnieżdżonej pętli for (dla pierwszego zrozumienia dostaniesz 1 element dla i, a następnie każdą wartość z j, drugi element do i, następnie każda wartość z j itp.)
Czy można to zasymulować inną strukturą pętli for?
Tak, już pokazane powyżej.
Czy pętla for może być zagnieżdżona z podobną lub inną strukturą pętli? A jak by to wyglądało?
Jasne, ale to nie jest dobry pomysł. Tutaj, na przykład, daje listę list znaków:
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]