Skip to content

Commit 4eb311b

Browse files
author
dodo
committed
Merge branch 'master' of github.com:pythonfoo/pythonfooLite
2 parents b3fe876 + b378ffc commit 4eb311b

3 files changed

Lines changed: 255 additions & 0 deletions

File tree

Level_6/Ueberladung.py

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
""" Diese Datei zeigt Operatorüberladung. """
2+
3+
import math
4+
5+
class Punkt:
6+
"""
7+
Ein Punkt in einem dreidimensionalen Koordinatensystem.
8+
9+
Man kann ihn z.B. ausgeben lassen, vergleichen oder addieren.
10+
"""
11+
12+
def __init__(self, x, y, z):
13+
""" Ein Punkt wird erzeugt unter Angabe von drei Koordinaten: x, y und z. """
14+
self.x = float(x)
15+
self.y = float(y)
16+
self.z = float(z)
17+
18+
def __repr__(self):
19+
""" die menschenlesbare Darstellung -- str und repr """
20+
return "({}|{}|{})".format(self.x, self.y, self.z)
21+
22+
def __eq__(self, p):
23+
""" prüft auf Äquivalenz -- == """
24+
if hasattr(p, "x") and hasattr(p, "y") and hasattr(p, "z"):
25+
return self.x == p.x and self.y == p.y and self.z == p.z
26+
else:
27+
return False
28+
29+
def __add__(self, p):
30+
""" addiert p und erzeugt einen neuen Punkt -- + """
31+
assert isinstance(p, Punkt)
32+
return Punkt(self.x + p.x, self.y + p.y, self.z + p.z)
33+
34+
def __sub__(self, p):
35+
""" subtrahiert p und erzeugt einen neuen Punkt -- - """
36+
assert isinstance(p, Punkt)
37+
return self + -p
38+
39+
def __neg__(self):
40+
""" negiert dieses Objekt -- - """
41+
return Punkt(-self.x, -self.y, -self.z)
42+
43+
class Strecke:
44+
"""
45+
Eine Strecke ist eine Linie zwischen zwei Punkten.
46+
Sie hat keine Richtung.
47+
"""
48+
49+
def __init__(self, p1, p2):
50+
""" Eine Strecke wird erzeugt unter Angabe zweier Punkte. """
51+
assert isinstance(p1, Punkt)
52+
assert isinstance(p2, Punkt)
53+
self.p1 = p1
54+
self.p2 = p2
55+
56+
def __repr__(self):
57+
""" die menschenlesbare Darstellung -- str und repr """
58+
return "{} - {}".format(self.p1, self.p2)
59+
60+
def __eq__(self, l):
61+
"""
62+
prüft auf Äquivalenz -- ==
63+
64+
Strecken haben keine Reihenfolge.
65+
"""
66+
if not isinstance(l, Strecke):
67+
return False
68+
if self.p1 == l.p1 and self.p2 == l.p2:
69+
return True
70+
if self.p1 == l.p2 and self.p2 == l.p1:
71+
return True
72+
return False
73+
74+
def __abs__(self):
75+
""" berechnet den Betrag -- abs """
76+
x = self.p1.x - self.p2.x
77+
y = self.p1.y - self.p2.y
78+
z = self.p1.z - self.p2.z
79+
return math.sqrt(x**2 + y**2 + z**2)
80+
81+
def __len__(self):
82+
""" Berechnet die Länge. Dies muss ein int sein. -- len """
83+
return int(abs(self))
84+
85+
def __gt__(self, l):
86+
"""
87+
prüft auf echtes größer -- >
88+
89+
Dies muss ein bool zurückgeben.
90+
91+
kleiner muss nicht manuell implementiert werden.
92+
"""
93+
return abs(self) > abs(l)
94+
95+
def __ge__(self, l):
96+
"""
97+
prüft auf größer oder gleich -- >=
98+
99+
Dies muss ein bool zurückgeben.
100+
101+
kleiner gleich muss nicht manuell implementiert werden.
102+
"""
103+
return self == l or self > l
104+
105+
class Vektor(Strecke):
106+
""" Ein Vektor ist eine Strecke mit einer Richtung. """
107+
108+
def __eq__(self, l):
109+
""" Äquivalenz: Vektoren haben eine Richtung. """
110+
if not isinstance(l, Strecke):
111+
return False
112+
return self.p1 == l.p1 and self.p2 == l.p2
113+
114+
def __add__(self, l):
115+
""" Addition """
116+
assert isinstance(l, Vektor)
117+
return Vektor(self.p1, self.p2 + (l.p2 - l.p1))
118+
119+
def __sub__(self, l):
120+
""" Subtraktion """
121+
assert isinstance(l, Vektor)
122+
return self + -l
123+
124+
def __neg__(self):
125+
""" Negation """
126+
return Vektor(self.p2, self.p1)
127+
128+
def __mul__(self, faktor):
129+
""" Multiplikation """
130+
if isinstance(faktor, float) or isinstance(faktor, int):
131+
# Multiplikation mit einem Skalar ergibt einen neuen Vektor.
132+
x = self[0] * faktor
133+
y = self[1] * faktor
134+
z = self[2] * faktor
135+
return Vektor(self.p1, self.p1 + Punkt(x, y, z))
136+
if isinstance(faktor, Vektor):
137+
# Multiplikation mit einem Vektor ergibt einen Skalar.
138+
x = self[0] * faktor[0]
139+
y = self[1] * faktor[1]
140+
z = self[2] * faktor[2]
141+
return x + y + z
142+
return None
143+
144+
def __pow__(self, exp):
145+
""" Potenzieren - ** """
146+
assert isinstance(exp, int)
147+
assert exp > 0
148+
r = self
149+
for i in range(0, exp):
150+
r *= r
151+
return r
152+
153+
def __iter__(self):
154+
""" Iterator - siehe nächstes Kapitel """
155+
yield self.p2.x - self.p1.x
156+
yield self.p2.y - self.p1.y
157+
yield self.p2.z - self.p1.z
158+
159+
def __getitem__(self, item):
160+
""" Zugriff via Index """
161+
return tuple(self)[item]
162+

Level_8/prozesse.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env python3
2+
from multiprocessing import Process
3+
from time import sleep
4+
from os import getpid
5+
from sys import argv
6+
7+
"""
8+
multiprocessing ist progammatisch ähnlich zu verwenden wie threading.
9+
Das Modul heißt anders und die Klasse auch (nämlich Process).
10+
"""
11+
12+
class PIDPrinter(Process):
13+
def __init__(self, wait=0.1):
14+
Process.__init__(self)
15+
self.wait = wait
16+
self.daemon = True # siehe Threads
17+
18+
def run(self):
19+
while True:
20+
print(getpid())
21+
sleep(self.wait)
22+
23+
"""
24+
Alternativ kann man auch einfach eine bestimmte Methode
25+
in einem neuen Prozess ausführen ohne eine neue Klasse zu schreiben:
26+
27+
def fun():
28+
pass
29+
30+
Process(target=fun).start()
31+
"""
32+
33+
if len(argv) > 1:
34+
count = int(argv[1])
35+
else:
36+
count = 2
37+
38+
for x in range(count):
39+
PIDPrinter().start()
40+
41+
while True:
42+
sleep(100)
43+
44+
# siehe auch: https://docs.python.org/3.6/library/multiprocessing.html

Level_8/threads.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/usr/bin/env python3
2+
3+
from threading import Thread
4+
from time import sleep
5+
import string
6+
from sys import argv
7+
8+
"""
9+
Man kann einen Thread erstellen, indem man threading.Thread importiert
10+
und eine neue Klasse erstellt, die davon erbt und run überschreibt.
11+
12+
Man kann diesen Thread dann starten, indem man eine Instanz dieser Klasse anlegt
13+
und start() darauf aufruft.
14+
"""
15+
16+
class PrintThread(Thread):
17+
def __init__(self, string, wait=0.1):
18+
Thread.__init__(self)
19+
self.string = string
20+
self.wait = wait
21+
self.daemon = True # Soll dieser Thread beendet werden beim Programmende des Hauptthreads?
22+
23+
def run(self):
24+
while True:
25+
print(self.string, end="", flush=True)
26+
sleep(self.wait)
27+
28+
"""
29+
Alternativ kann man auch einfach eine bestimmte Methode
30+
in einem neuen Thread ausführen ohne eine neue Klasse zu schreiben:
31+
32+
def fun():
33+
pass
34+
35+
Thread(target=fun).start()
36+
"""
37+
38+
if len(argv) > 1:
39+
count = int(argv[1])
40+
else:
41+
count = 2
42+
43+
for letter in string.ascii_uppercase[0:count]:
44+
PrintThread(letter).start()
45+
46+
while True:
47+
sleep(100)
48+
49+
# siehe auch: https://docs.python.org/3.6/library/threading.html

0 commit comments

Comments
 (0)