• Nie Znaleziono Wyników

Generatory

N/A
N/A
Protected

Academic year: 2021

Share "Generatory"

Copied!
52
0
0

Pełen tekst

(1)

Kurs rozszerzony języka Python

Wykład 4.

Marcin Młotkowski

(2)

Iteratory i generatory Wejście/wyjście

Plan wykładu

1 Iteratory i generatory

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

2 Wejście/wyjście

(3)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Plan wykładu

1 Iteratory i generatory

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

2 Wejście/wyjście Pliki tekstowe

(4)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Protokół iteracyjny

”Producent”

Umiem dostarczać kolejne elementy kolekcji po jednym elemencie, a jak już wszystkie dostarczę to poinformuję o tym.

”Konsument”

(5)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Konsumenci

instrukcjafor–in

operator in

(6)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Naiwna wersja implementacji protokołu

Metody kolekcji

iter: zainicjuj przeglądanie;

next: zwróć element i przesuń wskaźnik; jeśli koniec zwróć

(7)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Przykładowa implementacja

classKolekcja:

def init (self):

self.data = [”jeden”, ”dwa”, ”trzy”]

defiter(self):

self.pointer = 0

defnext(self):

ifself.pointer < len(self.data):

self.pointer += 1

returnself.data[self.pointer - 1]

else:

returnNone

(8)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory itertools i przykład

Wady rozwiązania

suma = 0 forxinwek 1: foryin wek 2: suma += x*y

(9)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Wady rozwiązania

wek 1 = wek 2 = Kolekcja() suma = 0

forxinwek 1:

foryin wek 2:

suma += x*y

(10)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Postulat

Fajnie byłoby, żeby jedną kolekcję dało się przeglądać jednocześnie w kilku miejscach

Diagnoza problemu

Kłopot jest dlatego, że jest tylko jeden wskaźnik do przeglądania. Rozwiązanie problemu

Każdy konsument (pętla, wątek etc.) otrzymuje własny wskaźnik przeglądania.

(11)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Postulat

Fajnie byłoby, żeby jedną kolekcję dało się przeglądać jednocześnie w kilku miejscach

Diagnoza problemu

Kłopot jest dlatego, że jest tylko jeden wskaźnik do przeglądania.

Rozwiązanie problemu

Każdy konsument (pętla, wątek etc.) otrzymuje własny wskaźnik przeglądania.

(12)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Postulat

Fajnie byłoby, żeby jedną kolekcję dało się przeglądać jednocześnie w kilku miejscach

Diagnoza problemu

Kłopot jest dlatego, że jest tylko jeden wskaźnik do przeglądania. Rozwiązanie problemu

Każdy konsument (pętla, wątek etc.) otrzymuje własny wskaźnik przeglądania.

(13)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Implementacja przeglądania kolekcji

Protokół (Python 3.*)

Na początku wywoływana jest metoda iter ;

zwróconą wartością powinien być obiekt (enumerator)

implementujący metodę next ()która za każdym

wywołaniem zwraca kolejny element kolekcji

Metoda next ()jest wywoływana tak długo, póki nie

zostanie zgłoszony wyjątek StopIteration

Python 2.*

Zamiast next jestnext.

(14)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Implementacja przeglądania kolekcji

Protokół (Python 3.*)

Na początku wywoływana jest metoda iter ;

zwróconą wartością powinien być obiekt (enumerator)

implementujący metodę next ()która za każdym

wywołaniem zwraca kolejny element kolekcji

Metoda next ()jest wywoływana tak długo, póki nie

zostanie zgłoszony wyjątek StopIteration

Python 2.*

(15)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Implementacja przeglądania kolekcji

Protokół (Python 3.*)

Na początku wywoływana jest metoda iter ;

zwróconą wartością powinien być obiekt (enumerator)

implementujący metodę next ()która za każdym

wywołaniem zwraca kolejny element kolekcji

Metoda next ()jest wywoływana tak długo, póki nie

zostanie zgłoszony wyjątek StopIteration

Python 2.*

Zamiast next jestnext.

(16)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Implementacja przeglądania kolekcji

Protokół (Python 3.*)

Na początku wywoływana jest metoda iter ;

zwróconą wartością powinien być obiekt (enumerator)

implementujący metodę next ()która za każdym

wywołaniem zwraca kolejny element kolekcji

Metoda next ()jest wywoływana tak długo, póki nie

zostanie zgłoszony wyjątek StopIteration

