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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow