W języku programowania Python istnieje specjalna konstrukcja składni, która umożliwia tworzenie wypełnionych list zgodnie z określonymi regułami. Takie struktury nazywają się generatory list. Ich wygoda polega na krótszym zapisie kod programu niż gdyby lista została utworzona w zwykły sposób.

Na przykład musisz utworzyć listę wypełnioną liczbami naturalnymi do określonej liczby. „Klasyczny” sposób wyglądałby mniej więcej tak:

>>>a= >>> dla i w zakresie (1 , 15 ) : ...a.dołącz(i) ... >>> a

Utworzenie listy zajęło trzy linijki kodu. Generator zrobi to w jednym:

>>> a = [ i dla i w zakresie (1 , 15 ) ] >>> a

Tutaj budowa [ i dla i w zakresie (1 , 15 ) ] to generator list. Cała konstrukcja ujęta jest w nawiasy kwadratowe, co niejako mówi, że zostanie utworzona lista. Wewnątrz nawiasów kwadratowych można wyróżnić trzy części: 1) co robimy z elementem (w tym przypadku nic nie robimy, po prostu dodajemy go do listy), 2) co bierzemy (w tym przypadku element i) , 3) skąd go bierzemy (tutaj z obiektu zakresu) . Części są oddzielone od siebie słowami kluczowymi dla oraz w.

Rozważ ten przykład:

>>> a = [ 2 , -2 , 4 , -4 , 7 , 5 ] >>> b = [i**2 dla i w a] >>>b

W tym przypadku generator list pobiera każdy element z listy a i poddaje go kwadratowi. Tak więc 1) co robimy - podwajamy element, 2) co bierzemy - element, 3) skąd bierzemy - z listy a .

>>> >>> b = [ i*a[ i] dla i w a] >>>b

Tutaj klucz jest pobierany ze słownika, a iloczyn klucza i jego wartość jest dodawany do wygenerowanej listy.

>>> a = ( 1:10 , 2:20 , 3:30 ) >>> b = [ [ i, a[ i] ] dla i w a] >>>b [, , ] >>> c = [ j dla i w b dla j w i] >>> c

W tym przykładzie wygenerowana lista b składa się z list zagnieżdżonych. Gdyby generator pominął w wyrażeniu nawiasy kwadratowe [ja,a[i]], wystąpiłby błąd. Jeśli nadal potrzebujesz jednopoziomowej listy kluczy i wartości słownika, musisz wziąć każdą zagnieżdżoną listę i pobrać z niej każdy element. Osiąga się to dzięki konstrukcji zagnieżdżonej dla, który jest pokazany w wierszu c = [j dla i w b dla j w i]. „Klasyczna” składnia do wypełniania listy c wyglądałaby tak:

>>>c= >>> dla i w b: ... dla j w i: ...c.dołącz(j) ... >>> c

Na końcu generatora możesz dodać konstrukcję jeśli. Na przykład musisz wyodrębnić wszystkie cyfry z ciągu :) if i%30 == 0 lub i%31 == 0 ] >>> a

Dzięki temu generatory ułatwiają i przyspieszają tworzenie list. Nie mogą jednak zastąpić dość skomplikowanych konstrukcji. Na przykład, gdy warunek walidacji powinien obejmować gałąź w przeciwnym razie.

Język programowania Pyrhon posiada specjalną składnię, która pozwala na tworzenie wypełnionych list w oparciu o określone zasady. Wygenerowane listy mogą być różne, zawartość struktury może być różna, dlatego nazywa się je generatorami list. Są wygodne, ponieważ wpisy nie są tak długie, jak przy tradycyjnej metodzie tworzenia list.

Na przykład potrzebujesz listy liczb naturalnych aż do określonej liczby. metoda tradycyjna będzie wyglądać tak:

>>> a = >>> dla i w przedziale (1,15): ... a.append(i) ... >>>

Lista zajmowała trzy linijki kodu. A generator potrzebuje tylko jednego:

>>> a = >>> a

Konstrukcja to generator list. Wszystkie konstrukcje muszą być umieszczone w listach kwadratowych, co odzwierciedla tworzenie listy. Wewnątrz nawiasów znajdują się trzy części:

  1. Co zrobimy z elementami (w naszej sytuacji nic nie robimy, po prostu dodajemy to do listy).
  2. Co weźmiemy (bierzemy element i).
  3. Skąd go weźmiemy (z obiektu zasięgu). Aby oddzielić części, użyj słów kluczowych w i dla.

Spójrzmy na przykład

>>> a = >>> b = >>> b

W tej sytuacji bierzemy każdy element listy i podnosimy go do kwadratu. Stąd:

  1. Robimy - podnosimy nasz element do kwadratu.
  2. Bierzemy element.
  3. Od - z listy
>>> a = (1:10, 2:20, 3:30) >>> b = dla i w a] >>> b

Tutaj bierzemy klucz ze słownika, a iloczyn klucza i jego wartość trafia do wygenerowanej listy.

>>> a = (1:10, 2:20, 3:30) >>> b = [] dla i w a] >>> b [, , ] >>> c = >>> c

W takim przypadku lista b zawiera listy zagnieżdżone. Pominięcie nawiasów kwadratowych w generatorze w wyrażeniu ] spowodowałoby błąd. Jeśli potrzebujesz jednopoziomowej listy z kluczami z wartości słownikowych, musisz wziąć każdą zagnieżdżoną listę i pobrać z niej każdy komponent. Odbywa się to za pomocą zagnieżdżonej konstrukcji. Tradycyjna składnia aukcji to:

>>> c = >>> dla i w b: ... dla j w i: ... c.append(j) ... >>> c

Listy składane mogą być uzupełnione konstrukcją if. Na przykład musisz wyodrębnić wszystkie liczby z ciągu:

>>> a="lsj94ksd231 9" >>> b=

Lub wypełnij listę liczbami, które są wielokrotnościami 31 lub 30:

>>> a = >>> a

Tworzenie list jest znacznie prostsze i szybsze. Nie nadają się jednak do zastąpienia dość skomplikowanych konstrukcji. Na przykład, jeśli w warunku sprawdzania istnieje gałąź else.

Skończyły Ci się pieniądze, a do wypłaty zostało jeszcze kilka tygodni? Możesz pożyczyć, ale co jeśli nie ma nikogo? Nie idź do banku po pożyczkę. W takim przypadku pomogą Ci mikropożyczki. Wystarczy wejść na stronę, wypełnić wniosek (to bardzo proste i szybkie) iw ciągu kilku minut otrzymasz pieniądze! Bardzo wygodny i szybki, a co najważniejsze, nie trzeba nikogo pytać!

Co dziwne, rozumienia list (generatory list) są przeznaczone do wygodnego przetwarzania list, co obejmuje zarówno tworzenie nowych list, jak i modyfikację już istniejących.

Powiedzmy, że musimy zdobyć listę liczb nieparzystych nieprzekraczających 25. W zasadzie samo zapoznanie się z działaniem polecenia xrange nie jest trudne do rozwiązania tego problemu.

Res = for x in xrange(1, 25, 2): res.append(x) ... print res

Ogólnie rzecz biorąc, uzyskany wynik całkowicie nam odpowiada ze wszystkim, z wyjątkiem długiej płyty. Tu na ratunek przyjdzie nasz „cukier”. W samym prosta forma, on zwykle

Res = ... drukuj res

Składnia jest w zasadzie prosta. Całe wyrażenie jest napisane w nawiasach kwadratowych. Najpierw pojawia się wyrażenie, które ustawi elementy listy, a następnie - pętla, za pomocą której możesz zmienić wyrażenie. Obie części mogą być dowolnie złożone. Na przykład, oto jak uzyskać listę kwadratów tych samych liczb nieparzystych.

Opcjonalnie możesz dodać dodatkowe warunki filtrowanie. Na przykład zmodyfikujmy nasz poprzedni przykład, aby wykluczyć kwadraty liczb podzielnych przez 3.

Res = ... drukuj res

Zadanie 6.1. Generator list

Potrzebujesz listy liczby binarne które nie są kwadratami.

Generatory

Konstrukcje takie jak mylist = tworzą listy elementów, których wartości są przechowywane w pamięci. Możesz zastosować do nich konstrukcję for i w mylist: print(i), aby pracować z elementami tyle razy, ile chcesz.

Generatory są również obiektami iterowalnymi, ale można je odczytać tylko raz. Dzieje się tak, ponieważ nie przechowują wartości w pamięci, ale generują je w locie:

mygenerator = (x*x for x in range(3)) for i in mygenerator: print(i)

Wszystko jest takie samo, z wyjątkiem tego, że zamiast kwadratów używa się nawiasów. ALE: nie możesz zastosować for i w konstrukcji mygenerator po raz drugi, ponieważ generator może być użyty tylko raz: zwraca 0, potem zapomina o tym i oblicza 1, kończąc na 4 - jeden po drugim. Nie możesz również uzyskać liczby elementów za pomocą len() . Generatory nie mogą być krojone przez mój generator . Ale generatory pozwalają zmniejszyć ilość pamięci potrzebnej do uruchomienia programu.

Dawać

Yield to słowo kluczowe używane podobnie do return – różnica polega na tym, że funkcja zwróci generator.

Def createGenerator() : mylist = range(3) for i in mylist: yield i*i mygenerator = createGenerator() # utwórz generator dla i w mygenerator: print(i)

