Erstellungsdatum: 2015-03-17 20:55
Wichtig: Dieses Arbeitsblatt muss mit
dem Dateinamen nachname_vorname_matrikelnummer_uebungszahl.ipynb
abgespeichert und zur Abgabe
vor der Abgabefrist hochgeladen werden.
Die "Übungszahl" ist hierbei optional, und kann für die eigene Übersicht nützlich sein.
Hierfür hier oben im IPython Notebook auf den Titel angabe-gruppeN-02
klicken und den Namen eingeben.
Sowohl Vor- als auch Nachname bitte ausschließlich in Kleinbuchstaben eingeben -- z.B. mustermann_max_1401567_02
.
Eine korrekte Abgabe besteht aus funktionstüchtigen Codezellen, die von oben nach unten ausgewertet werden können.
Zur Überprüfung dessen im Menü: Kernel
→ Restart
auswählen und anschließend
mittels Cell
→ Run all
alle Zellen ausführen.
In den folgenden Beispielen werden verschiedene Iterationen und Abzählungen vorgenommen. Lies sie durch, mach eine Vermutung über das Ergebnis, und dann führe sie aus. Ist etwas unklar, kopiere Teile der Prozedur in eine neue Zelle und führe diesen Teil separat aus. Erkäre was passiert!
(a)
namen = ["Susi", "Sandra", "Stephan", "Rudi", "Seraphin"]
namen.append("Norbert")
namen.append("Susi")
count = 0
for name in namen:
if name.startswith("S"):
count += 1
print count
Erklärung:
(b)
prim = [2, 3, 5, 7, 13, 17, 23]
test = [101, 997, 34, 90, 81]
for zahl in test:
for p in prim:
if zahl % p == 0:
print zahl
break
Erklärung:
(c)
noten = {
"Erich": 1,
"Julia": 3,
"Natascha": 5,
"Martina": 1,
"Ute": 2
}
notendurchschnitt = 0.0
for note in noten.values():
notendurchschnitt += note
notendurchschnitt /= len(noten)
print notendurchschnitt
Erklärung:
(d)
temps = [4, 6, 8, 9, 3, 9, 10, 5, 6]
temp_max = None
temp_idx = None
for idx, temp in enumerate(temps):
if temp_max is None or temp > temp_max:
temp_max = temp
temp_idx = idx
print("Die höchste Temperatur war am Tag {} mit {:.2f}°C".format(temp_idx, temp_max))
Erklärung:
Georg hat mitten in der Wüste einen Unfall und muss dringend in den nähesten Ort. Er kennt seine Position und die von 4 umliegenden Orten. Wohin ist die Luftlinie am kürzesten?
position = (14, 5)
orte = [(4, 15), (25, 12), (16, 17), (11, 21)]
Plotte folgende Funktionen jeweils im Intervall $[-10,\,10]$. Wenn für eine gute Darstellung notwendig, schränke den Bereich der y-Achse ein.
%matplotlib inline
from sympy.abc import x
from sympy.plotting import plot
from sympy import sin, tan
from sympy.functions import Abs
(a) $$ f(x) := \frac{x-1}{x^2+2x-3} $$
(b) $$ g(x) := \tan\left(\sin(x)\right) $$
(c) $$ h(x) := \frac{1}{x - \frac{3}{x}} $$
(d) $$ k(x) := \left| x^2-15 \right| $$
Verwende die Programmbibliothek SymPy
um jeweils folgende Gleichungen zuerst mittels Eq(..., ...)
anzugeben und dann nach $x$ zu lösen.
Anschließend überprüfe die Ergebnisse mittels einsetzen (d.h. substituiere jede Lösung für x
in der jeweiligen Gleichung, e.g. .subs(x, solution[0]).simplify()
):
from sympy import sqrt, exp, Eq, solve, init_printing
from sympy.abc import x
init_printing()
(a) $$ 1 - x = \frac{1 + x}{1-x} $$
(b) $$ x \; (\sqrt{5}+x) = 5 $$
(c) $$ \mathbb{e}^{1/(1+x)} = 3 $$
(d) $$ \frac{a x^3 + b}{c x^2 + d} = 0 $$
Schreibe ein Programm, das im folgenden Zungenbrecher die Häufigkeit der Buchstaben s
bzw. S
zählt. (Gib die Gesamtsumme aus).
zungenbrecher = """Schnecken erschrecken, wenn sie an Schnecken schlecken,
weil zum Schrecken vieler Schnecken, Schnecken nicht schmecken."""
Python ist eine "strongly typed" Programmiersprache.
Bislang sind schon mehrere Basistypen vorgekommen.
Es ist üblicherweise wichtig zu wissen,
welchen Typ ein gegebenes Objekt hat (Abfrage mittels Funktion "type()
")
und (damit verbunden) was sich damit machen lässt.
Die in Python eingebauten Funktionen: int
, bool
, hex
, oct
, long
, str
, ord
, chr
und float
helfen, zwischen verschiedenen Typen oder Repräsentationen zu wechseln -- sofern dies möglich ist und einen Sinn hat!
Lies über diese Funktionen in der Python 2 Dokumentation.
Beispiel:
n = 69
chr(n)
type(n), type(chr(n))
ord("E")
float(ord(chr(n)))
Aufgabe
Versuche nun die folgenden vier Objekte (x
, l
, k
, z
) mittels der oben erwähnten Funktionen in möglichst viele andere Objekte zu konvertieren.
Vermerke dabei jeweils, welcher Typ das ursprüngliche Objekt hat (Abfrage mittels type()
) und mittels welcher Funktionen es sich in welchen Wert und Typ verwandeln ließ.
Überlege auch, welche Funktionen jeweils die identische Abbildung sind bzw. welche jeweils zueinander inverse Operationen sind.
x = True
l = [1, 2, 3]
z = "9"
k = 9.81
Suche alle vierstelligen Zahlen, also von 1000 bis 9999, welche durch 17 teilbar und Palindrome sind!
Hinweis: str(x)
konvertiert eine Zahl x
in einen entsprechenden String,
dessen Richtung genauso wie bei einer Liste umgedreht werden kann.
$i$ und $j$ sind zwei berühmte akrobatische Variablen in $\mathbb{N}$. Eines ihrer größten Kunststücke ist, dass die Differenz zwischen ihrem Produkt und ihrer Summe genau 99999 ist (d.h. $i j -(i+j)=99999$).
Finde alle Paare $i,\,j$ mit $0 \leq i < j \leq 1000$, wo sie vorkommen.
Idee:
for i in range(1000):
for j in range(..., 1001):
if ... == ...:
print i, j
Python's Datentyp "set
" repräsentiert eine ungeordnete Sammlung von Objekten ohne Duplikate.
Es unterstützt außerdem Standardmethoden zur Verarbeitung von Mengen.
Beobachte das Verhalten der folgenden Codezellen und erkläre, was jeweils passiert.
s1 = set([1,4,8,5,8,2,4,2,1])
s1
Erklärung:
s21 = set(["Gustav", "Luise", "Stephan"])
s22 = set(["Stephan", "Gustav", "Paul", "Gregor"])
s2 = s21.union(s22)
len(s2)
Erklärung:
# probiere hier aus, was randint macht bzw. lies dessen Hilfe mittels 'randint?'
from random import randint
randint(0, 100)
erledigt = set([9, 16, 12, 41, 8, 67, 91, 73, 42])
naechste = set()
while len(naechste) < 10:
x = randint(0, 100)
if x not in erledigt:
naechste.add(x)
naechste
Erklärung:
text1 = """\
Most good programmers do programming not because they expect to get paid or get adulation by the public,
but because it is fun to program.
""".lower().split()
text2 = """\
The second stream of material that is going to come out of this project
is a programming environment and a set of programming tools where
we really want to focus again on the needs of the newbie.
This environment is going to have to be extremely user-friendly.
On the other hand, we want to make it expert-friendly.
And we also want to make it a lot easier to start using it without much computer experience
than existing programming environments are.
""".lower().split()
set(text1).intersection(set(text2))
Erklärung:
func_a
bis func_d
ist jeweils eine Funktion in Python und jede wird anschließend zweimal aufgerufen.
Erkläre jeweils, was beim Aufruf passiert, welche Werte übergeben werden, und wie die übergebenen Werte zu dem jeweiligen Ergebnis verarbeitet werden.
def func_a(length, cost = 21):
return length * cost
func_a(5)
Erklärung:
func_a(length = 9, cost = 0.1)
Erklärung:
def func_b(settlement, *damages):
count = 0
for damage in damages:
settlement -= damage
if settlement < 0:
break
count += 1
return "We can only pay %d clients" % count
func_b(100, 42, 58, 109, 11)
Erklärung:
damages = [15, 19, 21, 32, 14, 25]
func_b(90, *damages)
Erklärung:
def func_c(a, b, x = 4, y = 9):
A = a*b*x
U = 2*(a+b)*y
return A + U
func_c(10, 1, y = 8, x = 2)
Erklärung:
func_c(b = 8, a = 7)
Erklärung:
def func_d(mary, joe, paul = 40, susan = 5, **others):
ages = [mary, joe, paul, susan] + others.values()
return sum(ages)
ages = {"paul" : 15, "richard": 25}
func_d(10, 20, **ages)
Erklärung:
friends = {
"mary" : 15,
"paul" : 20,
"joe" : 25,
"jack": 30,
}
func_d(**friends)
Erklärung:
Stelle $f(x) := a \sin(b x) + c \sqrt{x}$ in einem interaktiven Plot dar.
%matplotlib inline
import matplotlib.pyplot as plt
from IPython.html.widgets import interact
Plotte die diskreten Funktionen $\mathbb{Z} \Rightarrow \mathbb{Z}$
$$f(x) := (-x+5)^2 + 3x^2 -x$$
und $$g(x) := \left((30+x) (20-x)\right) x + 1000$$
für an den Stellen $$x \in \{-20,\,-19,\dots,\,20\}$$
in denselben Plot, in den Farben grün und blau und den Markern "+
" und ".
".
Achte darauf, dass die Darstellung diskrete Punkte sind und mit einem Koordinatenraster hinterlegt werden.
Hinweis: Die folgenden Funktionen aus matplotlib's pyplot API werden nützlich sein: scatter und grid.
%matplotlib inline
import matplotlib.pyplot as plt
Verwende die Programmbibliothek SymPy
um folgendes Gleichungssystem zu lösen:
\begin{cases} x + \frac{2x}{y} + 1 &= 0 \\ x y + 2 y + 2 &= 0 \end{cases}
und überprüfe beide Lösungen durch einsetzen.
Aktiviere Sympy
's $\LaTeX$ Formeldarstellung.
from sympy import Eq, sqrt, sin, solve, init_printing
from sympy.abc import x, y, z
init_printing()
Löse außerdem dieses Gleichungssystem und überprüfe die Lösungen durch Einsetzen: \begin{cases} 3x - 4y + z &= 11 \\ x + z &= y +1 \\ 1 - z &= x \; (1-y) \end{cases}