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

Podobne dokumenty