Programowanie skryptowe w języku Python. Część 2 — funkcje i
Transkrypt
Programowanie skryptowe w języku Python. Część 2 — funkcje i
Programowanie skryptowe w języku Python. Część 2 — funkcje i słowniki Piotr Błaszczyk Szczecin, 2007-2008 1 Cel Nauka pisania programów w języku Python wykonywanych w postaci skryptów. Poznamy też sposób tworzenia własnych funkcji oraz nowe struktury danych: słowniki. 2 Wprowadzenie Na poprzednich zajęciach pracowaliśmy w sposób interaktywny z interpreterem Python uruchomionym w powłoce systemu Linux poleceniem python. Takie wywołanie oznacza otwarcie „sesji”, w trakcie której wpisujemy kod w linii poleceń i wykonujemy go natychmiast klawiszem Enter. Interpreter zapamiętuje wykonywane czynności oraz zmienne i przypisane im wartości, ale tylko na czas trwania danej sesji. Po zamknięciu sesji wszystkie zmienne i dane są bezpowrotnie tracone, dlatego jeśli mamy wykonać bardziej pracochłonne czynności, lepiej umieścić cały kod w pliku tekstowym. Plik ten, napisany w dowolnym edytorze (np. gedit), przekażemy do wykonania przez interpreter Python odpowiednim poleceniem w powłoce Linux (w terminalu). Rysunek 1: Okno edytora gedit z kodem stryptu 1 Zacznijmy od stworzenia pliku w folderze domowym (/home/student), najlepiej przy pomocy edytora gedit, podobnie jak w ćwiczeniu z formatowaniem tekstu w LATEX. Otwieramy terminal i wpisujemy następujące polecenie: $ gedit skrypt.py & co otwiera edytor gedit, wraz z buforem1 o nazwie skrypt.py (rozszerzenie nazwy pliku, .py, jest nadawane zupełnie arbitralnie). Przypomnijmy, że ampersand (&) na końcu linii powoduje otwarcie programu w tle, w związku z czym będziemy mogli w dalszej części używać powłoki Linux. Do edytora wpisujemy proste działanie: print 8*7 zapisujemy plik (skrót Ctrl+s), przechodzimy do terminala i wpisujemy polecenie: $ python skrypt.py po czym wciskamy Enter. Polecenie print skutkuje wyświetleniem wyniku działania interpretera. Powyższe wyrażenie oznacza, że uruchamiamy interpreter python i przekazujemy mu do wykonania kod w pliku skrypt.py. Po wykonaniu skryptu interpreter zostaje zamknięty. Rysunek 2: Okno terminala z wyjściem stryptu Umieść nowy kod w tym samym pliku. Możesz dopisać go w postaci nowych linii pod spodem, a stare przykłady możesz „wykomentować” znakiem # stawianym na początku wiersza (rysunek 1). #To jest komentarz, ignorowany przez interpreter #Oto nieuzywany kod z poprzedniego cwiczenia: #print 8*7 #A tu nowy kod programu, ktory podzieli a przez b: a, b = 876, 14.7 print a, b print a/b 1 To jeszcze nie plik, gdyż nie został zapisany na dysku twardym, a jedynie rezyduje w pamięci operacyjnej, dlatego zwie się „buforem”. 2 W skrypcie tym mamy dwie zmienne, a i b, którym przypisujemy odpowiednio liczbę całkowitą (876) i liczbę rzeczywistą (14.7 — używamy kropki dziesiętnej, a nie przecinka). Zauważ, że deklaracja obu zmiennych i przypisanie im wartości nastąpiło w jednej linii. Następnie polecamy, aby program pokazał zawartość obu zmiennych. W trzeciej linii zaprogramowano dzielenie poprzedzone poleceniem print, które zwróci wynik tego działania (59.5918367347) na ekran w momencie wykonania skryptu: $ python skrypt.py 876 14.7 59.5918367347 Wyjście skryptu można też odpowiednio sformatować, aby zamiast suchej liczby otrzymać bardziej opisowe zdanie. W opracowywanym pliku wstaw poniższą linię; zwróć uwagę, że wartości tekstowe od liczbowych oddzielono przecinkami (zobacz też rysunek 2): print "Efektem dzielenia liczby",a,"przez",b,"jest liczba",a/b Do zmiennych a i b przypisano wartości już w trakcie programowania. Możemy jednak zezwolić użytkownikowi na przypisanie wartości do zmiennych w trakcie wykonania programu (w sposób interaktywny). Do tego służy funkcja input(“komunikat“). Zamiast „twardej” deklaracji zmiennych a i b, w skrypcie umieszczamy co następuje: a = input("Podaj 1. liczbe: ") b = input("Podaj 2. liczbe: ") Nasz program potrafi nadal jedynie dzielić przez siebie liczby, ale stał się bardziej elastyczny, gdyż „współpracuje” z użytkownikiem i oczekuje, że ten sam wprowadzi dane z klawiatury: $ python skrypt.py Podaj 1. liczbe: <tu użytkownik wpisuje np. 2343> Podaj 2. liczbe: <tu użytkownik wpisuje np. 23.5> Efektem dzielenia liczby 2343 przez 23.5 jest liczba 99.7021276596 Oczywiście, podane w powyższym przykładzie liczby, tj. 2343 i 23.5 zostały wpisane z klawiatury (standardowe „wejście”, czyli input) w trakcie wykonania programu). Jeżeli użytkownik będzie miał wpisać ciąg znaków, np. swoje imię, lepiej jest użyć funkcji raw input(”komunikat“). Funkcja ta zawsze zwraca wartość typu string, czyli łańcuch znaków: imie = raw_input("Podaj imie ") nazwisko = raw_input("Podaj nazwisko ") print "Nazywasz sie ",imie,nazwisko 2.1 Zadania 1. Sporządź skrypt Pythona o nazwie hello.py, który zapyta użytkownika o imię i powita go w następujący sposób: $ python hello.py Jak masz na imie: "Piotr" Witaj w swiecie bioinformatyki, Piotr 2. Powyższy skrypt wzbogać o obliczanie wieku użytkownika na podstawie podanego roku urodzenia: $ python hello.py Jak masz na imie: Anka Witaj w swiecie bioinformatyki, Anka Podaj rok Twojego urodzenia: 1987 Masz lat 20 Anka 3 3 Definiowanie własnych funkcji Na poprzednim ćwiczeniu poznaliśmy niektóre funkcje wbudowane w język Python, np. funkcja len(string) służyła nam do określania długości ciągu znaków string. Okazało się również, że za pomocą metody replace() możemy łatwo dokonać zamiany pojedynczej nici DNA na nić RNA, gdyż różnica między ich sekwencjami polega na tym, że w nici RNA występuje uracyl zamiast tyminy. W nowym pliku o nazwie DNAnaRNA.py zdefiniujemy własną funkcję, która będzie zamieniać te zasady w danej sekwencji DNA2 : def podmien_zasady(dna): return dna.replace(’T’,’U’) print podmien_zasady("GGGTTCCTTATGAA"); Słowo kluczowe def oznacza definiowanie funkcji o nazwie podmien zasady, której argumentem jest ciąg znaków przypisany zmiennej dna i która to funcja zwraca (return) dany ciąg znaków z „U” w miejscu gdzie było „T”. Ostatni wiersz (print...) stanowi właśnie zastosowanie tej funkcji. Zwróć uwagę na wcięcie, od którego rozpoczyna się drugi wiersz funkcji (return...). Jeżeli tego nie zastosujemy interpreter zwróci błąd. To wcięcie (spacje lub tabulatory) jest elementem składni Pythona i tworzy tzw. blok, który w tym wypadku obejmuje definicja funkcji podmien zasady. Wiersz kolejny, zaczynający się od print... nie ma wcięcia, więc nie należy do bloku i interpreter nie odczytuje go jako elementu definicji funkcji. Wykonując powyższy kod przekazujemy sekwencję DNA „GGGTTCCTTATGAA” funkcji podmien zasady i efektem jej działania jest sekwencja RNA: $ python DNAnaRNA.py GGGUUCCUUAUGAA Innym przykładem jest odwracanie sekwencji, które w trybie interaktywnym przebiegałoby w kilku etapach z użyciem dodatkowej zmiennej oraz listy, która dysponuje metodą reverse(). Metoda ’separator’.join(lista) służy do łączenia elementów listy w ciąg znaków przy użyciu separatora; ponieważ w przykładzie poniżej chcemy połączyć elementy listy ze sobą bezpośrednio, posługujemy się łańcuchem zerowym (dwa apostrofy) jako separatorem: >>> dna = "TGACCACTT" >>> dna_lista = list(dna) >>> dna_lista.reverse() >>> dna_odwr = ’’.join(dna_lista) >>> dna_odwr ’TTCACCAGT’ Sporządzimy następującą funkcję do odwracania sekwencji, która pomieści wszystkie te etapy, i zapiszemy ją w nowym pliku odwroc.py: def odwroc(dna): dna_lista = list(dna) dna_lista.reverse() return ’’.join(dna_lista) print "CCGGAAGTT" print odwroc("CCGGAAGTT") Następnie uruchamiamy ten skrypt w terminalu: $ python odwroc.py CCGGAAGTT TTGAAGGCC 2 Doprowadzi nas w końcu do stworzenia programu zdolnego do dokonania transkrypcji, czyli syntezy RNA w oparciu o matrycę DNA 4 3.1 Zadania 1. W skrypcie DNAnaRNA.py zamieść możliwość wpisywania z klawiatury dowolnej sekwencji DNA w trakcie wykonywania programu tak, aby program ten stał się uniwersalnym narzędziem do przekształcania sekwencji DNA na RNA. Efekt powinien wyglądać następująco (lub podobnie): $ python DNAnaRNA.py DNA: "TGACCACTTTACGAGGTTAGC" RNA: UGACCACUUUACGAGGUUAGC 2. To samo wykonaj dla skryptu odwroc.py. 4 Słowniki Python W celu znalezienia komplementarnej sekwencji DNA, musimy najpierw znaleźć sposób na mapowanie każdej z zasad do swej pary komplementarnej. W języku Python umożliwiają to typy danych zwane słownikami (dictionaries). Słownik Python jest podobny w założeniu do zwykłego słownika, w którym możemy szybko odnaleźć daną definicję (wartość, value) przy pomocy słowa kluczowego (klucz, key). Słownik to lista par klucz:wartość zawarta w nawiasie klamrowym, a wartości lokalizujemy poprzez klucze, a nie — jak to miało miejsce w przypadku list — za pomocą indeksów. Oto przykładowe słowniki: pierwiastki = {’H’: ’wodór’, ’O’: ’tlen’, ’N’: ’azot’, ’C’: ’węgiel’} KomplZasady = {’A’: ’T’, ’C’: ’G’, ’T’: ’A’, ’G’: ’C’} Zapiszemy ten drugi słownik w pliku kompl.py i zażądamy, by skrypt zwrócił nam klucze i wartości słownika w porządny, sformatowany sposób: KomplZasady = {’A’: ’T’, ’C’: ’G’, ’T’: ’A’, ’G’: ’C’} print "klucze:",KomplZasady.keys() print "wartosci:",KomplZasady.values() Chcąc dowiedzieć się, jaka zasada jest komplementarna wobec adeniny, korzystamy ze słownika w następujący sposób: print KomplZasady[’A’] 4.1 Zadania 1. Przekształć skrypt kompl.py w taki sposób, aby za jego pomocą użytkownik mógł dowiedzieć się jaka zasada jest komplementarna wobec tej, którą wpisał w linii poleceń skryptu. Efektem powinno być coś w stylu: $ python kompl.py Podaj zasade: ’T’ Zasada komplementarna do: T to A 2. Sporządź skrypt zawierający słownik stolic krajów UE oraz możliwość interaktywnego wynajdywania nazwy stolicy wg nazwy państwa. Zachowaj go pod nazwą stoliceue.py w folderze domowym. 5 5 Literatura uzupełniająca Więcej informacji na temat języka Python: • http://pl.wikipedia.org/wiki/Python — opis języka Python w Wikipedii • http://www.python.org/ — strona oficjalna projektu (ang.) • http://wiki.python.org/moin/BeginnersGuide (ang.) • http://docs.python.org/tut/tut.html — Python Tutorial (ang.) • http://www.pasteur.fr/formation/infobio/python/ — Introduction to Programming using Python (ang.) • http://docs.python.org/ref/ref.html — Python Reference Manual (ang.) Więcej informacji na ten temat programowania w biologii molekularnej: • http://www.onlamp.com/pub/a/python/2002/10/17/biopython.html — wstęp do języka Python dla bioinformatyków • http://www.pasteur.fr/recherche/unites/sis/formation/python/ — Python course in Bioinformatics (ang.) 6