Last active
April 1, 2016 22:10
-
-
Save horstjens/9b7ba15c1ecbe3debab9a56c48916433 to your computer and use it in GitHub Desktop.
Seminarunterlagen für Python-Seminar in Dornbirn am 31-3-2016
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Links und Unterlagen zum Seminar "Unterrichten mit Python" | |
# python | |
http://python.org - download | |
offizielle Dokumentation der Module (z.B. turtle modul) -> Documentaion -> Library Reference -> Modul aussuchen, | |
z.B. turtle Modul: | |
https://docs.python.org/3/library/turtle.html | |
## Tutorials für Python: | |
ich empfehle "a byte of python" http://python.swaroopch.com/ wurde in mehrere Sprachen übersetzt und steht unter einer | |
creative-commons Lizenz | |
## weitere Tutorials: | |
offizielles Tutorial: https://docs.python.org/3.5/tutorial/ | |
offizielle Hilfeseite mit vielen Links: https://www.python.org/about/help/ | |
deutschsprachiges Python-Forum: https://www.python-forum.de/ | |
python online Kurse gibt es bei den großen Plattformen wie Codeacademy etc. | |
## Buchempfehlung (speziell bezogen auf das Turtle Modul): | |
"Python for Kids" von Gregor Lingl | |
<a rel="nofollow" href="http://www.amazon.de/gp/product/382668673X/ref=as_li_tl?ie=UTF8&camp=1638&creative=19454&creativeASIN=382668673X&linkCode=as2&tag=spielendprogr-21"><img border="0" src="http://ws-eu.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=382668673X&Format=_SL110_&ID=AsinImage&MarketPlace=DE&ServiceVersion=20070822&WS=1&tag=spielendprogr-21" ></a><img src="http://ir-de.amazon-adsystem.com/e/ir?t=spielendprogr-21&l=as2&o=3&a=382668673X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> | |
# easygui | |
easygui: http://easygui.sf.net | |
## easygui unter Linux installieren: | |
sudo apt-get install python3-easygui | |
sudo apt-get install python-easygui | |
## easygui unter jedem system benutzbar machen (in einem Verzeichnis): | |
easygui von homepage downloaden und entpacken. die entpackte Datei easygui.py in jenes Verzeichnis kopieren, | |
in welchem man ein python-script schreibt. | |
aufpassen dass sich in diesem ordner nicht ein Ordner namens easygui befindet. | |
im eigenen python-skript easygui importieren und verwenden: | |
import easygui | |
easygui.msgbox("hallo") | |
# python online ohne Installation | |
## http://trinket.io | |
derzeit python2, an python3 wird gearbeit, turtle modul funktioniert online! | |
##sagemath.com | |
ipython2, python3 terminal, matplotlib, jpyter ... Entweder lokal installierbar (open source) oder online (sagemath online). | |
alles was man für wissenschaftliches Arbeiten braucht um Pakete wie R etc. zu ersetzten. | |
Verschiedene Preismodelle, gratis Version hat eingeschränkten Internetzugriff | |
## jupyter.org | |
http://nbviewer.jupyter.org -- macht statisches ipython notbook im web zugreifbar | |
(notebook muss auf github oder anderer seite stehen) | |
## nitrous.io | |
https://www.nitrous.io -- online editor und ubuntu terminal im browser. 2 projekte gratis | |
## pythonanywhere.com | |
pythonanywhere.com -- online editor, terminal files |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""einfachste Volumsberechnung eines Würfels mit Easygui und python3. Easygui muss entweder global installiert sein | |
oder die Datei easygui.py muss sich im selben Ordner wie dieses Python-Skript befinden. | |
easygui downloaden von: http://easygui.sf.net""" | |
import easygui | |
import math | |
auswahl = easygui.buttonbox("Welchen Körper wollen Sie berechnen?", choices=["Würfel", "Kugel", "Quader"]) | |
if auswahl == "Quader": | |
kanten = [] | |
for kante in ["Länge","Breite","Höhe"]: | |
# zu liste hinzufügen | |
kanten.append(easygui.integerbox("Bitte {} in cm eingeben:".format(kante), upperbound=10000)) | |
easygui.msgbox("Quadervolumen = {} cm³".format(kanten[0] * kanten[1] * kanten[2])) | |
elif auswahl == "Würfel": | |
seite = easygui.integerbox("Bitte Würfelkantenlänge in cm eingeben", upperbound=10000) | |
easygui.msgbox("Würfelvolumen = {} cm³".format(seite**3)) # ** ist potenzieren | |
elif auswahl == "Kugel": | |
radius = easygui.integerbox("Bitte Kugelradius in cm eingeben", upperbound=10000) | |
easygui.msgbox("Kugelvolumen = {:8.2f} cm³".format(4/3 * math.pi * radius**3)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Python3 - Geschichtendrucker. Erzeugt zufällige Geschichten und speichert diese in eine Text-Datei. | |
Optional: Um die Geschichten vorlesen zu lassen muss (unter Linux) das Paket 'espeak' installiert sein: | |
sudo apt-get install espeak | |
Das Programm demonstriert den Umgang mit Listen und Dictionaries. Siehe auch: | |
https://docs.python.org/3/tutorial/datastructures.html | |
""" | |
import random | |
import subprocess # zum ausführen von espeak sofern vorhanden | |
orte_w = ["Straßenbahn","Theatergarderobe","Küche","Baustelle","Festsaalbühne"] | |
orte_m = ["Bunker", "Dorfteich", "Festsaal", "Garten"] | |
orte_s = ["Schwimmbad", "Restaurant", "Werksgelände","Raumschiff"] | |
students = ["Karl", "Lisa", "Anton", "Nadia", "Mustafa", "Birgit", "Leander", "Yasmin"] | |
verben = ["trifft", "bestiehlt", "küsst", "ärgert", "beißt", "bequatscht", "erheitert", "hilft"] | |
adjektive = ["leidenschaftlich", "bösartig", "hinterhältig", "großzügig", "gelangweilt"] | |
sprache = "de" # probiere "en", "fr", "it" usw. siehe 'man espeak' | |
# ein dictionary bauen mit Ort als Key und Geschlecht (m,w,s) als value | |
nachguck = {} # leeres dictionary | |
for ort in orte_w: | |
nachguck[ort] = "w" | |
for ort in orte_m: | |
nachguck[ort] = "m" | |
for ort in orte_s: | |
nachguck[ort] = "s" | |
# dictionary mit Geschlecht als key und Liste von passenden Hilfswörtern als value | |
nachguck2 = {"w": ["in der", "vor der", "bei der", "neben der", "unter der"], | |
"m": ["im", "vor dem", "neben dem"], | |
"s": ["im", "in dem", "vor dem", "auf dem", "unter dem"]} | |
text = "" | |
for satz in range(5): | |
wo = random.choice(list(nachguck.keys())) # einen Ort aussuchen | |
geschlecht = nachguck[wo] | |
hilfswort = random.choice(nachguck2[geschlecht]) | |
# studenten zufällig umsortieren | |
random.shuffle(students) | |
wer = students[0] | |
wen = students[1] | |
was = random.choice(verben) | |
wie = random.choice(adjektive) | |
line = "{} {} {} {} {} {}.".format(wer, was, wie, wen, hilfswort, wo) | |
print(line) | |
try: | |
subprocess.call(["espeak","-v", sprache, line]) | |
except: | |
pass # falls espeak nicht funktioniert, mache gar nix | |
text += line +"\n" | |
# file schreiben ("a" für append modus) | |
with open("geschichte.txt","a") as textdatei: | |
textdatei.write("- - -\n"+text) | |
print("\nsiehe geschichte.txt") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## braucht aber funktionierendes turtle modul | |
## daher nur lauffähig bei lokaler Python3 Installation | |
## siehe turtle-modul: https://docs.python.org/3/library/turtle.html | |
## Spieler wirft Ball, Flugbahn wird gezeichnet | |
import turtle | |
import math | |
import random | |
import sys | |
def paint_ziel(zielx, ziely, ziel_radius): | |
"""diese Funktion zeichnet einen Zielkreis | |
und kann von beliebiger Stelle | |
aus aufgerufen werden""" | |
turtle.speed(0) # so schnell wie möglich | |
turtle.penup() # nicht zeichnen | |
turtle.goto(zielx, ziely - ziel_radius) | |
turtle.pendown() # zeichnen | |
turtle.circle(ziel_radius) | |
turtle.write("target") | |
ziel_painted = True | |
turtle.speed(3) # normal | |
return # Funktion gibt nichts zurück, return könnte weggelassen werden | |
def game(): | |
"""das Hauptprogramm""" | |
# ------- settings -------------- | |
turtle.setup(1024, 800) # set width and height of turtle window | |
gravity = -9.81 # Python braucht DezimalPUNKT | |
history = "" # leerer String | |
boden = (turtle.window_height()-100) // -2 # y-Distanz von Bildschirmmitte zum Boden. // ist Division ohne Rest | |
startx = (turtle.window_width()-100) // -2 # x-Distanz von Bildschirmmitte zum Abwurfpunkt | |
# Spieler solange fragen bis er vernünftige Werte für Winkel und Speed eingibt | |
text2 = "\n Bitte Winkel und Speed\n durch Leerzeichen getrennt eingeben\n mit DezimalPUNKT \n oder exit oder clear\n" | |
text1 = "Versuch Winkel Speed best distance\n" | |
eingabe = "" | |
zielx = random.randint(0, -startx) | |
ziely = random.randint(boden, -boden) | |
ziel_radius = 10 | |
crit=30 # wie nahe man ans ziel kommen muss um zu gewinnen | |
play_again = True | |
wurf = 0 | |
ziel_painted = False | |
maxsteps = 100 | |
print(text1) | |
# ------- game loop ------------ | |
while play_again == True: | |
wurf += 1 | |
eingabe_korrekt = False | |
if not ziel_painted: | |
paint_ziel(zielx, ziely, ziel_radius) | |
while not eingabe_korrekt: | |
eingabe = turtle.textinput("Wurf Nummer {}".format(wurf), text2) | |
if eingabe.lower() in ["quit","exit","game over", "leave", "tschüss", "aufhören", "raus"]: | |
turtle.bye() | |
sys.exit() # beende python | |
elif eingabe == "clear": | |
turtle.clear() # löscht den Turtle-Bildschirm | |
paint_ziel(zielx, ziely, ziel_radius) | |
continue # zurück zum Schleifenanfang | |
# eingabe beim leerzeichen trennen mit split(). Split erzeugt eine Liste | |
try: | |
eingabewinkel = eingabe.split()[0] # erster Index, Python beginnt Zählung mit 0, nicht mit 1 | |
eingabespeed = eingabe.split()[1] # zweiter Index | |
# gab es bei den beiden vorigen Zeilen einen Fehler wird bei except: weitergemacht | |
except: | |
print("Fehler beim splitten der Eingabe") | |
# es scheitert schon beim splitten der Eingabe | |
continue # wider an den Anfang der Schleife springen | |
# schauen ob sich die Eingabe in eine Fließkommazahl (float) umwandeln lässt | |
try: | |
speed = float(eingabespeed) | |
winkel = float(eingabewinkel) | |
# gab es bei den beiden vorigen Zeilen einen Fehler wird bei except: weitergemacht | |
eingabe_korrekt = True | |
except: | |
print("Fehler beim umwandeln der Eingabe in float") | |
# Eingabe war irgendein Unsinn, auf jeden Fall keine Dezimalzahlen | |
# Radiant in Grad umwandeln, winkel in dx und dy zerlegen ( Vektoren ) | |
dx = math.cos(winkel / 180.0 * math.pi) * speed | |
dy = math.sin(winkel / 180.0 * math.pi) * speed | |
# turtle unsichtbar nach links unten Eck setzten um anzufangen | |
turtle.penup() # nicht zeichnen | |
turtle.speed(0) # schnell zeichnen | |
turtle.goto(startx,boden) | |
turtle.speed(3) # lansam zeichnen | |
turtle.pendown() # ab jetzt zeichnen | |
bestdistance = 50000 | |
for step in range(maxsteps): | |
# maximal 200 steps berechnen | |
turtle.goto(turtle.xcor() + dx, turtle.ycor() + dy) | |
# distanz zum Ziel ausrechnen | |
distance = ( (zielx - turtle.xcor())**2 + (ziely - turtle.ycor())**2)**0.5 # pythagoras: **2 ist quadrieren, **.5 ist wurzel | |
if distance < bestdistance: | |
bestdistance = distance | |
dy += gravity # gravity saugt turtle nach unten | |
# dx += seitenwind | |
if turtle.ycor() < boden: | |
break # abbruch wenn turtle zu tief | |
if turtle.xcor() > -startx: | |
break # abbruch wenn turtle zu weit rechts | |
# am Dezimalpunkt ausgerichtete Tabelle | |
history = "{}{:3.0f}{}{:7.2f}{}{:7.2f}{}{:7.2f}".format(" ", wurf, " ", winkel, " ", speed, " ", bestdistance) | |
print(history) | |
if bestdistance < crit: # nahe genug am Ziel? | |
turtle.penup() | |
turtle.goto(startx+10,0) | |
turtle.pendown() | |
turtle.write("You win!", font=('Arial', 128, 'normal')) | |
play_again = False | |
turtle.exitonclick() | |
## dieser code sorgt bei python dafür dass man ein programm auch als modul importieren kann | |
## und "game()" nur ausgeführt wird wenn turtleballwurf.py direkt gestartet wurde | |
## bei einem "import turtleballwurf" wird game() nicht automatisch gestartet | |
if __name__ == "__main__": | |
game() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment