Zajęcia – częśd II Etap 1. Instrukcja warunkowa Służy do sprawdzenia jakiegoś warunku. Umieszczone po niej – po wcięciu – instrukcje wykonają się tylko, jeżeli warunek ten był spełniony. Przykłady: if 'c' in 'abecadło': print("W wyrazie 'abecadło' występuje literka 'c'") wiek = 18 if wiek == 18: print("Wszystkiego najlepszego z okazji osiągnięcia pełnoletności !") Do porównywania ze sobą różnych wartości można użyd wielu operatorów. Tabelka opisująca je znajduje się poniżej. Etap 2. Pętle Sekwencje: Do tworzenia sekwencji, których elementy należą do ciągu arytmetycznego, używamy funkcji range: print range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Pojedynczy parametr oznacza koniec (tj. pierwszy element nie należący do) sekwencji (pierwszym elementem zawsze jest zero). Aby wyświetlid kwadraty liczb od 0 do 9, napiszemy: for x in range(10): print x,' do potegi 2 =',x*x Aby zmienid pierwszy element tworzonej sekwencji używamy funkcji range z dwoma parametrami (początek i koniec): print range(1,10) [1, 2, 3, 4, 5, 6, 7, 8, 9] Aby wyświetlid kwadraty liczb od 3 do 9, napiszemy: for x in range(3,10): print x,' do potegi 2 =',x*x Aby zmienid krok pomiędzy elementami tworzonej sekwencji używamy funkcji range z trzema parametrami (początek, koniec i krok): print range(1,10,2) [1, 3, 5, 7, 9] Zadania do wykonania w tym momencie: 1. odwrócid kolejnośd elementów od 1 do 9 2. wyświetlid kwadraty liczb malejąco od 9 do 1 3. wyświetlid kwadraty liczb nieparzystych malejąco od 9 do 1 Formatowanie liczb Celem pętli często jest wyświetlenie kolumny liczb czy liczby w określonym formacie. Służy do tego tzw. Ciąg formatujący, który składa się ze znaku %, po którym następują opcje formatowania, ilośd znaków przeznaczonych do wyświetlenia oraz typ danej do wyświetlenia (przy czym tylko trzeci element – tj. typ danych jest wymagany). Typ danej sygnalizujemy pojedynczą literą. I tak: Litera s oznacza napis (konwertuje każdy typ danych na tekst), np.: print "%s" % 1 Proszę sprawdzid, co będzie rezultatem wykonania kodu: print "%s" % range(6) A co: print "%s" % "txt" ? Litera c oznacza pojedynczy znak w kodzie ASCII, np.: print "%c" % "A" Sprawdź jaki znak zostanie wyświetlony po wykonaniu kodu: print "%c" % 077? A jaki dla kodu: print "%c" % 33 Litera i oznacza dziesiętną liczbę całkowitą (konwertuje kompatybilny typ danych na liczbę całkowitą), np.: print "%i" % 0xff co da w efekcie 255 A co da w efekcie: print "%i" % 2.2 Albo print "%i" % "11" Litera f oznacza liczbę zmiennopozycyjną w postaci ułamka dziesiętnego, np.: print "%f" % 123 Co da w efekcie 123.000000 A co będzie wynikiem kodu: print "%f" % 1.23 ? Ustalenie długości pola do wyświetlenia tekstu Czasami istnieje potrzeba wyświetlenia tekstu w określonej formie: np. kolumnowej. Wtedy można prawdziwie dostrzec zalety formatowania. Jeżeli chcemy ustalid długośd wyświetlenia każdej liczby np. na wartośd 4 wystarczy użyd następującej formy: print "%4i” % x for x in range(1,10,1): print "%4i" % x Formatując liczby zmiennopozycyjne możemy także ustalid nie tylko całkowitą długośd, ale także liczbę wyświetlanych miejsc po przecinku (np. na 3): for x in range(5,100,10): print "Pierwiastkiem liczby %2i jest %5.3f" % (x,x**0.5) Zadania do wykonania w tym momencie: 1. wyświetlid liczby oraz ich kwadraty (od 1 do 10), przy czym liczby bez kwadratów na długości 4 znaków, a ich kwadraty na długości 6 cyfr. Pętle zagnieżdżone Pętle mogą zawierad inne pętle – mówimy wtedy o nich, że są zagnieżdżone. Spróbujmy wygenerowad tabliczkę mnożenia: for x in range(1,11): print # przejście do nowego wiersza for y in range(1,11): print "%3i" % (x*y) Etap 3. Łaocuchy znaków Metody Listy list(s) - konwertuje sekwencję s na listę s.append(x) - dodaje nowy element x na koocu s s.count(x) - zlicza wystąpienie x w s s.index(x) - zwraca najmniejszy indeks i, gdzie s[i] == x s.pop([i]) - zwraca i-ty element i usuwa go z listy. Jeżeli nie podamy parametru to usunięty zostanie ostatni element s.remove(x) - odnajduje x i usuwa go z listy s s.reverse() - odwraca w miejscu kolejnośd elementów s s.sort([funkcja]) - Sortuje w miejscu elementy. "funkcja" to funkcja porównawcza s.find(s1) – szuka gdzie w lancuchu 3 wystapil lancuch s1 Metody Napisowe s.capitalize() - zmienia pierwszą literę na dużą s.center(długośd) - Centruje napis w polu o podanej długości s.count(sub) - zlicza wystąpienie podciągu sub w napisie s s.isalnum() - sprawdza czy wszystkie znaki są alfanumeryczne (a więc: cyfry i litery "a"-"z", "A"-"Z", "0"-"9") s.isdigit() - sprawdza czy wszystkie znaki są cyframi s.islower() - sprawdza czy wszystkie litery są małe s.isupper() - sprawdza czy wszystkie litery są duże s.join(t) - łączy wszystkie napisy na liście t używając s jako separatora l = ['a', 'b', 'c'] s = '.' print s.join(l) s.lstrip() - usuwa początkowe białe znaki s.replace(old, new) - zastępuje stary podciąg nowym s.rstrip() - usuwa koocowe białe znaki s.split(separator) - dzieli napis używają podanego separatora s.strip() - usuwa początkowe i koocowe białe znaki print "ala ma kota a kot ma alę".islower() True print "ala ma kota a kot ma alę".isalpha() False Python odpowie nam na nasze pytania, zwracając True (czyli „Prawda”) lub False (czyli „fałsz”). Ostatnie porównanie sprawdzało, czy nasze zdanie zawarte w napisie „ala ma kota a kot ma alę” składa się wyłącznie z liter. Niestety, występują tam spacje - stąd wartośd False. Metoda Split jest bardzo użyteczna Metoda ta zwraca listę wszystkich słów w łaocuchu, stosując *str+ jako separator. Dzieli ona wszystkie wyrazy w łaocuchu oddzielone białą spacją. Można też wybrad ile podziałów ma byd dokonanych i za to odpowiada parametr *num+. Składnia jest następująca: str.split(str="", num=string.count(str)) Efektem wykonania następującego kodu: str = „222-066-68-83” print str.split('-'); będzie: ['222', '066', '68', '83'] Zadania do wykonania z drugiej części zajęd: 1. Sprawdź, na którym miejscu znajduje się rule w tekście: "Three Rings for the Elven-kings under the sky,| Seven for the Dwarf-lords in their halls of stone, Nine for Mortal Men doomed to die, One for the Dark Lord on his dark throne In the Land of Mordor where the Shadows lie.< ;br /> One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them In the Land of Mordor where the Shadows lie". Rozwiązania print """Three Rings for the Elven-kings under the sky, ... Seven for the Dwarf-lords in their halls of stone, ... Nine for Mortal Men doomed to die, ... One for the Dark Lord on his dark throne ... In the Land of Mordor where the Shadows lie. ... One Ring to rule them all, One Ring to find them, ... One Ring to bring them all and in the darkness bind them ... In the Land of Mordor where the Shadows lie""".find('rule') 256 2. Ile razy występuje w nim słówko Ring? print """Three Rings for the Elven-kings under the sky, ... Seven for the Dwarf-lords in their halls of stone, ... Nine for Mortal Men doomed to die, ... One for the Dark Lord on his dark throne ... In the Land of Mordor where the Shadows lie. ... One Ring to rule them all, One Ring to find them, ... One Ring to bring them all and in the darkness bind them ... In the Land of Mordor where the Shadows lie""".count('rule') 1 3. Wczytaj pełne imię użytkownika. Jeżeli jego ostatnia litera to 'a', wypisz komunikat, że jest kobietą. Co się stanie jeżeli użytkownik wpisze swoje imię wielkimi literami? Rozwiąż ten problem na dwa sposoby. Wskazówka: użyj odpowiedniej metody. imie = input('Podaj swoje pełne imię: ') if imie[-1] == 'a' or imie[-1] == 'A': print('Jesteś kobietą') Etap 3. Listy i pętla for Krotki posiadają jedną wadę - są niezmienne (jednak dzięki temu szybsze). Tej przypadłości nie posiadają listy (ang. list), które po stworzeniu możemy edytowad. Tworząc listę, używamy nawiasów kwadratowych. >>> lista = ['Ala', 'Basia'] >>> lista[0] 'Ala' >>> lista[-1] 'Basia' >>> lista[:1] ['Ala', 'Basia'] >>> lista.index('Basia') 1 >>> for imie in lista: ... print(imie) ... Ala Basia Możemy również analogicznie odwoływad się do kolejnych elementów oraz fragmentów. Również pętla for działa identycznie, jak dla krotek. Listy jednak pozwalają nam podmieniad swoje elementy i sortowad je. print lista.insert(1,’Jasio') ['Ala', 'Jasio', 'Basia'] print lista.append('Kazio') # Dodaj Kazia na koniec listy ['Ala', 'Jasio', 'Basia', 'Kazio'] print lista.pop(2) # Usuń Basię z listy ['Ala', 'Jasio', 'Kazio'] print lista.extend(['Jasio', 'Adam', 'Rafał']) # Rozszerz listę o kolejne osoby ['Ala', 'Jasio', 'Kazio', 'Jasio', 'Adam', 'Rafał'] print lista.sort() # Posortuj ['Adam', 'Ala', 'Jasio', 'Jasio', 'Kazio', 'Rafał'] print lista.reverse() # Odwróć ['Rafał', 'Kazio', 'Jasio', 'Jasio', 'Ala', 'Adam'] print lista.count('Jasio') # Ilu mamy Jasiów? 2 print len(lista) # Ilość elementów 6 Oczywiście, możemy także używad ich w głównych rolach z pętlą for tak samo jak krotki. for element in lista: print(element) Rafał Kazio Jasio Jasio Ala Adam Numerowanie pętli Python może również numerowad nam kolejne przebiegi pętli. Efekt ten uzyskujemy dzięki funkcji enumerate. for nr, element in enumerate(lista): print("Przebieg pętli", nr, "element", element) Przebieg Przebieg Przebieg Przebieg Przebieg Przebieg pętli pętli pętli pętli pętli pętli 0 1 2 3 4 5 element element element element element element Rafał Kazio Jasio Jasio Ala Adam Opcjonalny drugi parametr pozwala na podanie liczby, od której startujemy. for nr, element in enumerate(lista, 1): print("Przebieg pętli", nr, "element", element) Przebieg Przebieg Przebieg Przebieg Przebieg pętli pętli pętli pętli pętli 1 2 3 4 5 element element element element element Rafał Kazio Jasio Jasio Ala Przebieg pętli 6 element Adam Zapis nr, element to nic innego, jak zapisanie dwuelementowej krotki zwracanej przez enumerate do dwóch zmiennych: nr i element. Stringi w pętli for for literka in "abcdefghijk123ABC": print(literka) a b c d e f g h i j k 1 2 3 A B C Zadania do wykonania: 1. Wczytaj od użytkownika listę wyrazów. Następnie wyświetl je posortowane alfabetycznie. 2. Wczytaj od użytkownika listę wyrazów. Następnie wyświetl je w odwrotnej kolejności. Rozwiązanie zadania 1: wyrazy = raw_input("podaj wyrazy: ") wyrazy = wyrazy.split(',') print wyrazy wyrazy.sort() print wyrazy Efekt wykonania następujący: podaj wyrazy: ewa,ela,ola,ala ['ewa', 'ela', 'ola', 'ala'] ['ala', 'ela', 'ewa', 'ola'] Tuple Tuple jest to zbiór elementów, nie możemy go sortowad ani nie możemy wykonywad innych bardziej skomplikowanych metod. tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 tinytuple = (123, 'john') print print print print print print tuple # tuple[0] # tuple[1:3] # tuple[2:] # tinytuple * 2 # tuple + tinytuple ) wyświetli całą listę wyświetli tylko 1 element listy Wyświetli elementy od 2 do 4 w kolejności wyświetli elementy zaczynając od 3-go wyświetli listę dwa razy # wyświetli połączone listy Wynik: ('abcd', 786, 2.23, 'john', 70.200000000000003) abcd (786, 2.23) (2.23, 'john', 70.200000000000003) (123, 'john', 123, 'john') ('abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john') To w przypadku Tuple jest niepoprawne, gdyż próbujemy zaktualizowad tuple – a to jest niedozwolone działanie. Listy Lista to rozbudowana wersja tuple. Listę możemy sortowad, kasowad z niej elementy. list = [ 'abcd', 786 , 2.23, 'john', 70.2 ] tinylist = [123, 'john'] print print print print print print list # list[0] # list[1:3] # list[2:] # tinylist * 2 # list + tinylist wyświetli całą listę „lista” wyświetli tylko 1 element listy Wyświetli elementy od 2 do 4 w kolejności wyświetli elementy zaczynając od 3-go wyświetli listę dwa razy # wyświetli połączone listy Wynik: ['abcd', 786, 2.23, 'john', 70.200000000000003] abcd [786, 2.23] [2.23, 'john', 70.200000000000003] [123, 'john', 123, 'john'] ['abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john'] Słowniki Słowniki podobne są do list, by wyświetlid określony wpis wystarczy podad jego klucz nazwa_słownika*"nazwa_klucza"+. Podany przykład iteracji zwraca pod zmienną i nazwę klucza tak więc by wyświetlid i klucze i wartości musieliśmy użyd również nazwa_słownika*"nazwa_klucza"+. Słownik należy traktowad jak listę zawierającą obiekty poindeksowane za pomocą kluczy. bar = {"imie" : "jurek", "nazwisko" : "lepper"} print bar["imie"] for i in bar: print i + " - " +bar[i] nazwa = { "klucz" : "wartość", "klucz" : "wartość" } Efekty będzie następujący: jurek imie - jurek nazwisko – Lepper Próba odwołania się do nieistniejącego klucza spowoduje błąd wykonywania skryptu. Jeżeli może zdarzyd się sytuacja że klucz może nie istnied to warto skorzystad z metody słownika has_key: if bar.has_key("imie"): print bar["imie"] dict = {} dict['one'] = "This is one" dict[2] = "This is two" tinydict = {'name': 'john','code':6734, 'dept': 'sales'} print print print print print dict['one'] dict[2] tinydict tinydict.keys() tinydict.values() # # # # # wyświetli wyświetli wyświetli wyświetli wyświetli wartość dla klucza ‘one’ wartość dla klucza 2 cały słownik wszystkie klucze wszystkie elementy Wynik This is one This is two {'dept': 'sales', 'code': 6734, 'name': 'john'} ['dept', 'code', 'name'] ['sales', 6734, 'john'] Zadania do wykonania z części pierwszej zajęd: 1. Napisz program wypisujący Inwokację z Pana Tadeusza. Zadbaj o poprawne łamanie wierszy. Zadanie wykonaj na dwa sposoby: raz korzystając z jednej funkcji print, drugi raz skorzystaj z niej dla każdej linii wiersza. Rozwiązanie: # Metoda pierwsza print('''Litwo! Ojczyzno moja! ty jesteś jak zdrowie; Ile cię trzeba cenić, ten tylko się dowie, Kto cię stracił. Dziś piękność twą w całej ozdobie Widzę i opisuję, bo tęsknię po tobie.''') # Metoda druga print('Litwo! Ojczyzno moja! ty jesteś jak zdrowie;') print('Ile cię trzeba cenić, ten tylko się dowie,') print('Kto cię stracił. Dziś piękność twą w całej ozdobie') print('Widzę i opisuję, bo tęsknię po tobie.') 2. Wczytaj od użytkownika imię, nazwisko i jego wiek, a następnie wypisz te informacje jedna pod drugą w trzech kolejnych linijkach. Rozwiązanie imie = input('Podaj swoje imię: ') nazwisko = input('Podaj swoje nazwisko: ') wiek = input('Podaj swój wiek: ') print(imie) print(nazwisko) print(wiek) 3. Zapytaj użytkownika o ostatnią literę jego pełnego imienia. Jeżeli jest ona równa literce 'a', wypisz komunikat 'Jesteś kobietą '. Rozwiązanie ostatnia_litera = input('Podaj swoją ostatnią literę pełnego imienia: ') if ostatnia_litera == 'a': print('Jesteś kobietą') 4. Wypisz w pętli kwadraty liczb od 1 do 199 włącznie. for i in range(1, 200): print(i * i) 5. Z użyciem pętli wyświetl 100 razy napis 'Nie będę więcej jadł kredy na lekcjach'. for i in range(100): print('Nie będę więcej jadł kredy na lekcjach') 6. Sprawdź czy w Pythonie zachowywana jest kolejnośd działao w wyrażeniach wykorzystujących mnożenie i dodawanie. wynik = 2 + 2 * 2 print(wynik) # 6 - jest zachowywana Słowniki i pętle for Do deklaracji słownika (ang. dictionary) używamy nawiasów klamrowych. slownik = {'imie': 'Jan', 'nazwisko': 'Kowalski', 'wiek': 12, 'zawód': 'spawacz'} for klucz, wartosc in slownik.items(): ... print(klucz + ': ' + str(wartosc)) ... imie: Jan nazwisko: Kowalski wiek: 12 zawód: spawacz Słownik przetrzymuje pary wartości: nazwę pola (ang. keyword) oraz jego wartośd (ang. value). Poza metodą items(), która zwraca kolejne pary klucz-wartośd, można wyświetlid w pętli również same klucze lub same wartości. for klucz in slownik.keys(): print(klucz) imie nazwisko wiek zawód for wartosc in slownik.values(): print(wartosc) Jan Kowalski 12 spawacz Klasa słownika definiuje również wiele dodatkowych metod pozwalających aktualizowad dane, usuwad czy pobierad wartości kluczy. print słownik {'imie': 'Jan', 'nazwisko': 'Kowalski', 'wiek': 12, 'zawód': 'spawacz'} slownik.clear() # Wyczyszczenie zawartości słownika print slownik {} slownik.update({'literka': 'a', 'cyferka': 7}) # Aktualizacja słownika o nowe wartości print slownik {'cyferka': 7, 'literka': 'a'} slownik.update(zwierzatko='kot', kolor='blekitny') # Aktualizacja słownika o nowe wartości print slownik {'kolor': 'blekitny', 'zwierzatko': 'kot', 'cyferka': 7, 'literka': 'a'} print slownik.get('cyferka') # Pobranie wartości przypisanej do klucza 'cyferka' 7 print slownik['literka'] # Pobranie wartości przypisanej do klucza 'literka' 'a' slownik.pop('literka') # Pobranie z równoczesnym usunięciem ze słownika print slownik {'kolor': 'blekitny', 'zwierzatko': 'kot', 'cyferka': 7} del slownik['cyferka'] # Usunięcie ze słownika print slownik {'kolor': 'blekitny', 'zwierzatko': 'kot'} print len(slownik) # Ilość elementów