Zadanie 6.2. Generator liczb tetraedrycznych

Używając generatora liczb trójkątnych, utwórz generator liczb czworościennych.

Zadanie 6.3. generator transfuzji

Istnieje szkolny problem z uzyskaniem wymaganej objętości przy użyciu nieskończonej puli i dwóch wiader. Na przykład: trzeba uzyskać 4 litry za pomocą dwóch wiader o pojemności 3 i 5 litrów. Rozwiązaniem jest metoda kuli bilardowej.

Konieczne jest stworzenie generatora, który wytwarza pary liczb - pełnię naczyń. Przykład pracy:

Buckets = pool(3,5) for a,b in buckets: print("a=",a," b=",b) if b==4: przerwa

Dzisiaj opowiem o takim typie danych jak listy, ich operacje i metody, rozumienie list i użycie list.

Czym są listy?

Listy w Pythonie to uporządkowane, mutowalne kolekcje obiektów dowolnych typów (podobnie jak tablica, ale typy mogą się różnić).

Aby korzystać z list, musisz je utworzyć. Listę można utworzyć na kilka sposobów. Na przykład możesz przetwarzać dowolny iterowalny obiekt (na przykład ) za pomocą wbudowanej funkcji lista:

>>> lista("lista") ["lista"]

Listę można również utworzyć za pomocą literału:

>>> s = # Pusta lista >>> l = [ "s" , "p" , [ "isok" ], 2 ] >>> s >>> l ["s", "p", ["isok "], 2]

Jak widać na przykładzie, lista może zawierać dowolną liczbę dowolnych obiektów (w tym listy zagnieżdżone) lub nie może zawierać niczego.

Innym sposobem na stworzenie listy jest generatory list. Zrozumienie listy to sposób na skonstruowanie nowej listy przez zastosowanie wyrażenia do każdego elementu sekwencji. Listy składane są bardzo podobne do pętli.

>>> c = [ c * 3 dla c w "liście" ] >>> c ["lll", "iii", "sss", "ttt"]

Możliwa jest również bardziej złożona konstrukcja generatora list:

>>> c = [ c * 3 for c in "list" if c != "i" ] >>> c ["lll", "sss", "ttt"] >>> c = [ c + d for c in "list" if c != "i" for d in "spam" if d != "a" ] >>> c ["ls", "lp", "lm", "ss", "sp", "sm", "ts", "tp", "tm"]

Jednak w skomplikowanych przypadkach do generowania list lepiej jest użyć zwykłej pętli for.

Lista funkcji i metod

Utwórz utworzoną, teraz musisz coś zrobić z listą. Dla list dostępne są metody podstawowe i listowe.

Lista metod tabeli

metodaCo on robi
lista.dołącz(x)Dodaje element na koniec listy
lista.rozszerz(L)Rozszerza listę, dołączając wszystkie elementy listy L na końcu.
lista.wstaw(ja, x)Wstawia wartość x na i-tym elemencie
list.usuń(x)Usuwa pierwszy element z listy, który ma wartość x. ValueError, jeśli taki element nie istnieje
list.pop([i])Usuwa i-ty element i zwraca go. Jeśli nie określono indeksu, ostatni element jest usuwany.
lista.indeks(x,])Zwraca pozycję pierwszego elementu o wartości x (wyszukiwanie od początku do końca)
lista.liczba(x)Zwraca liczbę elementów o wartości x
lista.sortuj() Sortuje listę na podstawie funkcji
list.rewers() Rozwija listę
lista.kopiuj() Płytka kopia listy
lista.wyczyść() Czyści listę

Należy zauważyć, że metody listowe, w przeciwieństwie do , zmieniają samą listę i dlatego wynik wykonania nie musi być wpisywany do tej zmiennej.

>>> l = [ 1 , 2 , 3 , 5 , 7 ] >>> l . sort() >>> l >>> l = l . sort() >>> print(l) Brak

I na koniec przykłady pracy z listami:

>>> a = [ 66.25 , 333 , 333 , 1 , 1234.5 ] >>> print (a . count (333 ), a . count (66.25 ), a . count ("x")) 2 1 0 >>> a. wstaw (2 , - 1 ) >>> a . dołącz(333) >>> a >>> indeks (333 ) 1 >>> a . usuń(333) >>> a >>> reverse() >>> a >>> sort() >>> a [-1, 1, 66.25, 333, 333, 1234.5]

Czasami, aby zwiększyć wydajność, listy zastępowane są znacznie mniej elastycznymi.

Generatory i iteratory to narzędzia zwykle używane do przesyłania strumieniowego danych. W lekcji przyjrzymy się koncepcji iteratorów w Pyton, dowiedz się, jak tworzyć własne iteratory i dowiedz się, jak pracować z generatorami.

