Konzepte des skriptorientierten Programmierens
WI FOM 3.Semester - Endejan
>>> x = input ('enter a number')
>>> print('Hello World')
if (var1 > var2):
print("Anweisung1")
print("Anweisung2")
if (var1 > var2):
print("Anweisung1")
print("Anweisung2")
elif (var1 == var2):
print("Alternativanweisungen")
else:
print("Wenn keine Bedingung stimmt")
b = a**(1/2) if a>0 else "Fehler"
while (bedingung == True):
#Anweisungsblock
l = [1,2,3]
for n in l:
print(n)
#1
#2
#3
for char in "Känguru":
print(char)
'''
K
ä
n
g
u
r
u
'''
#2-er Reihe
for i in range(2,21,2):
print(i)
Zeichen | Name | Erklärung |
---|---|---|
& | Binary AND | 1 wenn beide Bits = 1, ansonsten 0 |
| | Binary OR | 1 wenn mind. 1 Bit = 1, (0,0)-> 0, ansonsten 1 |
^ | Binary XOR | 1 wenn genau 1 Bit = 1, (0,0)-> 0, (1,1) -> 0, ansonsten 1 |
x << n | Bitverschiebung links | Bitverschiebung um n Stellen nach links (*2) |
x >> n | Bitverschiebung rechts | Bitverschiebung um n Stellen nach rechts (:2) |
~x | Bitweises Komplememnt | 1-> 0, 0-> 1 |
Funktionieren auch bei Listen
s. sequienzelle Datentypen
Syntax-Fehler / Syntax Error (Parser-Fehler)
• werden beim Parsen einer Zeile entdeckt u. verursachen einen Programmabbruch
• Parser weist auf fehlerhafte Zeile u. erste Stelle, an der der Fehler erkannt wurde
Laufzeitfehler / Ausnahmen / Exception
Fehler beim Versuch einen syntaktisch korrekten Befehl auszuführen
• können abgefangen (behandelt) werden
• nicht behandelte Fehler führen zu einem Programmabbruch
• es gibt unterschiedliche Ausnahme-Typen; Fehlermeldung liefert in der letztenZeile Informationen zur Art der konkreten Ausnahme (exception type)
try:
#Befehl
except:
#Was soll passieren, wenn irgendein Fehler auftritt
try:
c = a/b
except ValueError:
print("DATENTYP nicht zulässig")
except ZeroDivisionError:
print("Division durch NULL nicht möglich")
except:
print("Unerwarteter Fehler")
else:
#try Block wurde fehlerfrei durchlaufen
print(c)
finally:
#Wird am Ende ausgeführt, egal ob Fehler oder nicht
a = b = None
Python hat dynamische und starke Typisierung
Python Konvertiert aber nicht automatisch, wenn die Variable nicht den gewünschten Datentyp hat
In Python werden alle Daten über Objekte (Instanzen) bzw. über Beziehungen von Objekten repräsentiert
besitzt eine Id (Identität), einen Typ und einen Wert
1. Identität:
• Objekt-Id ist eindeutig und unveränderlich
• Abfrage über id()
• Die Id entspricht in CPython der Speicheradresse
Abfrage:
>>> a = 26
>>> id(a)
507099584
Vergleich:
>>> a is b
False
2. Typ:
• Objekt-Typ ist unveränderlich
• Abfrage über type()
• bestimmt die möglichen Werte und Operationen
Abfrage:
>>> a = 26
>>> type(a)
#<class 'int'>
Vergleich:
>>> type(a)== int
True
3. Wert:
• Mögliche Werte abhängig vom Typ
Wertzuweisung
>>> a = 26
>>> a
#26
Vergleich:
>>> a = 26; b = 26.0
>>> a == b
True
a referenziert auf die Instanz
konkretes Datenobjekt im Speicher (mit eindeutiger Id)
Mutable Datentypen:
Immutable Datentypen:
x = None
print(x)
#None
def f():
pass
print(f())
#None
siehe Kapitel Operatoren
Datentyp | Verwendungszweck | mutable/immutable |
---|---|---|
str | Sequenz von Buchstaben (Zeichenketten) | immutable |
list | Sequenz beliebiger Instanzen | mutable |
tuple | Sequenz beliebiger Instanzen | immutable |
bytes | Sequenz von Bytes (Binärdaten) | immutable |
bytearray | Sequenz von Bytes (Binärdaten) | mutable |
Von allen sequenziellen Datentypen bereitgestellt
Länge | Kleinstes Element | Größtes Element |
---|---|---|
len(s) | min(s) | max(s) |
>>> s = (-1, 2, 4, -17, 210)
>>> len(s)
5
s[i] | s[i:j] | s[i:j:k] |
---|---|---|
Elementzugriff | Slicing | Slicing |
Element an Stelle i von s (Start bei 0) | Ausschnitt (slice) von s von i bis j | Ausschnitt von s von i bis j mit Schrittweite k |
Wenn i < 0: Start vom Ende (len(s)+i) | Elemente mit Index k für die gilt: i <= k < j | Elemente mit Index x = i + n*k, so dass 0 <= n < (j-i/k) |
Standardwert für i ist 0 | Standardwert für k ist 1 |
s = list(range(10))
print(s)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(s[3])
#3
print(s[:3])
#[0, 1, 2]
print(s[3:5])
#[3, 4]
print(s[1:8:3])
#[1, 4, 7]
print(s[::2])
#[0, 2, 4, 6, 8]
print(s[-3])
#7
print(s[-1::-2])
#[9, 7, 5, 3, 1]
s + t | s += t | s * n | s *= n |
---|---|---|---|
Verkettung von s und t | Verkettung von s und t und Zuweisung an s | Verkettung von n flachen Kopien von s | Verkettung von n flachen Kopien von s und Zuweisung an s (Werte < 0 für nwerden als 0 interpretiert) |
i = list(range(5))
j = list(range(4,11))
print(i + j)
#[0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10]
# i und j bleiben unverändert
i += j
print(i)
#[0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10]
x = "Hallo "
print (x*4)
#Hallo Hallo Hallo Hallo
y = [1,2]
y *= 4
print(y)
#[1, 2, 1, 2, 1, 2, 1, 2]
a) in / not in
>>> s = 'Kathy'
>>> 'a' in s
True
b) count
>>> s = 'Corinna'
>>> x ='n'
>>> s.count(x)
2
c) index
>>> s = 'Corinna'
>>> x ='n'
>>> s.count(x)
2
>>> s = 'Corinna'
>>> x ='n'
>>> s.index(x, 5, 7)
5
Die folgenden Operatoren werden von allen veränderbaren sequenziellen Datentypen
bereitgestellt:
s = list(range(11))
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s[0] = 'A'
#['A', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s[1:4] = 'BCD'
#['A', 'B', 'C', 'D', 4, 5, 6, 7, 8, 9, 10]
s[4:9:2] = 'EFG'
#['A', 'B', 'C', 'D', 'E', 5, 'F', 7, 'G', 9, 10]
del s[0]
#['B', 'C', 'D', 'E', 5, 'F', 7, 'G', 9, 10]
del s[i:j]
Löscht Ausschnitt [i:j]– entspr. s[i:j]=[reference link]
del s[i:j:k]
Löscht Elemente von s[i:j:k]
del s [::2]
#['C', 'E', 'F', 'G', 10]
s = list("Corinna")
s.pop()
#'a'
print(s)
#['C', 'o', 'r', 'i', 'n', 'n']
s.remove('r')
print(s)
#['C', 'o', 'i', 'n', 'n']
s.clear()
print(s)
#[]
s = [2,3,5]
s.insert(0,1)
print(s)
#[1, 2, 3, 5]
s[2:2] = [4] #Wenn Element iterierbar
print(s)
#[1, 2, 4, 3, 5]
s.append([6,7])
#[1, 2, 4, 3, 5, [6, 7]]
s.extend([8,9])
#[1, 2, 4, 3, 5, [6, 7], 8, 9]
s = list(range(10))
s.reverse()
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
t:t = s[1:4].copy()
print("t: {0}, s: {1}".format(t, s))
alle für mutable definierten Operationen
UND sort
sort(key=None, reverse=None)
Sortierung der Listenelemente
• key: Funktion, die zur Ermittlung des Schlüssels genutzt
werden soll (default None: direkte Nutzung der
Elemente); Bsp.: str.lower() für Zeichenketten
• reverse: Wahrheitswert; wenn True Sortierung in
umgekehrter Reihenfolge
• Methode gibt stets None zurück! Falls das Ergebnis als
Kopie benötigt wird, kann sorted() verwenden werden
grundfarben = ["rot", "gelb", "blau"]
farben = [farben for farben in grundfarben]
print(farben)
['rot', 'gelb', 'blau']
Mit Prädiikat (Bedingung):
grundfarben = ["rot", "gelb", "blau"]
farben = [farben for farben in grundfarben if len(farben) == 4]
print(farben)
['gelb', 'blau']
Für Mengen: {} anstatt []
# Tupel-Erzeugung
>>> t = (); t
()
>>> t = 1,; t
(1,)
>>> t = (4, 5, 6); t
(4, 5, 6)
>>> tuple("FOM")
('F', 'O', 'M')
>>> l = list("BSc")
>>> l
['B', 'S', 'C']
>>> t = tuple(l); t
('B', 'S', 'c')
# Tupel-Erzeugung
>>> t = (); t
()
>>> t = 1,; t
(1,)
>>> t = (4, 5, 6); t
(4, 5, 6)
>>> tuple("FOM")
('F', 'O', 'M')
>>> l = list("BSc")
>>> l
['B', 'S', 'C']
>>> t = tuple(l); t
('B', 'S', 'c')
• Datentyp range
• class range(stop)
• class range(start, stop[, step])
• start, stop, step: Ganzzahlen (int)
• Default-Werte: start=0, step=1
• Range-Objekt ist bei ungültigen Werten leer ([] in Bsp.)
• Ranges implementieren alle allgemeinen SequenzOperationen mit Ausnahme der Verkettungen (a + b)
und Wiederholungen (3 * b)
l = list(range(10))
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l = list(range(4,41, 4))
#[4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
str = "Ich sitze am Computer und verbessere den Wikipedia Artikel für Ambivalenz. Der ist mir zu eindeutig."
print(str.split())
#['Ich', 'sitze', 'am', 'Computer', 'und', 'verbessere', 'den', 'Wikipedia', 'Artikel', 'für', 'Ambivalenz.', 'Der', 'ist', 'mir', 'zu', 'eindeutig.']
print(str)
#Ich sitze am Computer und verbessere den Wikipedia Artikel für Ambivalenz. Der ist mir zu eindeutig.
str = """'Übrigens, wenn du es vermeiden kannst,' sagt das Känguru, 'dann schüttel diesem Typen da hinten nicht die Hand.'
'Wer ist das?'
'Das ist ein Bankdirektor, der...'
'Okay.'
'Was, okay?'
'Na, das reicht mir schon,' sage ich, 'das kann ich als Grund akzeptieren.'
'Sein Zwillingsbruder ist Asylrichter und will eine neue nationalkonservative Partei gründen.'
'Hui, das klingt ja nach einer sympatischen Familie. Wer war der Vater? Axel Springer?' """
print(str.splitlines())
#["'Übrigens, wenn du es vermeiden kannst,' sagt das Känguru, 'dann schüttel diesem Typen da hinten nicht die Hand.' ", "'Wer ist das?' ", "'Das ist ein Bankdirektor, der...' ", "'Okay.' ", "'Was, okay?' ", "'Na, das reicht mir schon,' sage ich, 'das kann ich als Grund akzeptieren.' ", "'Sein Zwillingsbruder ist Asylrichter und will eine neue nationalkonservative Partei gründen.' ", "'Hui, das klingt ja nach einer sympatischen Familie. Wer war der Vater? Axel Springer?' "]
str = "Das Tolle am Internet ist, dass endlich jeder der ganzen Welt seine Meinung mitteilen kann. Das Furchtbare ist, dass es auch jeder tut."
print(str.find("Internet"))
#13
str = "Das Tolle am Internet ist, dass endlich jeder der ganzen Welt seine Meinung mitteilen kann. Das Furchtbare ist, dass es auch jeder tut."
print(str.find("Känguru"))
#-1
print(str.index("Käbguru"))
#ValueError: substring not found
str = "Das Tolle am Internet ist, dass endlich jeder der ganzen Welt seine Meinung mitteilen kann. Das Furchtbare ist, dass es auch jeder tut."
print(str.count("ist"))
#2
str = " Ich wollte diesen Körper, und mir war egal was ich dafür tun musste - Donald Trump "
print(str.strip())
#Ich wollte diesen Körper, und mir war egal was ich dafür tun musste - Donald Trump
str = "!Ich wollte diesen Körper, und mir war egal was ich dafür tun musste - Donald Trump!"
print(str.strip("!"))
#Ich wollte diesen Körper, und mir war egal was ich dafür tun musste - Donald Trump
str = "Willst du den Charakter eines Menschen erkennen, so gib ihm Macht"
print(str.replace("Macht", "Schokolade"))
#Willst du den Charakter eines Menschen erkennen, so gib ihm Schokolade
str = "Willst du den Charakter eines Menschen erkennen, so gib ihm Macht"
print(str.lower())
#willst du den charakter eines menschen erkennen, so gib ihm macht
str = "Willst du den Charakter eines Menschen erkennen, so gib ihm Macht"
print(str.upper())
#WILLST DU DEN CHARAKTER EINES MENSCHEN ERKENNEN, SO GIB IHM MACHT
str = "Mittelfristig"
print(str.center(40))
# Mittelfristig
liste = ["a", "b", "c"]
print(";".join(liste))
b = b"Folge von Bytes";
#b'Folge von Bytes'
print(type(b))
#<class 'bytes'>
bytes(5)
#b'\x00\x00\x00\x00\x00'
i = bytes(range(65,65+26)); i
#b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
j = bytearray(b); j
#bytearray(b'Folge von Bytes')
print(type(j))
#<class 'bytearray'>
s = set ((1,2,3))
print(type(s))
#<class 'set'>
#Alternative Erzeugung von set !nicht frozenset
s = {1,2,3}
fs = frozenset(("Frage", (47, 3 , 4), 0, b"Hi"))
print(type(fs))
#<class 'frozenset'>
for el in fs:
print(el)
#0
#(47, 3, 4)
#b'Hi'
#Frage
• müssen im Dictionary eindeutig sein
• müssen Instanzen beliegiger unveränderlicher (immutable) Datentypen sein
• Instanzen beliebiger Datentypen
wb ={"eins" : "one", "zwei" : "two", "drei" : "three" }
#Alternativ
wb =dict(eins = "one", zwei = "two", drei = "three")
wx ={"eins" : 1, 2 : "two", (1,2,3) : "Anfang", 4 : [4,5,6,7] }
for schluessel in wx:
print(schluessel, ": ", wx[schluessel])
#2 : two
#(1, 2, 3) : Anfang
#4 : [4, 5, 6, 7]
#eins : 1
Funktionen in Python geben immer einen Wert zurück, wenn nicht durh return definiert kommt None raus
def functionName(para1, para2, ...): #Parameter in () = Funktionsschnittstelle
#Ab hier: Funktionskörper
#Anweisung 1
#Anweisung 2
#...
functionName(para1, para2, ...)
Beispiel:
def func(foo, bar=None, **sw_args):
pass
func (28, bar = 72, extra = "x")
Übergabe des Arguments mit vorangestelltem
Identifizierer innerhalb des Funktionsaufrufs
und/oder als Wert in einem Dictionary mit
vorangestelltem **
complex( real=3, imag = 5)
#oder
complex(imag=5, reals = 2)
#oder
complex(**{'real':3, 'imag':5})
Argument, das kein Schlüsselwort-Argument ist.
Übergabe positionsbezogener Argumente am Anfang
der Argumentliste und/oder als Elemente eines
iterierbaren Objekts mit vorangestelltem *
complex(3,5)
#oder
complex(*(3,5))
Es gibt 5 Parametertypen
def func (foo, bar):
pass
def func (*viele_args):
pass
func(1,2,3,4)
#Ausgabe: 1 2 3 4
def func (**viele_sw_args):
pass
func (a=1, b=2, c=3)
#Ausgabe: {'a':1, 'b':2, 'c':3}
abs(a)
def func (*, nur_sw1, nur_sw_2):
pass
func(nur_sw_1 = 1, nur_sw_2 = 2)
#Ausgabe: 1 2
#Bar als opt. Parameter
def func (foo, bar = None):
pass
def func(a,b,c):
print(a+b+c)
t = (7, 9, 11)
func(*t)
#Ausgabe: 27
• Dictionaries über zwei **
d = (a = 1, b = 2, c = 3)
func(**d)
#Ausgabe: 6
Kommentar wird zum Hilfesystem bei der Funktion hinzugefügt:
def summe(a,b):
"""Liefert Summe von a und b zurück"""
return a+b
Nicht global und auch nicht lokal
#globale Referenzen
text = "globaler STring"
globale_var = "globale Variable"
def func6():
#Definition der lokalen Variablen
text = "text func6"
zahl = 42
def func6a():
#lesender Zugriff auf globale Var
print("Globale Var: ", globale_var)
#lesender Zugriff auf übergeordnete Var zahl
print("Zahl: ", zahl)
#schreibender Zugriff auf übergeordnete variable text
nonlocal text
text+= "- geändert in func6a"
#lesender Zugriff auf text
print("Text: ", text)
func6a()
func6()
Beispiel:
namen = (('Kathy', 'Weißenfels'), ('Nele', 'Mersch'), ('Corinna', 'Heinze'))
#Sortierung nach Länge der Vornamen
sorted(namen, key=lambda name: len(name[0]))
#Ausgabe:[('Nele', 'Mersch'), ('Kathy', 'Weißenfels'), ('Corinna', 'Heinze')]
#direkte Verwendung
(lambda x: x+28) (7)
#direkte Verwendung
(lambda x: x+28) (7)
Alle, die noch nicht in Dokument beschrieben wurden:
prim = (2, 3, 5, 7, 11)
for z in reversed(prim):
print(z, end = ",")
#11,7,5,3,2,
x = True, False, True
all(x)
#False
x = True, 1 , [0], "FOM"
all(x)
#True
x = False, 0 , [], ""
#(alle) False
any(iterable)
True, wenn mind. ein Element in iterable True
zip(iterables)
Erzeugt und liefert einen Iterator, der über die Elemente der einzelnen
iterables-Objekte iteriert (zuerst die ersten Elemente der Objekte, dann die
zweiten usw.).
#Zwei iterierbare Objekte
zahlen = 1,2,3,4
zeichen = 'a', 'b', 'c', 'd'
for zahl, zeich in zip(zahlen, zeichen):
print(zahl, '-', zeich)
#1 - a
#2 - b
#3 - c
#4 - d
verbindung = list(zip(zahlen, zeichen)); verbindung
z,b = zip(*verbindung)
print(z)
#(1, 2, 3, 4)
print(b)
#('a', 'b', 'c', 'd')
farben = 'magenta', 'rosa', 'pink'
#Liste
list(enumerate(farben))
#[(0, 'magenta'), (1, 'rosa'), (2, 'pink')]
#For Schleife
for nr, farbe in enumerate(farben):
print(nr, '-', farbe)
#0 - magenta
#1 - rosa
#2 - pink
pi = 3.141592653
print(round(pi))
#3
print(round(pi, 2))
#3.14
prim = 2, 3, 5, 7, 11
sum(prim)
#28
sum(prim,100)
#128
import os
dateiname = "testdatei.txt"
#Datei öffnen
try:
#um nur zu lesen mit "r" öffnen
dat_obj = open(dateiname, "r")
except (IOError) as e:
print("Fehler:", e.args[1])
os._exit(1)
#Datei lesen
for zeile in dat_obj:
aktuelle_zeile = zeile.strip()
print(aktuelle_zeile)
import os
dateiname = "testdatei.txt"
#Datei öffnen
try:
#um nur zu lesen mit "r" öffnen
dat_obj = open(dateiname, "w")
except (IOError) as e:
print("Fehler:", e.args[1])
os._exit(1)
#in Datei schreiben
for i in range(10):
dat_obj.write(str(i)+"\n")
#Datei schließen
dat_obj.close()
"r" | "w" | "a" | "b" | "t" |
---|---|---|---|---|
read: rein lesender Zugriff (default) | write: rein schreibender Zugriff (evtl. vorhandene Datei mit gleichem Dateinamen wird gelöscht) | append: Daten, die in die Datei geschrieben werden, werden am Ende der Datei angehängt | Zusätzliche Angabe zur Bearbeitung einer Datei im Binärmodus ("rb", "r+b", "wb" etc.) | Textmodus (default) |
import os
dateiname = "testdatei.txt"
#Datei öffnen (& schließen)
with open(dateiname) as datObj:
#Lesen/Schreiben
import math
pi = math.pi; pi
#3.141592653589793
from math import pi, sin
myPi = pi; myPi
#3.141592653589793
from math import log2 as lg # Logarithmus zur Basis 2
lg(8)
#3.0
Online Tester: https://regex101.com/
import re #Modul für reguläre Ausdrücke
1. Punkt .
Der Punkt stimmt überein mit jedem beliebigen Zeichen (Ausnahme: Zeilenumbruch).
2. Zirkumflex ^
Der Zirkumflex stimmt überein mit dem Anfang des Textes
3. Dollarzeichen $
Das Dollarzeichen stimmt überein mit dem Ende des Textes (bzw. einer Zeile).
4. Sternchen*
Das Sternchen matcht das null- bis mehrfache Auftreten des vorigen Ausdrucks.
5. Pluszeichen+
Das Pluszeichen matcht das ein- bis mehrfache Auftreten des vorigen Ausdrucks.
6. Fragezeichen ?
Das Fragezeichen matcht das null- oder einfache Auftreten des vorigen Ausdrucks.
Gierige Quantifizierer
7. Geschweifte Klammern {}
Die geschweiften Klammern geben an, dass der vorige Ausdruck in einer definierten Anzahl von Kopien auftreten muss.
*8. Backslash *
Der Rückstrich (umgekehrter Schrägstrich, engl. Backslash) wird als Escape-Zeichen (Fluchtsymbol) für spezielle Zeichen (z.B. * , +, ?) oder Zeichenfolgen (s.u.) genutzt (also zur Erzeugung von Escape-Sequenzen).
9. Eckige Klammern[]
Die eckigen Klammern werden genutzt, um eine Menge von passenden Zeichen anzugeben.
10. Senkrechter Strich |
Der senkrechte Strich (Verkettungszeichen, engl. [comp.] pipe) wird zur OderVerbindung beliebiger regulärer Ausdrücke genutzt.
11. Runde Klammern ()
Die runden Klammern werden zur Gruppierung genutzt. Der gesamte Ausdruck matcht alles, was innerhalb der Klammern gematcht wird. Auf den Inhalt der Gruppe (den match) kann später erneut zugriffen werden.
\zahl
\zahl matcht den Inhalt der Gruppe mit der angegebenen Zahl
import re #Modul für reguläre Ausdrücke
pattern = r"((der|die|das) Nutella)"
string = "das Nutella ist leer"
match = re.match(pattern, string).group(); match
#'das Nutella'
import re #Modul für reguläre Ausdrücke
pattern = r"((der|die|das) Nutella)"
string = "OHH NEIN das Nutella ist leer"
match = re.match(pattern, string).group(); match
#AttributeError: 'NoneType' object has no attribute 'group'
import re #Modul für reguläre Ausdrücke
pattern = r"((der|die|das) Nutella)"
string = "OHH NEIN das Nutella ist leer"
match = re.search(pattern, string).group(); match
#'das Nutella'
import re #Modul für reguläre Ausdrücke
pattern = r"\d{2}.\d{2}.\d{4}" #Datum tt.mm.jjjj
string = "28.02.2000 Corinnas Geburtstag, 05.12.1999 Neles Geburtstag, 02.05.1997 Kais Geburtstag"
match = re.findall(pattern, string); match
#['28.02.2000', '05.12.1999', '02.05.1997']