1.5. Pythonizmy
Python jest językiem wydajnym i zwartym dzięki wbudowanym mechanizmom ułatwiającym wykonywanie typowych i częstych zadań programistycznych. Podane niżej przykłady należy przećwiczyć w konsoli Pythona, którą uruchamiamy poleceniem w terminalu:
~$ python
1.5.1. Operatory * i **
Operator *
służy rozpakowaniu listy zawierającej wiele argumentów, które chcemy
przekazać do funkcji:
1# wygeneruj liczby parzyste od 2 do 10
2lista = [2,11,2]
3list(range(*lista))
Operator **
potrafi z kolei rozpakować słownik, dostarczając funkcji
nazwanych argumentów (ang. keyword argument):
1def kalendarz(data, wydarzenie):
2 print("Data:", data,"\nWydarzenie:", wydarzenie)
3
4slownik = {"data" : "10.02.2015", "wydarzenie" : "szkolenie"}
5kalendarz(**slownik)
1.5.2. Pętle
Pętla to podstawowa konstrukcja wykorzystywana w językach programowania.
Python oferuje różne sposoby powtarzania wykonywania określonych operacji,
niekiedy wygodniejsze lub zwięźlejsze niż pętle. Są to przede wszystkim
generatory wyrażeń i wyrażenia listowe, a także funkcje map()
i filter()
.
1kwadraty = []
2for x in range(10):
3 kwadraty.append(x**2)
4print(kwadraty)
1.5.3. Iteratory
Obiekty, z których pętle odczytują kolejne dane to iteratory (ang. iterators)
Są to strumienie danych zwracanych po jednej wartości na raz za pomocą metody __next()__
.
Jeżeli w strumieniu nie ma więcej danych, wywoływany jest wyjątek StopIteration
.
Wbudowana funkcja iter()
zwraca iterator utworzony z dowolnego iterowalnego
obiektu. Iteratory wykorzystujemy do przeglądania list,** tupli**, słowników i plików
używając instrukcji for x in y
, w której y jest obiektem iterowalnym równoważnym
wyrażeniu iter(y)
. Np.:
1lista = [2, 4, 6]
2for x in lista:
3 print(x)
4
5slownik = {'Adam':1, 'Bogdan':2 , 'Cezary':3}
6for x in slownik:
7 print(x, slownik[x])
Listy można łączyć ze sobą i przekształcać w inne iterowalne obiekty. Z dwóch list lub z jednej zawierającej tuple (klucz, wartość) można utworzyć słownik:
1panstwa = ['Polska', 'Niemcy', 'Francja'] # lista państw
2stolice = ['Warszawa', 'Berlin', 'Paryż'] # lista stolic
3panstwa_stolice = zip(panstwa, stolice) # utworzenie iteratora
4lista_tupli = list(panstwa_stolice) # utworzenie listy tupli (państwo, stolica)
5print(lista_tupli)
6slownik = dict(lista_tupli) # utworzenie słownika z listy tupli
7print(slownik)
8
9slownik.items() # zwraca tuple (klucz, wartość)
10slownik.keys() # zwraca klucze
11slownik.values() # zwraca wartości
12
13for klucz, wartosc in slownik.items():
14 print(klucz, wartosc)
1.5.4. Generatory wyrażeń
Jeżeli chcemy wykonać jakąś operację na każdym elemencie sekwencji lub wybrać podzespół elementów spełniający określone warunki, stosujemy generatory wyrażeń (ang. generator expressions), które zwracają iteratory. Poniższy przykład wydrukuje wszystkie imiona z dużej litery:
1wyrazy = ['anna', 'ala', 'ela', 'wiola', 'ola']
2imiona = (imie.capitalize() for imie in wyrazy)
3for imie in imiona:
4 print(imie)
Schemat składniowy generatora jest następujący:
( wyrażenie for x in sekwencja if warunek )
– przy czym:
wyrażenie
– powinno zawierać zmiennąx
z pętlifor
if warunek
– opcjonalna klauzula filtrująca wartości nie spełniające warunku
Gdybyśmy chcieli wybrać tylko imiona 3-literowe w wyrażeniu, użyjemy:
1imiona = (imie.capitalize() for imie in wyrazy if len(imie) == 3)
2list(imiona)
Omawiane wyrażenia można zagnieżdzać. Przykłady podajemy niżej.
1.5.5. Wyrażenia listowe
Jeżeli nawiasy okrągłe w generatorze wyrażeń zamienimy na kwadratowe, dostaniemy wyrażenie listowe (ang. list comprehensions), które – jak wskazuje nazwa – zwraca listę:
1# wszystkie poniższe wyrażenia listowe możemy przypisać do zmiennych,
2# aby móc później korzystać z utworzonych list
3
4# lista kwadratów liczb od 0 do 9
5[x**2 for x in range(10)]
6
7# lista dwuwymiarowa [20,40] o wartościach a
8a = int(input("Podaj liczbę całkowtią: "))
9[[a for y in range(20)] for x in range(40)]
10
11# lista krotek (x, y), przy czym x != y
12[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
13
14# utworzenie listy 3-literowych imion i ich pierwszych liter
15wyrazy = ['anna', 'ala', 'ela', 'wiola', 'ola']
16[ [imie, imie[0]] for imie in wyrazy if len(imie) == 3 ]
17
18# zagnieżdzone wyrażenie listowe tworzące listę współrzędnych
19# opisujących tabelę
20[ (x,y) for x in range(5) for y in range(3) ]
21
22# zagnieżdzone wyrażenie listowe wykorzystujące filtrowanie danych
23# lista kwadratów z zakresu {5;50}
24[ y for y in [ x**2 for x in range(10) ] if y > 5 and y < 50 ]
Wyrażenia listowe w elegancki i wydajny sposób zastępują takie rozwiązania, jak:
1.5.5.1. Mapowanie funkcji
Funkcja map()
funkcję podaną jako pierwszy argument stosuje do każdego elementu sekwencji
podanej jako argument drugi:
1def kwadrat(x):
2 return x**2
3
4kwadraty = map(kwadrat, range(10))
5list(kwadraty)
1.5.5.2. Wyrażenia lambda
Słowo kluczowe lambda
pozwala utworzyć zwięzły odpowiednik prostej, jednowyrażeniowej
funkcji. Poniższy przykład należy rozumieć następująco: do każdej liczby wygenerowanej
przez funkcję range()
zastosuj funkcję w postaci wyrażenia lambda podnoszącą
argument do kwadratu, a uzyskane wartości zapisz w liście kwadraty
.
1kwadraty = map(lambda x: x**2, range(10))
2list(kwadraty)
Funkcje lambda często stosowane są w poleceniach sortowania jako wyrażenie zwracające klucz (wartość), wg którego mają zostać posortowane elementy. Jeżeli np. mamy listę tupli opisującą uczniów:
1uczniowie = [
2 ('jan','Nowak','1A',15),
3 ('ola','Kujawiak','3B',17),
4 ('andrzej','bilski','2F',16),
5 ('kamil','czuja','1B',14)
6]
sorted(uczniowie)
– posortuje listę wg pierwszego elementu każdej tupli, czyli imienia;sorted(uczniowie, key=lambda x: x[1])
– posortuje listę wg klucza zwróconego przez jednoargumentową funkcję lambda, w tym wypadku będzie to nazwisko;max(uczniowie, key=lambda x: x[3])
– zwróci najstarszego ucznia;min(uczniowie, key=lambda x: x[3])
– zwróci najmłodszego ucznia.
1.5.5.3. Filtrowanie danych
Funkcja filter()
jako pierwszy argument pobiera funkcję zwracającą True
lub False
,
stosuje ją do każdego elementu sekwencji podanej jako argument drugi i zwraca tylko te,
które spełniają założony warunek:
1wyrazy = ['anna', 'ala', 'ela', 'wiola', 'ola']
2imiona = filter(lambda imie: len(imie) == 3, wyrazy)
3list(imiona)
1.5.6. Generatory
Generatory (ang. generators) to funkcje ułatwiające tworzenie iteratorów. Od zwykłych funkcji różnią się tym, że:
zwracają iterator za pomocą słowa kluczowego
yield
,zapamiętują swój stan z momentu ostatniego wywołania, są więc wznawialne (ang. resumable),
zwracają następną wartość ze strumienia danych podczas kolejnych wywołań metody
next()
.
Najprostszy przykład generatora zwracającego kolejne liczby parzyste:
def gen_parzyste(N):
for i in range(N):
if i % 2 == 0:
yield i
gen = gen_parzyste(10)
next(gen)
next(gen)
list(gen)
1.5.7. Pliki
Czytanie plików tekstowych:
1with open("test.txt", "r") as f: # odczytywanie linia po linii
2 for linia in f:
3 print(linia.strip())
4
5f = open('test.txt', 'r')
6for linia in f: # odczytywanie linia po linii
7 print(linia.strip())
8f.close()
9
10f = open('test.txt', 'r')
11tresc = f.read() # odczytanie zawartości całego pliku
12for znak in tresc: # odczytaywanie znak po znaku
13 print(znak)
14f.close()
Pierwsza metoda używająca instrukcji with ... as ...
jest preferowana,
ponieważ zapewnia obsługę błędów i dba o zamknięcie pliku.
Zapisywanie danych do pliku tekstowego:
1dane = ['pierwsza linia', 'druga linia']
2with open('output.txt', 'w') as f:
3 for linia in dane:
4 f.write(linia + '\n')
Użycie formatu csv:
1import csv # moduł do obsługi formatu csv
2
3dane = ([1, 'jan', 'kowalski'], [2, 'anna', 'nowak'])
4plik = "test.csv"
5
6with open(plik, 'w', newline='') as plikcsv:
7 tresc = csv.writer(plikcsv, delimiter=';')
8 for lista in dane:
9 tresc.writerow(lista)
10
11with open(plik, newline='') as plikcsv: # otwórz plik do odczytu
12 tresc = csv.reader(plikcsv, delimiter=';')
13 for linia in tresc: # przeglądamy kolejne linie
14 print(linia)
Użycie formatu json:
import os
import json
dane = {'uczen1':[1, 'jan', 'kowalski'], 'uczen2':[2, 'anna', 'nowak']}
plik = "test.json"
with open(plik, 'w') as plikjson:
json.dump(dane, plikjson)
if os.path.isfile(plik): # sprawdzenie, czy plik istnieje
with open(plik, 'r') as plikjson:
dane = json.load(plikjson)
print(dane)
1.5.8. Materiały
Materiały Python 101
udostępniane przez
Centrum Edukacji Obywatelskiej na licencji
Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.
- Utworzony:
2025-04-12 o 10:21 w Sphinx 7.3.7
- Autorzy: