Skip to content

Instantly share code, notes, and snippets.

@horstjens
Last active April 1, 2016 22:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save horstjens/9b7ba15c1ecbe3debab9a56c48916433 to your computer and use it in GitHub Desktop.
Save horstjens/9b7ba15c1ecbe3debab9a56c48916433 to your computer and use it in GitHub Desktop.
Seminarunterlagen für Python-Seminar in Dornbirn am 31-3-2016
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
"""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))
"""
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")
## 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