.:: KURS PROGRAMOWANIA W JĘZYKU PYTHON ::.




- Słowniki


Włączmy tryb interaktywny Pythona. Dotychczas poznaliśmy trzy typy sekwencyjne: listy, krotki i napisy. W przypadku każdego z tych typów, dostęp do dowolnego elementu możliwy jest poprzez podanie jego indeksu. Odmiennego rodzaju typem złożonym jest słownik. Słownik jest tablicą asocjacyjną wiążącą pary "klucz" – "wartość". Oznacza, że dostęp do dowolnej wartości przechowywanej w słowniku możliwy jest poprzez podanie klucza do niej.
Do tworzenia słowników używamy nawiasów klamrowych. Stwórzmy prosty słownik:


>>> tel = {"policja":997, "straz":998, "pogotowie":999}
>>> tel
{'policja': 997, 'pogotowie': 999, 'straz': 998}


Klucze nie muszą być tekstem, a wartości liczbami:


>>> bohater={"hans":"kloss","james":"bond"}
>>> bohater["hans"]
'kloss'


>>> ujemne={7:-7,3:-3}
>>> ujemne[7]
-7


Specyficzny słownik zwraca funkcja vars( ). Zawiera on wszystkie dostępne aktualnie zmienne:


>>> vars()
{'bohater': {'hans': 'kloss', 'james': 'bond'}, '__builtins__': &<module '__builtin__' (built-in)>, 
'przelicz': &<function przelicz at 0x00B88570&gt;, 't': 'bla bla dwa', 'ujemne': {3: -3, 7: -7}, '__name__': '__main__'}


Aby ustalić ilość kluczy pamiętanych w słowniku używamy funkcji len:


>>> len(tel)
3


Aby otrzymać wartość podanego klucza używamy nawiasów kwadratowych:


>>> tel ["policja"]
997


Aby dopisać nowy klucz:


>>> tel["taxi"]=919
>>> tel
{'taxi': 919, 'policja': 997, 'pogotowie': 999, 'straz': 998}


Aby zmodyfikować istniejącą wartość:


>>> tel["taxi"]=9622
>>> tel["taxi"]
9622


Zapis:


>>> tel2=tel


nie skopiuje zawartości tel do tel2 ale jedynie stworzy drugie odwołanie do tych wartości. A zatem operacja


>>> tel2["taxi"]=9666


zmieni zarówno wartości tel jak i tel2, gdyż są to te same dane pod dwoma różnymi nazwami:


>>> tel
{'taxi': 9666, 'policja': 997, 'pogotowie': 999, 'straz': 998}


Aby skopiować zawartość jednego słownika do drugiego używamy metody copy:


>>> tel2=tel.copy()


W ten sposób otrzymaliśmy dwa różne słowniki, początkowo o tych samych wartościach.


>>> tel["taxi"]=9622
>>> tel
{'taxi': 9622, 'policja': 997, 'pogotowie': 999, 'straz': 998}
>>> tel2
{'taxi': 9666, 'policja': 997, 'pogotowie': 999, 'straz': 998}


Aby usunąć wartość ze słownika używamy del:


>>> del tel['taxi']
>>> tel
{'policja': 997, 'pogotowie': 999, 'straz': 998}


Aby wyczyścić cały słownik używamy clear:


>>> tel.clear()
>>> tel
{}


Aby zaktualizować słownik w oparciu o inny słownik używamy update:


>>> tel.update(tel2)
>>> tel
{'taxi': 9666, 'policja': 997, 'pogotowie': 999, 'straz': 998}


Aby odczytać i od razu usunąć określoną wartość ze słownika używamy pop:


>>> tel.pop('taxi')
9666
>>> tel
{'policja': 997, 'pogotowie': 999, 'straz': 998}


Aby odczytać i od razu usunąć dowolną wartość ze słownika używamy popitem:


>>> tel.popitem()
('policja', 997)
>>> tel
{'pogotowie': 999, 'straz': 998}


Aby sprawdzić zawartość określonego klucza w słowniku używamy operatora in:


>>> 'taxi' in tel
False
>>> 'taxi' in tel2
True


Można też użyć w tym celu metody has_key:


>>> tel2.has_key("pogotowie")
True


Aby uzyskać listę kluczy występujących w słowniku używamy metody keys:


>>> tel.keys()
['pogotowie', 'straz']


Aby uzyskać listę wartości występujących w słowniku używamy metody values:


>>> tel.values()
[999, 998]


Można w ten sposób sprawdzić występowanie określonych wartości:


>>> 999 in tel.values()
True


Aby skonwertować słownik na napis:


>>> str(tel2)
"{'taxi': 9666, 'policja': 997, 'pogotowie': 999, 'straz': 998}"


Aby usunąć cały słownik:


>>> del tel
>>> tel

Traceback (most recent call last):
  File "&<pyshell#35>", line 1, in -toplevel-
    tel
NameError: name 'tel' is not defined



- Przykład: obliczanie wartości liczb podanych słownie


Spróbujemy teraz napisać program na odwracanie poszczególnych wyrazów zdania. Aby przejść do edycji nowego programu należy z menu File wybrać polecenie New Window. Otworzy się nowe okno, przeznaczone do edycji programu. Wybierzmy z menu File polecenie Save As. Wybieramy folder Moje dokumenty, następnie wpisujemy nazwę liczby_slownie.py.


# program zamienia liczbę tekstowo na wartość
def przelicz(n=""):
    w={"jeden":1, "dwa":2, "trzy":3, "cztery":4, "pięć":5, "sześć":6,
       "siedem":7, "osiem":8, "dziewięć":9, "dziesięć":10, "jedenaście":11,
       "dwanaście":12, "trzynaście":13, "czternaście":14, "piętnaście":15,
       "szesnaście":16, "siedemnaście":17, "osiemnaście":18, "dziewiętnaście":19,
       "dwadzieścia":20,"trzydzieści":30,"czterdzieści":40,"pięćdziesiąt":50}
    l=n.split()
    s=0
    
    for x in l:
       if x in w:
           s+=w[x]
    return s

t=raw_input("Wpisz liczbę od 1 do 59> ")
print "Wartość: ",przelicz(t)


Wypróbujmy:


>>> ================================ RESTART ================================
>>>
Wpisz liczbę od 1 do > czterdzieści trzy
Wartość: 43


>>> ================================ RESTART ================================
>>>
Wpisz liczbę od 1 do 59> dwadzieścia siedem
Wartość: 27


>>> ================================ RESTART ================================
>>>
Wpisz liczbę od 1 do 59> bla bla dwa
Wartość: 2



- Pliki


Do tej pory zajmowaliśmy się wyłącznie przechowywaniem danych w pamięci operacyjnej komputera. Pamięć operacyjna komputera jest jednak ulotna. Aby zabezpieczyć dane należy zapisać je w pliku dyskowym. Zanim zaczniemy używać plików, upewnijmy się, gdzie będą one zapisywane. Posłużymy się do tego instrukcjami z modułu os


>>> import os


Zmieńmy aktualny katalog na katalog główny:


>>> os.chdir("c:\\")


Sprawdźmy aktualny katalog:


>>> os.getcwd()
'c:\\'


Sprawdźmy zawartość aktualnego katalogu:


>>> os.listdir(".")
['w9xpopen.exe', 'py.ico', 'pyc.ico', 'README.txt', 'NEWS.txt', 'LICENSE.txt', 'python.exe', 'pythonw.exe', 
'Lib', 'DLLs', 'include', 'libs', 'tcl', 'Tools', 'Doc']


Aby móc używać pliku dyskowego, należy go najpierw otworzyć. Służy do tego polecenie open(nazwa pliku, tryb dostępu), gdzie nazwa pliku zawiera pełną ścieżkę dostępu do pliku, a dostępne tryby dostępu to: r – odczyt z istniejącego pliku, r+ - odczyt i zapis z/do istniejącego pliku, w – zapis do nowego pliku, w+ - odczyt i zapis z/do nowego pliku, a – dopisywanie do istniejącego pliku, a+ – czytanie z i dopisywanie do istniejącego pliku.
Poniższe polecenie stworzy i otworzy do zapisu plik "plik1.txt":


>>> f1 = open("plik1.txt","w")


Można przełączyć się teraz do Eksploratora Windows i sprawdzić, czy rzeczywiście taki plik pojawił się w katalogu C:\. Możemy teraz coś do niego zapisać:


>>> f1.write(str(bohater))


Zmiany nie zostaną jednak uwzględnione dopóty, dopóki nie zamkniemy pliku:


