https://www.python.org// python Eine kurze Einführung Überblick • • • • • Wie geht programmieren ? • Beispiel: Turtle-Grafik python als Programmiersprache Grundelemente von Programmen • Schleifen,Verzweigungen, Funktionen Alternativen • ruby, scala, groovy Mini-Projekt Turtle Grafik Turtle Grafik Was kann die Turtle ? go(pixel), turn(grad), pen_up(), pen_down(), color("#rrggbb") Aufgaben Schleifen for i in range(6): go(60) turn(60) for Schleife wird für jedes Element einer wasauchimmer einmal ausgeführt >>> for i in [1,2,3]: ... print(2*i) ... 2 4 6 >>> >>> for c in "Hallo": ... print(c) ... H a l l o Aufgaben Verzweigungen Verzweigung führt Anweisung(en) abhängig von einer Bedingung aus pen_up() hebt den Stift an, pen_down() setzt ihn wieder auf >>> for i in range(4): ... print(i % 2) ... 0 1 0 1 >>> for i in range(4): ... if (i % 2 == 0): ... print("gerade") ... else: ... print("ungerade") ... gerade ungerade gerade ungerade L-Systeme def farn(len): if (len > 2): go(len) turn(25) farn(len * 0.5) turn(-35) farn(len * 0.7) turn(-25) farn(len * 0.4) turn( 35) go(-len) else: go( len) go(-len) width(1) farn(200) https://de.wikipedia.org/wiki/Lindenmayer-System http://www.kevs3d.co.uk/dev/lsystems/ The real thing … https://www.python.org/downloads/ Vertiefung http://hetland.org/writing/instant-hacking.html Aufgaben * *** ***** ******* ********* *********** • Gib ein Dreieck aus Sternchen aus • Gib die Anzahl der Wörter und Buchstaben in einem String aus python • 1991 entstanden, Guido van Rossum • REPL • mächtige Datentypen (Listen usw.) • Multi-Paradigmen-Sprache • dynamische Typisierung • plattformunabhängig dynamische, strenge Typisierung >>> i = "Hallo" # Ein String >>> i 'Hallo' >>> type(i) <type 'str'> >>> i = 1 # Eine Zahl >>> i 1 >>> type(i) <type 'int'> >>> print("Hallo" + i) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects >>> str(i) '1' >>> print("Hallo" + str(i)) Hallo1 >>> "Hallo %d" % i 'Hallo 1' Variablen >>> i = 1 >>> i 1 # Werden durch Zuweisung erzeugt >>> # CamelCase unüblich >>> ein_langer_name_ist_schoen = 1 >>> ein_langer_name_ist_schoen 1 >>> s = "Hallo" >>> s ‚Hallo' # Ein String >>> s.upper() ‚HALLO' >>> len(s) 5 >>> t = 'Welt' >>> t ‚Welt' >>> s + t 'HalloWelt' # Noch ein String # Verkettung von Strings Verzweigungen >>> i = 7 >>> i 7 # Eine (ungerade) Zahl >>> if (i % 2 == 0): print("gerade") else: print("ungerade") ungerade # Blöcke werden durch Einrückung definiert, vergleiche Java if (i % 2 == 0) { System.out.println(„gerade"); } # mehrere Wege ? i = 5 >>> if (i > 10): ... print("Groesser zehn") ... elif (i > 4): ... print("Groesser vier") ... else: ... print("Groesser null") ... Groesser vier Vergleichsoperatoren >>> i = 3 >>> if (i > 0): ... print("Treffer") ... Treffer >>> if (i >= 3): ... print("Treffer") ... Treffer >>> if (i != 5): ... print("Treffer") ... Treffer >>> if ((i > 0) and (i < 10)): ... print("Treffer") ... Treffer Die „üblichen Verdächtigen“: < > >= <= Kombination mehrerer Bedingungen mit: and or != not Listen >>> a = [1,2,"Hallo"] >>> a [1, 2, 'Hallo'] >>> len(a) 3 >>> a[0] 1 >>> a[2] 'Hallo' >>> a[3] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range >>> a.append("Welt") >>> a [1, 2, 'Hallo', 'Welt'] >>> a.pop() 'Welt' >>> a [1, 2, ‚Hallo'] >>> a.reverse() >>> a ['Hallo', 2, 1] Iterationen >>> for i in range(5): ... print(i) ... 0 1 usw. >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> while True: ... print("python ist toll“) ??? >>> i=5 >>> while (i>0): ... print i ... i=i-1 ... 5 4 3 2 1 STOP Back to the Praxis >>> Ich habe eine Nummer zwischen 1 und 20 gezogen, versuche, sie herauszufinden Dein Tip: 10 zu gross Dein Tip: 5 zu klein Dein Tip: 7 zu gross Dein Tip: 6 Glueckwunsch, Du hast 4 gebraucht Programm „zieht Zahl“, Mensch versucht zu erraten, dazu: from random import randint num = randint(1,20) print("Ich habe eine Nummer zwischen 1 und 20 gezogen, …") guess = int(input("Dein Tip: ")) while (guess != num): umgekehrt: Suche Dir eine Nummer zwischen 1 und 20 raus <Enter> Ist es 10 ? (r)ichtig/zu (k)lein/zu (g)ross g Ist es 5 ? (r)ichtig/zu (k)lein/zu (g)ross k Ist es 7 ? (r)ichtig/zu (k)lein/zu (g)ross r Ich habe 3 Versuche gebraucht Kennwörter Kennwörtern überprüfen: Tills-MacBook-Pro:python-examples till$ python3 pwd1.py Kennwort eingeben hello Kenwort richtig Kennwort eingeben world Kennwort falsch Kennwörter 2 Mit Hash-Funktion >>> def my_hash(s): ... h = 0 ... base = 1 ... for c in s: ... h += ord(c)*base ... base *= 26 ... return h ... >>> >>> my_hash("me") 2735 Kennwörter Qualität von Kennwörtern prüfen: Kennwort eingeben hello Das Kennwort ist zu kurz ! Muss mindestens drei aus (Kleinbuchstaben/Grossbuchstanden/Zahlen und Sonderzeichen enthalten) Bitte anderes Passwort wählen Kennwörter 2 Kennwörter mit brute force knacken >>> def my_hash(s): ... h = 0 ... base = 1 ... for c in s: ... h += ord(c)*base ... base *= 26 ... return h ... >>> >>> my_hash("me") 2735 >>> test = 2735 >>> alphabet_lower = "abcdefghijklmnopqrstuvwxyz" >>> for c in alphabet_lower: … Kennwörter 3 Erstellen Sie ein Programm, das "zufällige" Passwörter generiert. Der einfachste Ansatz wäre die Erzeugung einer zufälligen Zeichenkombination. Sich diese zu merken, wäre allerdings schwierig. Ein anderer Ansatz wäre eine zufällige Kombination von Silben. Wählen Sie aus einer Liste von Silben mehrere zufällig aus und kombinieren Sie diese zu einem Kennwort. Da nicht alle dieser "Wörter" leicht merkbar sind, erzeugen Sie eine Liste von 10 Kennwörtern, aus denen der Anwender dann aussuchen kann. Verbessern Sie die Qualität der Kennwörter dadurch, dass Sie zufällig einzelne Buchstaben durch Großbuchstaben ersetzen. Verbessern Sie die Qualität weiter, indem Sie einzelne Buchstaben durch Zahlen ersetzen und Satzzeichen einfügen. Die "Wörter" sind leichter aussprechbar, wenn bestimmte Regeln befolgt werden, dass etwa nicht zwei Vokale aufeinander folgen. Stellen Sie Ihr Programm entsprechend um. Vorgehen • Liste von Silben anlegen • Zufallszahl erzeugen • Silbe zufällig auswählen •…