Iteratory w Pythonie

W wielu współczesne języki programowanie wykorzystuje takie byty jak iteratory. Ich głównym celem jest uproszczenie nawigacji po elementach obiektu, który z reguły jest kolekcją (lista, słownik itp.). Język Pyton w tym przypadku nie jest wyjątkiem i obsługuje również iteratory. Iterator to obiekt wyliczający, który dla danego obiektu zwraca następny element lub zgłasza wyjątek, jeśli nie ma więcej elementów.

Głównym miejscem używania iteratorów jest pętla. dla. Jeśli iterujesz elementy z jakiejś listy lub znaki w ciągu z pętlą dla, to w rzeczywistości oznacza to, że przy każdej iteracji pętli następuje dostęp do iteratora zawartego w łańcuchu / liście, z wymogiem zwrócenia kolejnego elementu, jeśli w obiekcie nie ma już elementów, to iterator wyrzuca wyjątek przetwarzany w pętli dla niewidoczne dla użytkownika.

Oto kilka przykładów, które pomogą Ci lepiej zrozumieć tę koncepcję.Najpierw wyświetlmy na ekranie elementy dowolnej listy.

> > > num_list => > > for i in num_list: print (i) 1 2 3 4 5

Jak już wspomniano, obiekty, których elementy można iterować w pętli dla, zawierają obiekt iteratora, aby go uzyskać, musisz użyć funkcji iter(), oraz aby wyodrębnić kolejny element z iteratora - funkcję następny().

> > > itr = iter (num_list) > > > print (next(itr)) 1 > > > print (next(itr)) 2 > > > print (next(itr)) 3 > > > print (next(itr)) )) 4 > > > print (next(itr)) 5 > > > print (next(itr)) Traceback (najnowsze wywołanie ostatnie): Plik " " , wiersz 1 , w< module>print (next(itr)) StopIteracja

Jak widać na powyższym przykładzie, wywołanie funkcji następny(it) za każdym razem zwraca następny element z listy, a gdy te elementy się skończą, wyrzucany jest wyjątek StopIteracja.

Tworzenie własnych iteratorów

Jeśli chcesz iterować po elementach w obiekcie swojej własnej klasy, musisz zbudować własny iterator. Stwórzmyklasa, której obiektem będzie iterator wytwarzający określoną liczbę jednostek, którą użytkownik określa podczas tworzenia obiektu. Taka klasa będzie zawierać konstruktor, który przyjmuje liczbę jednostek jako dane wejściowe i metodę __następny__(), bez niej instancje tej klasy nie będą iteratorami.

__w tym__ < self .limit: self .counter += 1 return 1 else : raise StopIteration s_iter1 = SimpleIterator(3 ) print (next(s_iter1)) print (next(s_iter1)) print (next(s_iter1)) print (next(s_iter1))

W naszym przykładzie przy czwartym wywołaniu funkcji następny() zostanie wyrzucony wyjątek StopIteracja. Jeśli chcemy mieć możliwość pracy z danym obiektem w pętli dla, potem do klasy Prosty iterator trzeba dodać metodę __iter__(), który zwraca iterator, w tym przypadku ta metoda powinna zwrócić samego siebie.

class SimpleIterator : def __iter__(self ): zwróć self def __w tym__(self , limit ): self .limit = limit self .counter = 0 def __next__ (self ): if self .counter< self .limit: self .counter += 1 return 1 else : raise StopIteration s_iter2 = SimpleIterator(5 ) for i in s_iter2: print (i)

Generatory

Generatory znacznie ułatwiają budowę iteratorów. W poprzednich przykładach stworzyliśmy osobną klasę do budowania i pracy z iteratorem. Generator to funkcja, która po wywołaniu w funkcji następny() zwraca następny obiekt zgodnie z algorytmem jego pracy. Zamiast słowo kluczowe zwrócić używany w generatorze dawać. Najprostszym sposobem, aby zobaczyć, jak działa generator, jest przykład. Napiszmy funkcję, która generuje potrzebną nam liczbę jednostek.

def simple_generator (val ): while val > 0 : val -= 1 yield 1 gen_iter = simple_generator(5 ) print (next(gen_iter)) print (next(gen_iter)) print (next(gen_iter)) print (next(gen_iter) ) print (next(gen_iter)) print (next(gen_iter))

Ta funkcja będzie działać dokładnie tak, jak klasa Prosty iterator z poprzedniego przykładu.

Kluczem do zrozumienia, jak działają generatory, jest to, że dzwonisz dawać funkcja nie przestaje działać, ale zostaje „zamrożona” do następnej iteracji uruchomionej przez funkcję następny(). Jeśli jesteś w swoim generatorze, użyj gdzieś słowa kluczowego