>>> f1.close()


Teraz możemy otworzyć plik w Notatniku i przeczytać jego zawartość. Aby wczytać dane z pliku, otworzymy go do odczytu:


>>> f1 = open("plik1.txt","r")
>>> s=f1.read()
>>> s
"{'hans': 'kloss', 'james': 'bond'}"
>>> f1.close()


Odtworzenie pierwotnego słownika z s jest możliwe ale nieco kłopotliwe. Prościej byłoby zapisać dane w innej postaci. Spróbujmy zrobić to w pliku2:


>>> f1 = open("plik2.txt","w")
>>> for i in bohate.keys():
      f1.write(i)
      f1.write("\n")
      f1.write(bohater [i])
      f1.write("\n")
>>> f1.close()


Jeżeli otworzymy plik2.txt w Notatniku, zobaczymy:


hans
kloss
james
bond


Aby wczytać dane do słownika heroes:


>>> heroes={}
>>> f1 = open("plik2.txt","r")
>>> l=f1.readline()
>>> l
'hans\n'
>>> while l:
      m=f1.readline()
      heroes[l[:-1]]=m[:-1] # usuwamy znaki końca linii
      l=f1.readline()
>>> heroes
{'hans': 'kloss', 'james': 'bond'}
>>> f1.close()



- Przykład: szyfrowanie pliku


Poniższy program szyfruje wskazany przez użytkownika plik tekstowy w oparciu o szyfr Cezara (przesuwanie liter w alfabecie o podaną wartość). Aby przejść do edycji nowego programu należy z menu File wybrać polecenie New Window. Otworzy się nowe okno, przeznaczone do edycji programu. Wybierzmy z menu File polecenie Save As. Wybieramy folder Moje dokumenty, następnie wpisujemy nazwę cezar.py.


# program deszyfruje - szyfruje plik
t=raw_input("Podaj pełną nazwę pliku > ")
p=input("Podaj przesunięcie > ")
     
f1 = open(t,"r+")        # plik otwarty do modyfikacji
s=f1.read()             # wczytujemy do s tekst zrodlowy
sz=""                   # sz oznacza tekst zaszyfrowany

for c in s:                # dla kazdego znaku w s
    a=ord(c)            # wyliczamy kod ASCII
    if a > 32:         # znakow sterujacych (konce linii) nie szyfrujemy
        c=chr((a+p) % 256)      # inne przesuwamy
    sz+=c                # dodajemy do sz
    
f1.seek(0)              # ustawiamy pozycję pliku na jego poczatku
f1.write(sz)            # zapisujmy sz
f1.close()              # zamykamy plik


Wypróbujmy:


>>> ================================ RESTART =============================
>>>
Podaj pełną nazwę pliku > c:\plik2.txt
Podaj przesunięcie > 3


Przyjrzyjmy się teraz plikowi po zaszyfrowaniu:


kdqv
norvv
mdphv
erqg


Aby rozszyfrować plik należy jeszcze raz uruchomić program cezar.py, i podać jako przesunięcie ujemną wartość liczby podanej przy szyfrowaniu:


>>> ================================ RESTART =============================
>>>
Podaj pełną nazwę pliku > c:\plik2.txt
Podaj przesunięcie > -3


Przyjrzyjmy się teraz plikowi po zdeszyfrowaniu:


hans
kloss
james
bond



- Ćwiczenia kontrolne


I. Napisz program "login.py", który wczyta od użytkownika login i hasło. Jeżeli w słowniku haseł znajduje się odpowiedni login i hasło, program powinien wyświetlić "Autoryzacja pomyślna"; inaczej – "Błąd logowania".

II. Napisz program "lista.py", który:
a) Jeżeli na dysku nie ma pliku "lista.txt", wczyta od użytkownika listę studentów (imię, nazwisko, grupa) i zapisze ją do pliku "lista.txt"
b) Jeżeli na dysku jest już plik "lista.txt", wczyta z niego listę studentów (imię, nazwisko, grupa) , a użytkownikowi umożliwi dopisywanie nowych studentów do listy, na koniec zapisze listę z powrotem do pliku.

III. Wykorzystując funkcję sylaby z ćwiczenia III z lekcji 8, napisz program "sylab.py", który wczyta plik tekstowy o podanej przez użytkownika nazwie i rozbije zawarty w nim tekst na sylaby.





-- back