Bioinformatik für Biochemiker Oliver Kohlbacher, Steffen Schmidt SS 2010 4. Python Basics Abt. Simulation biologischer Systeme WSI/ZBIT, Eberhard Karls Universität Tübingen
Überblick Python Datentypen Kontrollstrukturen Funktionen Module Beispiel Verwendung zum Vergleich von Sequenzen
Ähnlichkeit zweier Sequenzen Wie kann man die Ähnlichkeit zweier Sequenzen beschreiben? Einfachste Möglichkeit: Zählen identischer Zeichen GATCGTTCG CATGGTTGA Problem: Was bei Sequenzen unterschiedlicher Länge? GATCGTTCG GATCGTTCG GATCGTTCG GGTTGA G---GTT-GA GGTTGA Ähnlichkeit: 3 5 0 Ähnlichkeit bei dieser einfachen Definition vom gewählten Alignment abhängig! Welches ist das richtige Alignment?
Algorithmen Gegeben: Zwei Sequenzen A, B mit A = B auf dem Alphabet Σ = {A, C, G, T, -} Eine Distanzfunktion d : Σ x Σ R Berechne die Distanz d(a, B) wie folgt: distanz 0 Für i = 1 A : distanz distanz + d(a i, b i ) Gib Wert von distanz aus Zuweisung Schleife Zuweisung Ausgabe
Auswertung von Ausdrücken
Auswertung von Ausdrücken >>> a = 4 >>> b = 'ACTG' >>> a + b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' >>> b + a Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects Python hat verschiedene Typen für Daten die in Variablen gespeichert sind int / float für numerischen Daten (ganze Zahlen und Fließkommazahlen) str für Zeichenketten (Strings) Operator ist nicht (immer) kompatibel für Variablen unterschiedlichen Typs (was ist die Summe eines Strings und einer Zahl?)
Datentypen Addition von einem int Datentyp mit einem float Datentyp liefert gewünschtes Ergebnis Division von zwei Ganzzahlen liefert wiederum eine Ganzzahl! (Division ohne Rest) Will man die Division zweier reeller Zahlen, muss man Python mitteilen, dass es sich um solche handelt (ein Dezimalpunkt reicht: also 2. oder 2.0 statt 2)
Datentypen dir Funktion gibt Information über die vorhandenen Methoden eines Datentyps/Objekts
Datentypen help-funktion gibt Information über Methoden eines Datentyps/Objekts Damit kann man versuchen schnell im Interpreter Hilfe zu erhalten, wenn etwas nicht so funktioniert, wie gedacht
Python Listen Listen sind Aneinanderreihungen beliebiger Werte (genauer: Objekte), die man zusammenfassen will Viele Python-Funktionen akzeptieren Listen als Argumente Möchte man z.b. das Minimum von vier Werten berechnen, so definiert man eine Liste mit diesen Werten und ruft dann die Funktion min mit dieser Liste auf: l = [170, 55, 3, 244] print min(l) Listen definiert man in Python, indem man die einzelnen Werte in eckige Klammern schreibt Vorsicht: eckige Klammern hinter einer Variablen bedeuten den Zugriff mit einem oder mehreren Indices! Nicht verwechseln! Ergebnis dieses kurzen Programms ist natürlich 3
Listen Listen können beliebige Datentypen enthalten, z.b. Zahlen oder Strings l = [1, 2, 'ACT'] Man kann auch leere Listen definieren: l = [] Listen lassen auch die Indexoperationen wie bei Strings zu, ebenso kann man sie konkatenieren (mit dem Operator +) und mit print ausgeben Mit append lassen sich Elemente an die Liste anhängen, alternativ kann man das Element durch Konkatenation mit einer einelementigen Liste anfügen: l = [1, 2, 3] l.append(4) l = l + [5]
Listen Beispiele A = ['Hund', 'Katz', 'Maus'] B = ['Ratte', 'Nacktmull'] print len(a), len(b) print A + B print B + B print len(a + B) print A[:2] + B[2:] A[1] = B[1] print A A.append('Igel') print A A = A + B print A 3 2 ['Hund', 'Katz', 'Maus', 'Ratte', 'Nacktmull'] ['Ratte', 'Nacktmull', 'Ratte', 'Nacktmull'] 5 ['Hund', 'Katz'] ['Hund', 'Nacktmull', 'Maus'] ['Hund', 'Nacktmull', 'Maus', 'Igel'] ['Hund', 'Nacktmull', 'Maus', 'Igel', 'Ratte', 'Nacktmull']
Python Matrix Listen sind in Python nur eine von vielen Datenstrukturen Mit Hilfe von Arrays kann man große Mengen von Zahlen darstellen Sowohl eindimensionale ( Vektoren ), als auch zweidimensionale ( Matrizen ) oder mehrdimensionale Arrays (allgemeine Tensoren) sind möglich Diese Arrays sind in Python nicht in der Sprache selbst verankert, sondern werden von einem externen Modul namens numpy (Numerical Python) zur Verfügung gestellt, das separat installiert werden muss Dafür stellt numpy Ihnen sehr schnelle und einfache Operationen aus der linearen Algebra (z.b. Matrixmultiplikationen) zur Verfügung, die Sie nicht mehr selbst implementieren müssen www.numpy.org
Python Matrix Eine Matrix kann man auf viele Arten erzeugen. Wir wollen die Matrix nicht nur erzeugen sondern am besten auch gleich mit Nullen füllen Das geht mit der Funktion numpy.zeros, deren Argument eine Liste mit der Größe in den jeweiligen Dimensionen ist import numpy # Lade Modul A = numpy.zeros([3]) # Definiert Vektor # der Länge 3 A[1] = 5 # Setzt 2. Element print A M = numpy.zeros([3,3]) # definiert eine 3x3-Matrix M[0,0] = M[1,1] = M[2,2] = 2 print M print A * M Ausgabe: [0 5 0] [[2 0 0] [0 2 0] [0 0 2]] [[ 0 0 0] [ 0 10 0] [ 0 0 0]]
Kontrollstrukturen Kontrollstrukturen bestimmen den logischen Fluss von Programmen Es gibt zwei Klassen von Kontrollstrukturen: Verzweigungen: if-else Schleifen: for, while Damit lassen sich alle möglichen Programmflüsse abbilden Im Gegensatz zu anderen Programmiersprachen (C++, Java) hat Python keine Mehrfachverzweigung (switch-case)
Python Bedingungen Bedingungen erlauben es Programmteile nur dann auszuführen, wenn eine bestimmte Bedingung erfüllt ist Die wichtigste Kontrollstruktur mit einer Bedingung ist if-else: if distanz < 5: print 'Distanz gering' else: print 'Distanz zu gross!' Man kann if-else auch auf mehrere Fälle (mit elif) erweitern: if distanz == 0: print 'Identisch.' elif distanz == 1: print 'Fast identisch.' else: print 'Nun ja.'
Python FOR-Schleifen FOR-Schleifen iterieren eine Schleifenvariable durch die Elemente eines Sequenztypen (z.b. List, String) Der Schleifenrumpf wird dabei für jeden Wert der Liste einmal durchlaufen Für eine leere Liste wird der Rumpf entsprechend nicht durchlaufen Man kann ähnliches Verhalten mit unterschiedlichen Konstrukten erhalten s = 'ABCD' s = 'ABCD' for x in s: print x for x in range(len(s)): print s[x] Der linke Code ist kompakter, tut aber im wesentlichen das gleiche wie der rechte Möchte man aber auch die Position des Buchstabens in der Sequenz ausgeben ist die rechte Variante geschickter
Python WHILE-Schleifen WHILE-Schleifen iterieren so lange eine bestimmte Bedingung erfüllt ist Vor jedem Durchlauf wird dabei die Bedingung im Schleifenkopf getestet, ist sie erfüllt wird der Rumpf ausgeführt Man kann damit ähnliche Dinge erzielen wie mit einer FOR- Schleife, ist aber nicht an Sequenztypen gebunden s = 'ABCD' i = len(s) - 1 while i >= 0: s = 'ABCD' for x in range(len(s)): print s[len(s) - x - 1] print s[i] i = i - 1 Ob eine FOR- oder eine WHILE-Schleife die geschicktere Variante ist, hängt ganz vom Einzelfall ab
Verschachtelte Schleifen Schleifen können auch ineinander geschachtelt werden Der Rumpf der ersten (äußeren) Schleife beinhaltet dann die zweite (innere) Schleife Beispiel: Ausgabe aller Worte der Länge 3 auf Σ DNA : sigma = 'ACGT' for i in sigma: for j in sigma: for k in sigma: # äußere Schleife # zweite Schleife # innerste Schleife print i + j + k
Funktionen Funktionen in Programmiersprachen sind ähnlich zu mathematischen Funktionen, es gibt jedoch einige Unterschiede Prinzipiell verwendet man Funktionen um häufig benutzten Code nicht mehrmals schreiben zu müssen Funktionen sind abgeschlossene Codestücke, denen Argumente übergeben werden und die einen Rückgabewert haben können In Python werden Funktionen mit Hilfe des def-schlüsselwortes definiert Funktionen haben einen Namen, eine Liste von Argumenten und einen Codeblock der die eigentliche Rechnung durchführt Beispiel: Eine Funktion, die zu einer Zahl deren doppelten Wert zurückliefert def doppelt(x): return 2 * x print doppelt(4) Das Schlüsselwort return definiert dabei den Rückgabewert der Funktion
Funktionen Fibonacci-Zahlen: unendliche Folge, die das Wachstum einer Kaninchenpopulation beschreibt (Leonardo Fibonacci, 1202) Definition: Dies kann als rekursive Funktion geschrieben werden, also eine Funktion, die sich selbst wieder aufruft: def fib(x): if x == 0: return 0 if x == 1: return 1 return fib(x-1) + fib(x-2) for i in range(10): print fib(i) http://www.bbc.co.uk/radio4/science/media/5nbunnies.jpg
Distanzberechnung Wir versuchen nun unseren Algorithmus aus dem Pseudocode in Python umzusetzen Dazu sollte die Distanzfunktion d als Funktion implementiert werden Wir wählen als einfache Distanzfunktion die Identität Summation über die Spalten des Alignments implementieren wir als for-schleife distanz 0 Für i = 1 A : distanz distanz + d(a i, b i ) Gib Wert von distanz aus
Alignmentdistanzen in Python # Einfache Berechnung von Alignmentdistanzen A = 'ACGT' B = 'A-GT' distanz = 0 # Sequenzen im Alignment # Gesamtdistanz # Berechne fuer jede Position im Alignment # die Distanz und summiere sie for i in range(len(a)): d = 1 if (A[i] == B[i]): d = 0 distanz = distanz + d d(a, b) = print 'Distanz des Alignments:', distanz 0 : für a = b 1 : andernfalls
Alignmentdistanzen mit Fkt. # Einfache Berechnung von Alignmentdistanzen A = 'ACGT' # Sequenzen im Alignment B = 'A-GT' distanz = 0 # Gesamtdistanz # Definiere eine Funktion d(a, b) zur Distanzberechnung def d(a, b): if a == b: return 0 else: return 1 # Berechne fuer jede Position im Alignment # die Distanz und summiere sie auf for i in range(len(a)): distanz = distanz + d(a[i], B[i]) print 'Distanz des Alignments:', distanz
Module Module sind ein Weg Programme in kleinere, überschaubare Einheiten zu verteilen Dies verbessert die Wiederverwendbarkeit von Code: wenn jemand etwas praktisches geschrieben hat, kann jemand anderes den Code einfach in seinen Programmen verwenden Triviales Beispiel: Kreisumfang r = 5.6 pi = 3.1415 print "Umfang: ", 2 * pi * r from math import pi r = 5.6 print "Umfang: ", 2 * pi * r Die Zahl π ist im Modul math (das mit Python mitgeliefert ist) schon (in voller Genauigkeit!) definiert Das Kommando import lädt diese Funktionalität aus dem Modul math und macht pi damit verfügbar
Module Eigene Module kann man auch schreiben, dazu wird lediglich eine Python-Datei mit dem Namen des Moduls angelegt Das import-kommando kann dabei Teile eines Moduls laden (import x from y, siehe letzte Folie) oder das gesamte Modul # Modul Dist.py # Dieses Modul implementiert # Die Distanzfunktion d und # kann von anderen Programmen # verwendet werden. def d(a, b): if a == b: return 0 else: return 1 # Berechnung der Distanz import Dist # Lade Modul Dist A = `ACGT` B = `A-GG` d = 0 for i in range(len(a)): d = d + Dist.d(A[i], B[i]) # Die Distanzfunktion wird # über den Namen des Moduls # angesprochen: Dist.d
Vergleich VIELER Sequenzen Trennung von Daten und Programm Man möchte das Programm nicht jedes Mal verändern, wenn man andere Sequenzen vergleichen möchte Das Programm muss also die Sequenzen aus einer anderen Datei laden Der FASTA-Parser von BioPython bietet sich hier an, damit lassen sich beliebig viele Sequenzen mit wenig Aufwand laden: # Importiere FASTA-Parser von BioPython from Bio import SeqIO # Lese alle Sequenzen aus einer FASTA-Datei fasta_datei = open("many_sequences.fasta") all = list(seqio.parse(fasta_datei, "fasta")) # Ausgabe wieviele Sequenzen gelesen wurden print len(all),"sequenzen eingelesen."
Vergleich VIELER Sequenzen Beispiel: Gegeben viele Sequenzen gleicher Länge (z.b. alle möglichen Alignments mit einer bestimmten Anzahl Gaps) Lese alle Sequenzen aus einer Datei ein (Trennung von Daten/Programm!) Gib für jedes Paar von Sequenzen (wieviele?) die Distanz der Sequenzen aus > seq1 AATCGGA > seq2 ATCGA-- > seq3 -ATCGA- > seq4 A-TCGA- > seq5 --ATCGA > seq6 -ATC-GA > seq7 -A-TCGA > seq8 ATC--GA
Vergleich VIELER Sequenzen # Importiere FASTA-Parser von BioPython from Bio import SeqIO # Importiere Distanzfunktion from Dist import d # Lese alle Sequenzen aus einer FASTA-Datei fasta_datei = open("many_sequences.fasta") all = list(seqio.parse(fasta_datei, "fasta")) # Berechne alle Distanzen zwischen den Sequenzen for i in range(len(all)): for j in range(i + 1, len(all)): print i, j, d(all[i], all[j])
Literatur http://openbookproject.net/thinkcspy How to think like a computer scientist Mit Beispielen in Python! http://www.diveintopython.org Ein ganzes Buch zu Python zum freien Herunterladen! Hinweis: Sie können Python auch auf Ihrem eigenen Rechner unter Windows installieren: http://www.python.org