Python 2.*

(17)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Przykład

Zadanie

Implementacja kolekcji zwracającej kolejne liczby od 1 do 10

Implementacja

classListaLiczb:

def __iter__(self):

self.licznik = 0

returnself

def next (self):

if self.licznik >= 10: raise StopIteration

self.licznik += 1

returnself.licznik

(18)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Przykład

Zadanie

Implementacja kolekcji zwracającej kolejne liczby od 1 do 10 Implementacja

classListaLiczb:

def__iter__(self):

self.licznik = 0

returnself

def next (self):

if self.licznik >= 10: raise StopIteration

self.licznik += 1

(19)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Nieskończona lista liczb naturalnych

Iterator

classIntIterator(object):

def init (self):

self.licznik = 0

def next (self):

wynik =self.licznik

self.licznik += 1

returnwynik Implementacja kolekcji

classIntCollection(object):

def iter (self):

returnIntIterator()

(20)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Zastosowanie

Obliczyć max(Σi =0i ) takie że Σi =0i < 100

Rozwiązanie suma = 0

foriin IntCollection():

if suma + i >= 100: break

(21)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Zastosowanie

Obliczyć max(Σi =0i ) takie że Σi =0i < 100

Rozwiązanie suma = 0

foriin IntCollection():

if suma + i >= 100: break

suma += i

(22)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Jawne użycie iteratorów

>>> l = [1,2,3] >>> it = iter(l) >>> it. next () 1 >>> next(it) 2 >>> next(it) 3 >>> next(it)

Traceback (most recent call last): File ”<stdin>”, line 1, in <module> StopIteration

(23)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Uwagi

Pytanie

Czy zawsze pożądane jest posiadanie więcej niż jednego iteratora?

Kontrprzykład Przetwarzanie plików.

(24)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Uwagi

Pytanie

Czy zawsze pożądane jest posiadanie więcej niż jednego iteratora? Kontrprzykład

(25)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory itertools i przykład

Ważne

filter map reduce Python 2.*

Funkcje zwracają listę

Python 3.*

Funkcje zwracają iterator

(26)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory itertools i przykład

Ważne

filter map reduce Python 2.*

Funkcje zwracają listę

Python 3.*

(27)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Progamowanie funkcjonalne

Operatory (moduł operator) operator.add(x,y)

operator.mul(x,y) operator.pow(x,y) ...

Iloczyn skalarny

sum(map(operator.mul, vector1, vector2))

(28)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Progamowanie funkcjonalne

Operatory (moduł operator) operator.add(x,y)

operator.mul(x,y) operator.pow(x,y) ...

Iloczyn skalarny

(29)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Iterator a lista

Python 3.*

list(filter(lambdax : x > 2, [1,2,3,4]))

(30)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Biblioteka itertools

Mnóstwo funkcji produkujących generatory

Kolejne potęgi 2 it = map(lambda x : 2**x, itertools.count()) next(it) next(it) next(it) ...

(31)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Biblioteka itertools

Mnóstwo funkcji produkujących generatory Kolejne potęgi 2 it = map(lambda x : 2**x, itertools.count()) next(it) next(it) next(it) ...

(32)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Definicje

Generator

Generator to funkcja, która zwraca iterator.

Wyrażenie generatorowe

(33)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Definicje

Generator

Generator to funkcja, która zwraca iterator.

Wyrażenie generatorowe

Wyrażenie generatorowe to wyrażenie, która zwraca iterator.

(34)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Jak implementować funkcje generatorowe

(35)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Wykorzystanie

yield

Implementacja nieskończonej listy potęg 2

defpower2(): power = 1 whileTrue: yieldpower power = power * 2 it = power2() forxinrange(4): print(next(it)) Nieskończona pętla

foriin power2(): print(i)

(36)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Wykorzystanie

yield

Implementacja nieskończonej listy potęg 2

defpower2(): power = 1 whileTrue: yieldpower power = power * 2 it = power2() forxinrange(4): print(next(it)) Nieskończona pętla

(37)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Wyrażenia generatorowe

Instrukcja

wyr generatorowe = (i** 2foriin range(5))

jest równoważna

defwyr generatorowe():

fori inrange(5):

yieldi**2

(38)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Zastosowanie

String szesnastkowo

(39)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

yield from

Zamiast Example

foritemin iterable: yielditem:

można pisać Example

yield fromiterable

(40)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Moduł itertools

