Python Language
Pętle
Szukaj…
Wprowadzenie
Jako jedna z najbardziej podstawowych funkcji programowania, pętle są ważnym elementem w prawie każdym języku programowania. Pętle umożliwiają programistom ustawianie określonych części kodu na powtarzanie się przez szereg pętli zwanych iteracjami. Ten temat dotyczy używania wielu rodzajów pętli i aplikacji pętli w Pythonie.
Składnia
- podczas gdy <wyrażenie boolowskie>:
- dla <variable> w <iterable>:
- dla <zmiennej> w zakresie (<numer>):
- dla <variable> w zakresie (<numer_rozruchu>, <numer_wstępu>):
- dla <zmiennej> w zakresie (<numer_rozruchu>, <numer_wstępu>, <rozmiar_kroku>):
- dla i, <variable> in enumerate (<iterable>): # with index i
- dla <variable1>, <variable2> w zip (<iterable1>, <iterable2>):
Parametry
Parametr | Detale |
---|---|
Wyrażenie logiczne | wyrażenie, które można ocenić w kontekście logicznym, np. x < 10 |
zmienna | nazwa zmiennej dla bieżącego elementu z iterable |
iterowalne | wszystko, co implementuje iteracje |
Iterowanie po listach
Aby iterować listę, której możesz użyć for
:
for x in ['one', 'two', 'three', 'four']:
print(x)
Spowoduje to wydrukowanie elementów listy:
one
two
three
four
Funkcja range
generuje liczby, które są często używane w pętli for.
for x in range(1, 6):
print(x)
Wynikiem będzie specjalny typ sekwencji zakresu w python> = 3 i lista w python <= 2. Oba można zapętlić za pomocą pętli for.
1
2
3
4
5
Jeśli chcesz zapętlić oba elementy listy i mieć również indeks dla tych elementów, możesz użyć funkcji enumerate
Pythona:
for index, item in enumerate(['one', 'two', 'three', 'four']):
print(index, '::', item)
enumerate
wygeneruje krotki, które są rozpakowywane do index
(liczba całkowita) i item
(rzeczywista wartość z listy). Powyższa pętla zostanie wydrukowana
(0, '::', 'one')
(1, '::', 'two')
(2, '::', 'three')
(3, '::', 'four')
Iteruj po liście z manipulowaniem wartościami za pomocą map
i lambda
, tj. Zastosuj funkcję lambda na każdym elemencie na liście:
x = map(lambda e : e.upper(), ['one', 'two', 'three', 'four'])
print(x)
Wynik:
['ONE', 'TWO', 'THREE', 'FOUR'] # Python 2.x
Uwaga: w Python 3.x map
zwraca iterator zamiast listy, więc jeśli potrzebujesz listy, musisz rzutować wynik print(list(x))
(patrz http://www.riptutorial.com/python/ przykład / 8186 / map-- w http://www.riptutorial.com/python/topic/809/incompatabilities-moving-from-python-2-to-python-3 ).
Do pętli
for
pętle iteracyjne nad zbiór elementów, takich jak list
lub dict
i uruchomić blok kodu z każdego elementu z kolekcji.
for i in [0, 1, 2, 3, 4]:
print(i)
Powyższe for
pętli iteruje się po liście liczb.
Każda iteracja ustawia wartość i
na następny element listy. Więc najpierw będzie 0
, potem 1
, potem 2
itd. Wyjście będzie następujące:
0
1
2
3
4
range
jest funkcją, która zwraca szereg liczb poniżej w iterowalny postaci, zatem mogą być stosowane for
pętli:
for i in range(5):
print(i)
daje dokładnie taki sam wynik jak pierwszy for
pętli. Zauważ, że 5
nie jest drukowane, ponieważ zakres jest pierwszymi pięcioma liczbami liczącymi się od 0
.
Obiekty iteracyjne i iteratory
Pętla for
może iterować na dowolnym obiekcie iterowalnym, który jest obiektem definiującym funkcję __getitem__
lub __iter__
. Funkcja __iter__
zwraca iterator, który jest obiektem z next
funkcją używaną do uzyskania dostępu do następnego elementu iterowalnego.
Przerwij i kontynuuj w pętlach
instrukcja break
Kiedy instrukcja break
wykonuje się w pętli, przepływ sterujący „natychmiast przerywa” pętlę:
i = 0
while i < 7:
print(i)
if i == 4:
print("Breaking from loop")
break
i += 1
Warunek pętli nie będzie oceniany po wykonaniu instrukcji break
. Zauważ, że instrukcje break
są dozwolone tylko wewnątrz pętli , składniowo. Instrukcja break
wewnątrz funkcji nie może być użyta do zakończenia pętli, które ją wywołały.
Wykonanie następujących drukuje każdą cyfrę, aż do liczby 4
gdy spełniona zostanie instrukcja break
i pętla się zatrzyma:
0
1
2
3
4
Breaking from loop
break
instrukcje mogą być również zastosowane wewnątrz for
pętli, drugi konstrukt pętli zapewnia Pythonie
for i in (0, 1, 2, 3, 4):
print(i)
if i == 2:
break
Wykonywanie tej pętli teraz drukuje:
0
1
2
Zauważ, że 3 i 4 nie są drukowane od momentu zakończenia pętli.
Jeśli pętla ma klauzulę else
, nie zostanie wykonana, gdy pętla zostanie zakończona za pomocą instrukcji break
.
continue
wyciąg
continue
oświadczenie będzie przejść do następnej iteracji pętli pomijając resztę bieżącego bloku ale ciągłą pętlę. Podobnie jak w przypadku break
, continue
może pojawiać się tylko w pętlach:
for i in (0, 1, 2, 3, 4, 5):
if i == 2 or i == 4:
continue
print(i)
0
1
3
5
Zauważ, że 2
i 4
nie są drukowane, ponieważ continue
przechodzi do następnej iteracji zamiast kontynuowania print(i)
gdy i == 2
lub i == 4
.
Pętle zagnieżdżone
break
i continue
tylko na jednym poziomie pętli. Poniższy przykład przerwać jedynie od wewnętrznej for
obiegu, a nie zewnętrznej while
pętla:
while True:
for i in range(1,5):
if i == 2:
break # Will only break out of the inner loop!
Python nie ma możliwości wyrwania się z wielu poziomów pętli naraz - jeśli takie zachowanie jest pożądane, refaktoryzacja jednej lub więcej pętli w funkcję i zamiana break
return
może być dobrym rozwiązaniem.
Użyj return
z funkcji jako break
Instrukcja return
wychodzi z funkcji bez wykonywania kodu, który następuje po niej.
Jeśli masz pętlę wewnątrz funkcji, użycie return
z tej pętli jest równoważne break
ponieważ reszta kodu pętli nie jest wykonywana ( zwróć uwagę, że żaden kod po pętli również nie jest wykonywany ):
def break_loop():
for i in range(1, 5):
if (i == 2):
return(i)
print(i)
return(5)
Jeśli zagnieżdżono pętle, instrukcja return
zniszczy wszystkie pętle:
def break_all():
for j in range(1, 5):
for i in range(1,4):
if i*j == 6:
return(i)
print(i*j)
wyświetli:
1 # 1*1
2 # 1*2
3 # 1*3
4 # 1*4
2 # 2*1
4 # 2*2
# return because 2*3 = 6, the remaining iterations of both loops are not executed
Pętle z klauzulą „else”
Instrukcje for
i while
(pętle) mogą opcjonalnie zawierać klauzulę else
(w praktyce takie użycie jest dość rzadkie).
else
klauzula wykonywana tylko po for
wygaśnięciem pętli przez powtarzanie do końca, lub po while
kończy pętlę jej warunkowego wypowiedzi staje fałszywe.
for i in range(3):
print(i)
else:
print('done')
i = 0
while i < 3:
print(i)
i += 1
else:
print('done')
wynik:
0
1
2
done
Klauzula else
nie zostanie wykonana, jeśli pętla zakończy się w inny sposób (poprzez instrukcję break
lub zgłoszenie wyjątku):
for i in range(2):
print(i)
if i == 1:
break
else:
print('done')
wynik:
0
1
W większości innych języków programowania brakuje tej opcjonalnej klauzuli else
pętli. Użycie słowa kluczowego „ else
w szczególności jest często uważane za mylące.
Oryginalna koncepcja takiej klauzuli sięga czasów Donalda Knutha, a znaczenie słowa kluczowego else
staje się jasne, jeśli przepisujemy pętlę pod względem instrukcji if
i goto
z wcześniejszych dni przed programowaniem strukturalnym lub z języka asemblera niższego poziomu.
Na przykład:
while loop_condition():
...
if break_condition():
break
...
jest równa:
# pseudocode
<<start>>:
if loop_condition():
...
if break_condition():
goto <<end>>
...
goto <<start>>
<<end>>:
Pozostają one równoważne, jeśli do każdego z nich else
klauzulę else
.
Na przykład:
while loop_condition():
...
if break_condition():
break
...
else:
print('done')
jest równa:
# pseudocode
<<start>>:
if loop_condition():
...
if break_condition():
goto <<end>>
...
goto <<start>>
else:
print('done')
<<end>>:
Pętlę for
z klauzulą else
można rozumieć w ten sam sposób. Pod względem koncepcyjnym istnieje warunek pętli, który pozostaje True, dopóki iterowalny obiekt lub sekwencja nadal ma pewne pozostałe elementy.
Dlaczego miałby używać tego dziwnego konstruktu?
Głównym przykładem użycia dla konstrukcji for...else
jest zwięzła implementacja wyszukiwania, na przykład:
a = [1, 2, 3, 4]
for i in a:
if type(i) is not int:
print(i)
break
else:
print("no exception")
Aby uczynić else
w tym konstrukcie mniej mylącym, można myśleć o tym jako „ jeśli nie złamie się ” lub „ jeśli nie zostanie znaleziony ”.
Niektóre dyskusje na ten temat można znaleźć w [Ideach Pythona] Podsumowanie wątków for ... else , Dlaczego Python używa pętli „else” po pętli for i while? oraz inne klauzule dotyczące instrukcji pętli
Iterowanie po słownikach
Biorąc pod uwagę następujący słownik:
d = {"a": 1, "b": 2, "c": 3}
Aby iterować po jego kluczach, możesz użyć:
for key in d:
print(key)
Wynik:
"a"
"b"
"c"
Jest to równoważne z:
for key in d.keys():
print(key)
lub w Python 2:
for key in d.iterkeys():
print(key)
Aby iterować po jego wartościach, użyj:
for value in d.values():
print(value)
Wynik:
1
2
3
Aby iterować po kluczach i wartościach, użyj:
for key, value in d.items():
print(key, "::", value)
Wynik:
a :: 1
b :: 2
c :: 3
Zauważ, że w Python 2. .keys()
, .values()
i .items()
zwracają obiekt list
. Jeśli chcesz po prostu .iterkeys()
wynik, możesz użyć równoważnych .iterkeys()
, .itervalues()
i .iteritems()
.
Różnica między .keys()
i .iterkeys()
, .values()
i .itervalues()
, .items()
i .iteritems()
polega na tym, że metody iter*
są generatorami. Tak więc elementy w słowniku są generowane jeden po drugim podczas ich oceny. Gdy obiekt list
jest zwracany, wszystkie elementy są pakowane na listę, a następnie zwracane w celu dalszej oceny.
Zauważ również, że w Pythonie 3 kolejność elementów drukowanych w powyższy sposób nie jest zgodna z żadną kolejnością.
Podczas gdy pętla
while
pętla spowoduje oświadczenia pętla być wykonywane, dopóki warunek pętli jest falsey . Poniższy kod wykona instrukcje pętli w sumie 4 razy.
i = 0
while i < 4:
#loop statements
i = i + 1
Podczas gdy powyższą pętlę można łatwo przekształcić w bardziej elegancką pętlę for
, while
pętle są przydatne do sprawdzania, czy spełniono jakiś warunek. Następująca pętla będzie wykonywana do momentu, gdy myObject
będzie gotowy.
myObject = anObject()
while myObject.isNotReady():
myObject.tryToGetReady()
while
pętle mogą również działać bez warunku, używając liczb (złożonych lub rzeczywistych) lub True
:
import cmath
complex_num = cmath.sqrt(-1)
while complex_num: # You can also replace complex_num with any number, True or a value of any type
print(complex_num) # Prints 1j forever
Jeśli warunek jest zawsze spełniony, pętla while będzie działać wiecznie (pętla nieskończona), jeśli nie zostanie zakończona instrukcją break lub return lub wyjątkiem.
while True:
print "Infinite loop"
# Infinite loop
# Infinite loop
# Infinite loop
# ...
Instrukcja Pass
pass
to stwierdzenie null gdy rachunek jest wymagane składni Pythona (jak w ciele for
lub while
prąd), ale nie jest wymagane lub pożądane działanie za pomocą programatora. Może to być przydatne jako symbol zastępczy kodu, który jeszcze nie został napisany.
for x in range(10):
pass #we don't want to do anything, or are not ready to do anything here, so we'll pass
W tym przykładzie nic się nie wydarzy. Pętla for
zakończy się bez błędów, ale nie zostaną wykonane żadne polecenia ani kod. pass
pozwala nam pomyślnie uruchomić nasz kod bez pełnego wdrożenia wszystkich poleceń i akcji.
Podobnie, pass
można stosować w pętlach while
, a także w selekcjach i definicjach funkcji itp.
while x == y:
pass
Iteracja różnych części listy o różnej wielkości kroku
Załóżmy, że masz długą listę elementów i interesuje Cię tylko każdy inny element listy. Być może chcesz tylko zbadać pierwszy lub ostatni element lub określony zakres wpisów na liście. Python ma silne wbudowane możliwości indeksowania. Oto kilka przykładów realizacji tych scenariuszy.
Oto prosta lista, która zostanie wykorzystana we wszystkich przykładach:
lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
Iteracja na całej liście
Aby iterować każdy element na liście, można użyć pętli for
, takiej jak poniżej:
for s in lst:
print s[:1] # print the first letter
Pętla for
przypisuje s do każdego elementu lst
. Spowoduje to wydrukowanie:
a
b
c
d
e
Często potrzebujesz zarówno elementu, jak i indeksu tego elementu. enumerate
słowo kluczowe wykonuje to zadanie.
for idx, s in enumerate(lst):
print("%s has an index of %d" % (s, idx))
Indeks idx
rozpocznie się od zera i przyrostu dla każdej iteracji, podczas gdy s
będzie zawierać przetwarzany element. Poprzedni fragment wyświetli:
alpha has an index of 0
bravo has an index of 1
charlie has an index of 2
delta has an index of 3
echo has an index of 4
Iterate over sub-list
Jeśli chcemy iterować po zakresie (pamiętając, że Python używa indeksowania zerowego), użyj słowa kluczowego range
.
for i in range(2,4):
print("lst at %d contains %s" % (i, lst[i]))
To dałoby wynik:
lst at 2 contains charlie
lst at 3 contains delta
Lista może być również podzielona na plasterki. Następująca notacja wycinka przechodzi od elementu o indeksie 1 do końca z krokiem 2. Dwie pętle for
dają ten sam wynik.
for s in lst[1::2]:
print(s)
for i in range(1, len(lst), 2):
print(lst[i])
Powyższe dane wyjściowe fragmentu kodu:
bravo
delta
Indeksowanie i krojenie to odrębny temat.
„Pół pętli” do-while
W przeciwieństwie do innych języków, Python nie ma konstrukcji do-do ani do-while (pozwoli to na wykonanie kodu przed testem warunku). Możesz jednak połączyć while True
z break
aby osiągnąć ten sam cel.
a = 10
while True:
a = a-1
print(a)
if a<7:
break
print('Done.')
Spowoduje to wydrukowanie:
9
8
7
6
Done.
Pętle i rozpakowywanie
Jeśli chcesz na przykład przeglądać listę krotek:
collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]
zamiast robić coś takiego:
for item in collection:
i1 = item[0]
i2 = item[1]
i3 = item[2]
# logic
lub coś w tym stylu:
for item in collection:
i1, i2, i3 = item
# logic
Możesz po prostu to zrobić:
for i1, i2, i3 in collection:
# logic
Będzie to również działać w przypadku większości typów iteratorów, nie tylko krotek.