Skrypty, słowniki, napisy, pliki
Skrypty
W celu stworzenia skryptu języka Python,
zapisujemy kod w pliku o rozszerzeniu .py
i nadajemy mu prawa wykonywania.
$ cat > hello.py <<EOF > #!/usr/bin/env python > > print 'Hello world!' > EOF $ chmod a+x hello.py $ ./hello.py Hello world!
Parametry uruchomieniowe
Obiekt argv
w module sys
to
lista napisów będących parametrami wywołania programu.
#!/usr/bin/env python # encoding: utf-8 import sys # wypisanie listy w całości: print sys.argv # każdy element w osobnej linii: for x in sys.argv: print x
Przykład uruchomienia powyższego programu.
$ ./echo.py 1 2 3 "Parametr wielowyrazowy" '*' ['./echo.py', '1', '2', '3', 'Parametr wielowyrazowy', '*'] ./echo.py 1 2 3 Parametr wielowyrazowy *
Zadanie
- Napisz program, który przyjmuje jeden parametr — liczbę całkowitą i wypisuje komunikat na temat jej parzystości.
Słowniki
Jedną z podstawowych struktur danych w Pythonie
jest słownik — dict
, nazywany również
tablicą asocjacyjną lub mapą.
# pusty słownik: slownik = {} # słownik z wartościami początkowymi: slownik = { 'klucz': 'wartosc', 'klucz2': [], 10: 'dziesiec', (1,2,3): 'wartosc dla krotki', } # przypisanie wartości dla klucza o wartości 0: slownik[0] = 'zero' # nadpisanie wartości dla istniejącego klucza: slownik['klucz'] = 'nowa wartość'
Klucz słownika musi być obiektem niemodyfikowalnym (ang. immutable), na przykład napisem, liczbą, krotką, w przeciwieństwie do listy i słownika, które są modyfikowalne (ang. mutable). Wartością przypisaną do klucza może być dowolny obiekt, np. ten sam słownik:
slownik['self'] = slownik slownik -> {'klucz': 'nowa warto\xc5\x9b\xc4\x87', 0: 'zero', 10: 'dziesiec', (1, 2, 3): 'wartosc dla krotki', 'klucz2': [], 'self': {...}} slownik['self'] -> {'klucz': 'nowa warto\xc5\x9b\xc4\x87', 0: 'zero', 10: 'dziesiec', (1, 2, 3): 'wartosc dla krotki', 'klucz2': [], 'self': {...}}
Jeśli spróbujemu pobrać ze słownika wartość dla klucza, którego nie ma w słowniku,
zostanie rzucony wyjątek KeyError
.
print slownik['nie_ma_klucza'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'nie_ma_klucza'
W takim przypadku — jeśli nie chcemy przechwytywać wyjątku
— bezpiecznie jest użyć metody get
. Jako opcjonalny, drugi argument
możemy jej podać domyślną wartość zwracaną w przypadku braku klucza.
print slownik.get('nie_ma_klucza') None slownik.get('nie_ma_klucza', 'wartosc domyslna - brakuje klucza') -> 'wartosc domyslna - brakuje klucza'
Iterowanie po słowniku
Kolejność kluczy w słowniku jest nieokreślona.
Jeśli chcesz uzyskać określony porządek kluczy,
wykorzystaj OrderedDict
.
Iterowanie po kluczach możemy uzyskać za pomocą pętli for
.
for x in slownik: print x
Wyjście powyższej pętli na ekranie:
klucz 0 10 (1, 2, 3) klucz2 self
Listę kluczy możemy uzyskać za pomocą metody .keys()
.
Metoda .values()
zwraca listę wartości zapisanych w słowniku.
Metoda .items()
zwraca listę krotek klucz-wartość,
więc chcąc iterować jednocześnie po kluczach i wartościach
słownika, napiszemy:
for klucz, wartosc in slownik.items(): print klucz, wartosc
Napisy
Literały napisowe można zapisywać na wiele sposobów.
napis1 = "abc" print 'abc' print '''pierwsza linia druga linia''' napis2 = """pierwsza linia druga linia trzecia linia"""
Napisy są niemodyfikowalne. Dlatego poniższy kod
lista_napisow = [ 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqr' ] wynik = '' for napis in lista_napisow: wynik += napis print wynik
jest nieefektywny, ponieważ w każdym obrocie pętli musi być tworzony nowy obiekt typu napisowego. Zamiast tego, użyj poniższego kodu.
lista_napisow = [ 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqr' ] print ''.join( lista_napisow ) # pusty separator '.'.join(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']) -> 'a.b.c.d.e.f.g.h.i.j.k'
Metoda .join()
powoduje użycie napisu jako separatora do połączenia wszystkich napisów w liście.
Przeciwną metodą jest .split()
,
która zwraca listę napisów powstałą po podzieleniu napisu względem białych znaków
(gdy nie podano argumentu)
lub napisu podanego jako argument.
'a b c'.split() -> ['a', 'b', 'c'] 'aaa/bbb/c'.split('/') -> ['aaa', 'bbb', 'c']
Zadanie
-
Napisz funkcję, która przyjmuje napis w formacie:
'''k1: v1 k2: v2 k3: v3'''
i zwraca słownik odpowiednio o wartości
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
Pliki
Aby otworzyć plik, używamy funkcji open()
,
która przyjmuje nazwę pliku i tryb otwarcia.
Jeśli podamy tylko nazwę pliku,
zostanie on otwarty do odczytu.
f = open("plik.txt") print f.read() f.close() f = open("plik.txt") for line in f: print line f.close()
Krótsze i wygodniejsze jest użycie słowa kluczowego with
. Za takim blokiem kodu plik jest automatycznie zamknięty.
with open("plik.txt") as f: print f.read() # tutaj plik jest już zamknięty
Zadania
-
Napisz program, który przyjmuje dwa parametry:
- nazwę pliku,
- klucz (słowo).
Program ma wczytać z podanego pliku napis sformatowany tak, jak w poprzednim zadaniu. Na wyjściu ma być wypisana wartość przypisana do podanego klucza.
-
Napisz program, który przyjmuje dwa parametry:
- nazwę pliku lub znak
-
, - dowolny ciąg znaków (np. słowo).
Program ma otwierać plik, którego nazwę podano jako pierwszy parametr lub użyć
sys.stdin
, jeśli podano-
. Program ma wyświetlić wszystkie linie z podanego pliku, które zawierają podane słowo. Podpowiedź: użyj operatorain
. - nazwę pliku lub znak