(41)

Iteratory i generatory Wejście/wyjście

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

Problem 8 hetmanów

Wikipedia Marcin Młotkowski Kurs rozszerzony języka Python

(42)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Plan wykładu

1 Iteratory i generatory

Przetwarzanie iteracyjne kolekcji Operacje na kolekcjach (iterable) Generatory

itertools i przykład

2 Wejście/wyjście

(43)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Operacje na plikach

Otwarcie i zamknięcie pliku fh = open(’plik’,’r’) ... fh.close() Atrybuty otwarcia ’r’ odczyt ’w’ zapis ’a’ dopisanie ’r+’ odczyt i zapis

’rb’,’wb’,’ab’ odczyt i zapis binarny

(44)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Metody czytania pliku

Odczyt całego pliku fh.read()

Odczyt tylko size znaków fh.read(size)

Odczyt wiersza, wraz ze znakiem ’\n’ fh.readline()

Zwraca listę odczytanych wierszy fh.readlines()

(45)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Tryby odczytu/zapisu

Tryb tekstowy

fh.read() zwraca string w kodowaniu takie jak ustawiono przy

otwarciu pliku: open(fname, ’r’, encoding=’’utf8’’).

Tryb binarny open(fname, ’rb’)

fh.read() zwraca ciąg binarny.

(46)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Odczyt pliku

Przykład fh = open(’test.py’,’r’) whileTrue: wiersz = fh.readline() if len(wiersz) == 0: break print(wiersz) fh.close() Inny przykład fh = open(’test.py’,’r’) for wierszin fh: print(wiersz)

(47)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Odczyt pliku

Przykład fh = open(’test.py’,’r’) whileTrue: wiersz = fh.readline() if len(wiersz) == 0: break print(wiersz) fh.close() Inny przykład fh = open(’test.py’,’r’) for wierszin fh: print(wiersz)

(48)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Zapis do pliku

fh.write(’dane zapisywane do pliku\n’)

(49)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Zamykanie pliku

Uwaga

Zawsze należy zamykać pliki. Przykład try: fh = open(’nieistniejacy’,’r’) data = fh.read() finally: fh.close()

Alternatywne zamykanie pliku

delfh

(50)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Zamykanie pliku

Uwaga

Zawsze należy zamykać pliki. Przykład try: fh = open(’nieistniejacy’,’r’) data = fh.read() finally: fh.close()

Alternatywne zamykanie pliku

(51)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Zamykanie pliku

Porada

withopen(’nieistniejacy’,’r’) asfh: data = fh.read()

(52)

Iteratory i generatory

Wejście/wyjście Pliki tekstowe

Formaty danych

Pliki tekstowe pickle Pliki z rekordami Pliki CSV Pliki *.ini XML ...

Cytaty

Powiązane dokumenty

Publikacja sfinansowana z przychodów w³asnych Katedry Ekonomiki Przedsiêbiorstw Wydzia³u Zarz¹dzania Uniwersytetu Gdañskiego.. © Copyright by Uniwersytet Gdañski

Jeśli parametry statystyczne generatora (ciągu generowanych przez niego liczb) odbiegają od powyższych wartości to jest on nieprzydatny (lub warunkowo przydatny)... 8

Jeśli parametry statystyczne generatora (ciągu generowanych przez niego liczb) odbiegają od powyższych wartości to jest on nieprzydatny (lub warunkowo przydatny)... 8

Ponieważ wszystkie generatory o dowolnym rozkładzie bazują na wykorzystaniu ciągów liczb losowych o rozkładzie równomiernym więc istotne jest badanie tylko generatorów liczb

Jeżeli chcielibyśmy, je oceniać przez pryzmat najlepszego przetwarzania ruchu wirnika na prąd elektryczny, to najlepszą sprawność wśród elektrowni przeznaczonych do produkcji

‘&lt;opis obiektu&gt;’, który jest użyteczny przy debugowaniu – wywoływana przez repr(object). object.__str__(self) zwraca “ładny” napis – wywoływana

nowego filtru z obrazem uzyskanym w dwuetapowym przebiegu piksli do arkusza kalkulacyjnego Excel (prawe menu, wybrać ramkę i zaznaczyć fragment obrazu o określonym położeniu

Badanie zaleŜności napięcia na obwodzie rezonansowym od częstotliwości sygnału dla stałej wartości międzyszczytowej napięcia na wejściu układu E = Tab.1. Wykres