Python: Unterschied zwischen den Versionen

Aus Flinkwiki
Wechseln zu: Navigation, Suche
(break)
(Links und Quellen)
 
(281 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
<div align="right"><big>'''[https://flinkwiki.de/index.php?title=Kategorie:Alle_Seiten Seitenübersicht]'''</big></div>
 
<div align="right"><big>'''[https://flinkwiki.de/index.php?title=Kategorie:Alle_Seiten Seitenübersicht]'''</big></div>
 +
<div align="right">'''[[Python: Klassen|Zur Seite "Python: Klassen"]]'''</div>
 +
<div align="right">'''[[Python: Module|Zur Seite "Python: Module"]]'''</div>
 
<div align="right">'''[[Python: Turtle|Zur Seite "Python: Turtle"]]'''</div>
 
<div align="right">'''[[Python: Turtle|Zur Seite "Python: Turtle"]]'''</div>
 
<div align="right">'''[[Python: Tkinter|Zur Seite "Python: Tkinter"]]'''</div>
 
<div align="right">'''[[Python: Tkinter|Zur Seite "Python: Tkinter"]]'''</div>
<div align="right">'''[[Python: pygame|Zur Seite "Python: pygame"]]'''</div>
+
<div align="right">'''[[Python: Pygame|Zur Seite "Python: Pygame"]]'''</div>
<div align="right">'''[[Python: Module|Zur Seite "Python: Module"]]'''</div>
+
<div align="right">'''[[Python: PyQT|Zur Seite "Python: PyQT"]]'''</div>
 +
<div align="right">'''[[Python: Anaconda|Zur Seite "Python: Anaconda"]]'''</div>
 +
 
  
 
== Allgemeines ==
 
== Allgemeines ==
Zeile 10: Zeile 14:
  
 
* https://www.python.org/
 
* https://www.python.org/
 +
 +
----
 +
=== Coding Conventions ===
 +
 +
* https://www.python.org/dev/peps/pep-0008/
 +
 +
----
 +
=== Online-Interpreter===
 +
 +
Ein Online-Interpreter befindet sich auf
 +
* https://repl.it/
 +
 +
* https://www.techbeamers.com/best-python-interpreter-execute-python-online/
 +
 +
Hier kann man sich ein Login erstellen. Man kann auch ein anonymes ''repl'' aufrufen, z. B.
 +
 +
* https://repl.it/repls/WittyForcefulDatabases
 +
 +
----
  
 
=== shebang ===
 
=== shebang ===
Zeile 19: Zeile 42:
 
Gegebenenfalls muss das Skript vorher aufführbar gemacht werden:
 
Gegebenenfalls muss das Skript vorher aufführbar gemacht werden:
 
  chmod 0755 script.py
 
  chmod 0755 script.py
 +
Unter Windows wird der "shebang" ignoriert.
  
 
----
 
----
  
== IDLE ==
+
== IDEs ==
 +
 
 +
=== IDLE ===
 
IDLE ist die IDE des Python-Projekts.
 
IDLE ist die IDE des Python-Projekts.
  
=== IDLE personalisieren ===
+
==== IDLE personalisieren ====
 
> ''Options, Configure IDLE''
 
> ''Options, Configure IDLE''
  
==== Verhalten bei F5 ====
+
===== Verhalten bei F5 =====
 
Die Aufforderung zu speichern bei der Ausführung einer noch nicht gesicherten Datei abschalten:
 
Die Aufforderung zu speichern bei der Ausführung einer noch nicht gesicherten Datei abschalten:
 
* Reiter ''General'', ''At Start of Run (F5) > No Prompt''
 
* Reiter ''General'', ''At Start of Run (F5) > No Prompt''
  
 
----
 
----
==== History in der IDLE-Shell aktivieren ====
+
===== History in der IDLE-Shell aktivieren =====
 
* Reiter ''Keys > history-next'' > ''Get New Keys for Selection'', 'Up Arrow'' und ''Down Arrow'' auswählen und speichern.
 
* Reiter ''Keys > history-next'' > ''Get New Keys for Selection'', 'Up Arrow'' und ''Down Arrow'' auswählen und speichern.
  
 
----
 
----
 +
==== Kommandozeile beenden ====
 +
 +
Die Kommandozeile wird in ''IDLE'', ''bash'' oder ''cmd'' folgendermaßen beendet:
 +
exit()
 +
oder
 +
quit()
 +
oder
 +
Strg-D
 +
 +
----
 +
 +
=== Thonny ===
 +
 +
Thonny ist eine minimalistische IDE, die nur die für Einsteiger notwendigen Grundfunktionen enthält. Thonny gibt es für Windows, Mac und Linux.
 +
 +
Installation auf Ubuntu:
 +
apt install thonny
 +
 +
----
 +
 +
* https://thonny.org/
 +
 +
----
 +
 +
Auskommentieren mit <code>Alt-3</code>
 +
 +
Einkommentieren (Kommentierung entfernen) mit <code>Alt-4</code>
 +
 +
----
 +
 +
=== Pycharm ===
 +
 +
Pycharm hat einen wesentlich größeren Funktionsumfang als IDLE oder Thonny. Pycharm gibt es für Windows, Mac und Linux. Neben der Professional Edition gibt es auch eine kostenlose Community Edition.
 +
 +
Installation auf Ubuntu:[https://linuxize.com/post/how-to-install-pycharm-on-ubuntu-18-04/]
 +
snap install pycharm-community --classic
 +
 +
oder manuell Tarball.[https://itsfoss.com/install-pycharm-ubuntu/]
 +
 +
* https://www.jetbrains.com/pycharm/
 +
* https://itsfoss.com/install-pycharm-ubuntu/
 +
 +
----
 +
 +
=== Visual Studio ===
 +
 +
Die Entwicklungsumgebung Visual Studio von Microsoft lässt sich auch um Funktionalitäten für Python erweitern.
 +
 +
----
 +
 +
=== Pyzo ===
 +
 +
* https://pyzo.org/
 +
 +
Installation unter Ubuntu:
 +
pip install pyzo --upgrade
 +
Vorausgesetzt wird eine vorhandene Python-Installation unter Ubuntu (''apt-get install python3-pip python3-pyqt5'')[https://pyzo.org/install_linux.html])
 +
 +
----
 +
 +
=== Wing ===
 +
Installation:
 +
sudo snap install wing-personal7 --classic
 +
[http://ubuntuhandbook.org/index.php/2019/06/wing-python-ide-available-to-install-via-snap-in-ubuntu/]
 +
 +
Aufruf im Terminal mit
 +
wing-personal7
 +
 +
----
 +
=== mu ===
 +
 +
https://codewith.mu/ Code with Mu: a simple Python editor for beginner programmers.
 +
 +
Installieren mit
 +
sudo apt-get install mu-editor
 +
oder
 +
pip3 install mu-editor
 +
 +
Starten mit
 +
  python3 –m mu
 +
 +
* https://wiki.ubuntuusers.de/Mu/
 +
 +
----
 +
 
== Funktionen ==
 
== Funktionen ==
 +
=== Allgemeines ===
 +
 +
* https://www.python-kurs.eu/python3_funktionen.php
 +
 +
----
  
 
=== Funktionsadresse in Variablen speichern ===
 
=== Funktionsadresse in Variablen speichern ===
Zeile 123: Zeile 239:
 
  >>> rechnen(3,4)
 
  >>> rechnen(3,4)
 
  7
 
  7
 +
 +
----
 +
=== Rekursion ===
 +
 +
Eine rekursive Funktion ist eine Funktion, die sich selbst wieder aufruft:
 +
<nowiki>
 +
# Fakultätsberechnung
 +
def fak (x):
 +
    if x == 1:
 +
        return 1
 +
    else:
 +
        return(x*fak(x-1))
 +
 +
print(fak(5)) # Ergebnis: 120
 +
</nowiki>
 +
----
 +
Eventuell muss man eine Abbruchbedingung einbauen:
 +
<nowiki>
 +
def rek (x):
 +
    print(x)
 +
    x += 1
 +
    if x < 100:
 +
        rek(x)
 +
   
 +
rek(1)
 +
</nowiki>
 +
----
 +
 +
=== input() ===
 +
''input()'' hält das Programm an und wartet auf eine Tastatureingabe. Die Eingabe kann in einer Variablen gespeichert werden; diese hat den Dateityp ''string''. Unter bestimmten Bedingungen kann der Dateityp umgewandelt werden, z. B. Ziffern können mit ''int()'' oder ''float()'' in Ganzzahlen bzw. Gleitkommazahlen konvertiert werden.
 +
 +
=== Umwandlung mit ''eval()'' ===
 +
Strings, Tupel und Dictionarys werden mit ''eval()'' umgewandelt:
 +
<nowiki>
 +
>>> a = input("Eingabe: ")
 +
Eingabe: ["Egon","Thea","Emma"]
 +
>>> a
 +
'["Egon","Thea","Emma"]'
 +
>>> b = list(a)
 +
>>> b
 +
['[', '"', 'E', 'g', 'o', 'n', '"', ',', '"', 'T', 'h', 'e', 'a', '"', ',', '"', 'E', 'm', 'm', 'a', '"', ']']
 +
>>> c = eval(a)
 +
>>> c
 +
['Egon', 'Thea', 'Emma']
 +
>>>
 +
</nowiki>
 +
 +
----
 +
=== Mehrere Eingaben ===
 +
 +
<nowiki>
 +
>>> a,b,c = input("3 Eingaben, getrennt durch Leerzeichen: ").split()
 +
3 Eingaben, getrennt durch Leerzeichen: Python, Perl, Javascript
 +
>>> a
 +
'Python,'
 +
>>> b
 +
'Perl,'
 +
>>> c
 +
'Javascript'
 +
</nowiki>
  
 
----
 
----
Zeile 128: Zeile 304:
 
=== format() ===
 
=== format() ===
  
  name = input("Wie heißt du? ")
+
  name = John
  alter = int(input("Wie alt bist du? "))
+
  alter = 44
 
  print("Du heißt {} und bist {} Jahre alt.".format(name,alter))
 
  print("Du heißt {} und bist {} Jahre alt.".format(name,alter))
 
[...] Ausgabe:
 
[...] Ausgabe:
  Du heißt Jon und bist 44 Jahre alt.
+
  Du heißt John und bist 44 Jahre alt.
 +
 
 +
----
 +
 
 +
Textausrichtung:
 +
print('{:<25}'.format(text)) # linksbündig
 +
print('{:>25}'.format(text)) # rechtsbündig
 +
print('{:^25}'.format(text)) # zentriert
 +
 
 +
----
 +
 
 +
Statt ''format()'' werden in neueren Python-Versionen ''formatierte Strings'' (''f-strings'') empfohlen:[https://realpython.com/python-f-strings/#f-strings-a-new-and-improved-way-to-format-strings-in-python]
 +
print('''f'''"Du heißt {name} und bist {alter} Jahre alt.")
 +
 
 +
----
 +
 
 +
=== Currying ===
 +
 
 +
Currying ... ist die Umwandlung einer Funktion mit mehreren Argumenten in eine Sequenz von Funktionen mit jeweils einem Argument.[https://de.wikipedia.org/wiki/Currying]
 +
 
 +
<nowiki>
 +
def uncurried_add(x, y):
 +
    return x + y
 +
 
 +
def curried_add(x):
 +
    return lambda y: x + y
 +
 
 +
print(uncurried_add(3, 5)) # 8
 +
print(curried_add(3)(5)) # 8
 +
 
 +
add_three = curried_add(3)
 +
print(add_three(5)) # 8
 +
print(add_three(12)) # 15
 +
</nowiki>
  
 
----
 
----
Zeile 138: Zeile 347:
 
== String ==
 
== String ==
 
Ein String, oder Zeichenkette, kann man als eine Sequenz von einzelnen Zeichen sehen.[https://www.python-kurs.eu/python3_variablen.php]
 
Ein String, oder Zeichenkette, kann man als eine Sequenz von einzelnen Zeichen sehen.[https://www.python-kurs.eu/python3_variablen.php]
 +
 +
=== String-Formatierung ===
 +
==== Eingebaute Funktion ''format'' ====
 +
 +
<nowiki>
 +
wert1 = 1.0 / 3.0
 +
wert2 = 10.0 / 7.0
 +
# Formatierte Ausgabe:
 +
print("Wert 1: {0:.2f}, Wert 2: {1:.4f}".format(wert1, wert2))
 +
 +
Ausgabe:
 +
Wert 1: 0.33, Wert 2: 1.4286
 +
</nowiki>
 +
 +
----
 +
==== String-Literale / f-strings ====
 +
 +
<nowiki>
 +
wert1 = 1.0 / 3.0
 +
wert2 = 10.0 / 7.0
 +
# Formatierte Ausgabe mit String-Literal:
 +
print(f"Wert 1: {wert1:.2f}, Wert 2: {wert2:.4f}")
 +
 +
Ausgabe:
 +
Wert 1: 0.33, Wert 2: 1.4286
 +
</nowiki>
 +
 +
----
 +
 
=== Auslesen von Zeichen aus der Kette ===
 
=== Auslesen von Zeichen aus der Kette ===
 
Über die Indexnummern der Zeichenkette kann man einzelne Zeichen ausgeben lassen:
 
Über die Indexnummern der Zeichenkette kann man einzelne Zeichen ausgeben lassen:
Zeile 162: Zeile 400:
  
 
----
 
----
=== upper case und lower case ===
+
=== String-Methoden ===
 +
 
 +
Liste eingebauter String-Methoden:
 +
* https://www.w3schools.com/python/python_ref_string.asp
 +
 
 +
----
 +
=== Prüfen auf Datentyp ''str'' ===
 +
 
 +
if isinstance(value, str):
 +
ergibt ''True'', wenn es sich um eine Variable vom Typ string handelt.
 +
 
 +
----
 +
 
 +
==== upper case / lower case / title ====
 
Strings können in Groß- bzw. Kleinbuchstaben umgewandelt werden:
 
Strings können in Groß- bzw. Kleinbuchstaben umgewandelt werden:
 
  >>> string1 = "hallo"
 
  >>> string1 = "hallo"
Zeile 173: Zeile 424:
 
  >>> print(string2)
 
  >>> print(string2)
 
  guten tag
 
  guten tag
 +
 +
>>> string3 = "schmitz"
 +
>>> string3 = string3.title()
 +
>>> string3
 +
'Schmitz'
  
 
----
 
----
=== Teilstrings ersetzen mit ''replace'' ===
+
<nowiki>
 +
>>> text = "AB"
 +
>>> text  = str.lower(text)
 +
>>> text
 +
'ab'
 +
</nowiki>
 +
----
 +
 
 +
==== Teilstrings ersetzen mit ''replace'' ====
  
 
  >>> meinString = "Mein neues Programm"
 
  >>> meinString = "Mein neues Programm"
Zeile 181: Zeile 445:
 
  >>> print (meinString)
 
  >>> print (meinString)
 
  Mein schönes Programm
 
  Mein schönes Programm
 +
 +
----
 +
 +
==== Testen auf numerische Eingabe ====
 +
 +
Test, alle Zeichen in einem String numerisch sind:
 +
str.isnumeric()
 +
<nowiki>
 +
>>> za='45'
 +
>>> za.isnumeric()
 +
True</nowiki>
 +
 +
----
 +
 +
=== in-Operator ===
 +
 +
Der ''in''-Operator gibt einen booleschen Wert zurück:
 +
>>> sd = "Jason"
 +
>>> print("s" in sd)
 +
True
 +
 +
----
 +
=== Backslash ===
 +
Der Backslash hat folgende Funktionen:
 +
[[Datei:Backslash.png|mini|left]]
 +
[https://www.packtpub.com/product/the-python-workshop/9781839218859]
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
 
----
 
----
Zeile 186: Zeile 491:
 
== Zahlen ==
 
== Zahlen ==
 
Es gibt Ganzzahlen (int), Fließkommazahlen (float) und komplexe Zahlen (complex).
 
Es gibt Ganzzahlen (int), Fließkommazahlen (float) und komplexe Zahlen (complex).
 +
 +
* https://overiq.com/python-101/numbers-in-python/
 +
----
 +
=== Ganzzahlen ===
 +
==== dezimal - binär - octal - hexadezimal ====
 +
{| class="wikitable"
 +
!style="width:100em"  | dezimal || style="width:100em"  | binär || style="width:100em"  | octal || style="width:100em"  | hexadezimal 
 +
|-
 +
|style="width:100em"  | 31 || style="width:100em"  | bin(31) = 0b11111 || style="width:100em"  | oct(31) = 0o37 || style="width:100em"  | hex(31) = 0x1f
 +
|}
 +
Die Verwandlung in dezimale Ganzzahlen erfolgt mit <code>int()</code>: int(0b11111) == 31
 +
 +
----
 +
==== Ganzzahlige Division / floor division ====
 +
Operator ''//'
 +
In [11]: -13 // 4                                                             
 +
Out[11]: -4
 +
-4 ist die nächstkleinere Zahl!
 +
 +
----
 +
 +
=== Exponentialschreibweise ===
 +
Es ist möglich, sehr große oder sehr kleine float-Zahlen mittels e oder E in Exponential-Schreibweise anzugeben. Die Zahl hinter dem e gibt dabei an, um wie viele Stellen der Dezimalpunkt innerhalb der Zahl verschoben wird.[https://www.grund-wissen.de/informatik/python/datentypen.html]
 +
<nowiki>
 +
>>> 4.3e3
 +
4300.0
 +
>>> 7.92e-5 == 0.0000792
 +
True
 +
>>>
 +
</nowiki>
 +
 +
----
 +
Umwandlung mit format()
 +
>>> format(5.8e-06, ".8f")
 +
'0.00000580'
 +
[https://steakrecords.com/674420-how-to-convert-exponential-value-to-string-format-in-python-python-python-3x.html]
 +
 +
----
 +
 +
===Komplexe Zahlen ===
 +
Python includes complex numbers as an official type. Complex numbers arise when taking the square roots of negative numbers. There is no real number whose square root is -9, so we say that it equals 3i where i represent the square root of -1. Another example of a complex number is 2i + 3. Python uses j instead of i.
 +
 +
You can take a look at the following code snippet to learn how to work with complex number types.
 +
 +
Divide 2 + 3j by 1 - 5j, enclosing both operations within parentheses:[https://www.packtpub.com/product/the-python-workshop/9781839218859]
 +
<nowiki>
 +
>>> (2 + 3j) / (1 - 5j)
 +
(-0.5+0.5j)</nowiki>
 +
 +
>>> a = 2 + 3j
 +
>>> type(a)
 +
<class 'complex'>
 +
Man kann auch die Funktion ''complex'' verwenden:
 +
>>> a = complex(2, 3)
 +
>>> a
 +
(2 + 3j)
 +
Den Betrag kann man u. a. mit ''abs()'' ermitteln:
 +
>>> a = complex(2, 3)
 +
>>> abs(a)
 +
3.605551275463989
 +
 +
The standard library’s cmath module ( cmath for complex math) provides
 +
access to a number of other specialized functions to work with complex
 +
numbers.
 +
* https://docs.python.org/3.7/library/cmath.html
 +
 +
----
  
 
=== Funktion ''abs()'' ===
 
=== Funktion ''abs()'' ===
Zeile 212: Zeile 584:
  
 
----
 
----
 +
=== Funktion ''eval()'' ===
 +
Diese Funktion übernimmt String-Argumente und wertet sie Python-Ausdruck aus:
 +
>>> eval('12 + 3')
 +
15
 +
 +
----
 +
 
=== Modul ''math'' ===
 
=== Modul ''math'' ===
 
Für die Verwendung der ''math''-Funktionen (''ceil, floor, sqrt'' etc.) muss zuerst das Modul ''math'' importiert werden:
 
Für die Verwendung der ''math''-Funktionen (''ceil, floor, sqrt'' etc.) muss zuerst das Modul ''math'' importiert werden:
Zeile 217: Zeile 596:
 
bzw.
 
bzw.
 
  <code>from math import *</code>
 
  <code>from math import *</code>
 +
 +
* https://docs.python.org/3/library/math.html
  
 
* [https://docs.python.org/3/library/math.html docs.python.org: Mathematical functions]
 
* [https://docs.python.org/3/library/math.html docs.python.org: Mathematical functions]
  
 
* https://www.tutorialsteacher.com/python/math-module
 
* https://www.tutorialsteacher.com/python/math-module
 +
 +
----
 +
=== Brüche: Modul ''fractions'' ===
 +
<nowiki>
 +
>>> from fractions import Fraction
 +
>>> f = Fraction(3, 4)
 +
>>> f
 +
Fraction(3, 4)
 +
>>> float(f)
 +
0.75</nowiki>
 +
''fractions'' können mit anderen Zahlentypen kombiniert werden:
 +
>>> Fraction(3, 4) + 1 + 1.5
 +
3.25
 +
Wenn in dem Ausdruck ein ''float'' enthalten ist, wird das Ergebnis als ''float'' ausgegeben. Bei der Rechnung mit einem ''Fraction'' und einem ''int'' wird ein ''Fraction'' ausgegeben.
 +
>>> Fraction(3, 4) + 1 + Fraction(1/4)
 +
Fraction(2, 1)
 +
Fractions lassen sich mit den Funktionen ''int()'' und ''float'' umwandeln.
 +
 +
----
 +
=== isinteger() ===
 +
Prüft, ob eine Gleitpunktzahl den gleichen Wert wie eine Ganzzahl hat.
 +
>>> 1.1.is_integer()
 +
False
 +
>>> 1.0.is_integer()
 +
True
  
 
----
 
----
Zeile 227: Zeile 633:
  
 
Die Liste (''list'') ist ein sequentieller Datentyp. Was Python eine Liste nennt, würde in den meisten anderen Programmiersprachen als Array bezeichnet werden.[https://cscircles.cemc.uwaterloo.ca/13-de/]
 
Die Liste (''list'') ist ein sequentieller Datentyp. Was Python eine Liste nennt, würde in den meisten anderen Programmiersprachen als Array bezeichnet werden.[https://cscircles.cemc.uwaterloo.ca/13-de/]
 +
 +
Listenelemente werden über einen 0-basierten Index angesprochen. Man kann auf Listen auch vom Ende her zugreifen. Dann ist -1 der Index für das letzte Element, -2 für das vorletzte usw.
 +
 +
----
 +
 +
=== Mit ''range'' Zahlenliste erstellen ===
 +
Beispiel:
 +
zahlenliste = list(range(1,11))
 +
print(zahlenliste) # Ausgabe: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 +
 +
----
 +
=== Listen addieren ===
 +
<nowiki>
 +
>>> a = ['h', 'a', 'l', 'l', 'o']
 +
>>> b = ['h', 'a', 'l']
 +
>>> c = a + b
 +
>>> c
 +
['h', 'a', 'l', 'l', 'o', 'h', 'a', 'l']
 +
</nowiki>
 +
 +
----
  
 
=== extend() ===
 
=== extend() ===
Zeile 240: Zeile 667:
  
 
# Extended List
 
# Extended List
print('Language List: ', language)
+
print('Language List: ', language) # Ausgaben: Language List:  ['French', 'English', 'German', 'Spanish', 'Portuguese']
 
</nowiki>[https://www.programiz.com/python-programming/methods/list/extend]
 
</nowiki>[https://www.programiz.com/python-programming/methods/list/extend]
 
Alternativ:  
 
Alternativ:  
Zeile 269: Zeile 696:
 
* ''reverse()'' kehrt die Reihenfolge um.
 
* ''reverse()'' kehrt die Reihenfolge um.
 
* ''copy()'' erstellt einen Klon der Liste: ''list2 = list1.copy()''
 
* ''copy()'' erstellt einen Klon der Liste: ''list2 = list1.copy()''
 +
 +
----
 +
 +
=== Listen ausgeben ===
 +
 +
=== Ausgabe mit ''print'' ===
 +
<nowiki>
 +
>>> metres = [1, 4, 9, 16, 25, 36,'hallo']
 +
>>> print(*metres)
 +
1 4 9 16 25 36 hallo
 +
</nowiki>
 +
 +
----
 +
=== Nummerierte Ausgabe mit ''enumerate'' ===
 +
<nowiki>
 +
>>> b = ['h', 'a', 'l']
 +
>>> for i,j in enumerate(b):
 +
...    print(i,j)
 +
...
 +
0 h
 +
1 a
 +
2 l
 +
>>>
 +
</nowiki>
 +
 +
----
 +
 +
=== Listenobjekte vertauschen ===
 +
<nowiki>
 +
zahlenliste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 +
zahlenliste.insert(2,zahlenliste.pop(3))
 +
print(zahlenliste) #Ausgabe: [1, 2, 4, 3, 5, 6, 7, 8, 9, 10]
 +
</nowiki>
 +
 +
----
 +
 +
=== Liste in String umwandeln ===
 +
 +
Voraussetzung: Die Objekte in der Liste sind vom Ty ''str''.
 +
<nowiki>
 +
>>> li = ['h','a','l','l','o']
 +
>>> li
 +
['h', 'a', 'l', 'l', 'o']
 +
>>> st = ''.join(li)
 +
>>> st
 +
'hallo'
 +
</nowiki>
 +
 +
----
 +
=== Mehrfachzuweisung (multiple assignment trick, tuple unpacking) ===
 +
<nowiki>
 +
>>> cat = ['fat', 'gray', 'loud']
 +
>>> size, color, disposition = cat
 +
>>> disposition
 +
'loud'
 +
</nowiki>
  
 
----
 
----
  
 
=== Listen sortieren ===
 
=== Listen sortieren ===
 
+
==== sort() ====
 
Funktion <code>sort()</code>:
 
Funktion <code>sort()</code>:
 
''liste.sort()''
 
''liste.sort()''
 +
  cars = ['bmw', 'audi', 'toyota', 'subaru']
 +
cars.sort()
 +
Ausgabe: ['audi', 'bmw', 'subaru', 'toyota']
 +
 +
... in umgekehrter Reihenfolge:
 +
<nowiki>
 +
>>> cars = ['bmw', 'audi', 'toyota', 'subaru']
 +
>>> cars.sort(reverse=True)
 +
>>> cars
 +
['toyota', 'subaru', 'bmw', 'audi']</nowiki>
 +
 +
... nicht case-sensitiv:
 +
<nowiki>
 +
>>> spam = ['a', 'z', 'A', 'Z']
 +
>>> spam.sort(key=str.lower)
 +
>>> spam
 +
['a', 'A', 'z', 'Z']</nowiki>
 +
 +
----
 +
 +
==== sorted() ====
 +
 +
cars = ['bmw', 'audi', 'toyota', 'subaru']
 +
y = sorted(cars)
 +
Ausgabe y: ['audi', 'bmw', 'subaru', 'toyota']
 +
----
 +
und rückwärts sortiert:
 +
y = sorted(cars, reverse=True)
 +
Ausgabe y: ['toyota', 'subaru', 'bmw', 'audi']
  
 
----
 
----
Zeile 281: Zeile 793:
 
==== Bubblesort ====
 
==== Bubblesort ====
 
  <nowiki>
 
  <nowiki>
def bubblesort(x, Index) :
+
def exchange(x1, x2) :
    for i in range(Index) :
+
  Tausch = x1
        for j in range(Index-i-1) :
+
  x1 = x2
          if x[j] > x[j+1] :
+
  x2 = Tausch
            x[j], x[j+1] = exchange(x[j], x[j+1]);
+
  return x1, x2
 +
def bubblesort(x, Index):
 +
  for i in range(Index):
 +
    for j in range(Index-i-1):
 +
      if x[j] > x[j+1] :
 +
        x[j], x[j+1] = exchange(x[j], x[j+1]);
 +
 
 +
x = [14,6,44,89,26]
 +
Index = len(x)
 +
bubblesort(x,Index)
 +
print(x)
 +
</nowiki>
 +
Ausgabe:
 +
[6, 14, 26, 44, 89]
 +
Quelle: [https://www.mitp.de/IT-WEB/fuer-Kids/Python-fuer-Kids-oxid.html], S. 105
 +
 
 +
----
 +
Kürzere Version:
 +
<nowiki>
 +
def bubbleSort(nlist):
 +
    for passnum in range(len(nlist)-1,0,-1):
 +
        for i in range(passnum):
 +
            if nlist[i]>nlist[i+1]:
 +
                temp = nlist[i]
 +
                nlist[i] = nlist[i+1]
 +
                nlist[i+1] = temp
 +
 
 +
nlist = [14,46,43,27,57,41,45,21,70]
 +
bubbleSort(nlist)
 +
print(nlist)
 +
</nowiki>[https://www.w3resource.com/python-exercises/data-structures-and-algorithms/python-search-and-sorting-exercise-4.php]
 +
 
 +
----
 +
 
 +
=== List Comprehension (Listen-Abstraktion, Listennotation===
 +
 
 +
''List comprehensions'' sind syntaktische Gefüge, die beschreiben, wie vorhandene Listen oder andere iterierbare Objekte verarbeitet werden, um aus ihnen neue Listen zu erstellen.[https://de.wikipedia.org/wiki/List_Comprehension]
 +
<nowiki>
 +
>>> l1 = [0, 1, 2, 3, 4, 5]
 +
>>> l2 = [i*i for i in l1]
 +
>>> l2
 +
[0, 1, 4, 9, 16, 25]
 +
</nowiki>
 +
 
 +
----
 +
<nowiki>
 +
>>> liste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 +
>>> [i for i in liste if i % 2 == 0]
 +
[2, 4, 6, 8, 10]
 +
</nowiki>[https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/232143-creez-des-listes-et-des-tuples-2-2]
 +
 
 +
----
 +
 
 +
<nowiki>
 +
>>> abverkauf = 9
 +
>>> auf_lager = [21, 7, 9, 11]
 +
>>> uebrig = [i - abverkauf for i in auf_lager if i > abverkauf]
 +
>>> uebrig
 +
[12, 2]
 +
</nowiki>
 +
 
 +
----
 +
 
 +
Inventarliste, die Paare als Tupel enthält absteigend nach Menge sortieren:
 +
<nowiki>
 +
bestand = [("Äpfel", 22), ("Melonen", 4), ("Birnen", 18),
 +
          ("Orangen", 76), ("Grapefruit", 51),]
 +
absteigend_sortiert = [(j, i) for i,j in bestand]
 +
absteigend_sortiert.sort(reverse=True)
 +
bestand = [(i, j) for j,i in absteigend_sortiert]
 +
print(bestand)
 
</nowiki>
 
</nowiki>
Beispiel: <br>''bubblesort(liste,6)<br>print(liste)''
 
  
 
----
 
----
  
 
== Tupel ==
 
== Tupel ==
Tupel (''tuple') können so wie Listen über Indexnummern abgerufen werden. Allerdings sind Tupel unveränderlich.
+
Tupel (''tuple'') können so wie Listen über Indexnummern abgerufen werden. Allerdings sind Tupel unveränderlich.
 
  >>> koordinaten = (2,3,4)
 
  >>> koordinaten = (2,3,4)
 
  >>> print (koordinaten[0])
 
  >>> print (koordinaten[0])
Zeile 304: Zeile 885:
 
  3
 
  3
 
   
 
   
 +
----
 +
== Set (Menge) ==
 +
Sammlung von Objekten, die durch Kommata voneinander getrennt werden und mit geschweiften Klammern umgeben sind. Ein set-Objekt ist eine nicht geordnete  Kollektion unveränderbarer Objekte.
 +
  a = {'i', 'e'}
 +
In einem Set kann jeder Wert nur einmal vorkommen. Die Set-Datenstruktur ist für sehr schnelle Nachschlageoperationen optimiert.
 +
<nowiki>
 +
>>> a = 'eieieieieieii'
 +
>>> a
 +
'eieieieieieii'
 +
>>> a = list(a)
 +
>>> a
 +
['e', 'i', 'e', 'i', 'e', 'i', 'e', 'i', 'e', 'i', 'e', 'i', 'i']
 +
>>> a = set(a)
 +
>>> a
 +
{'i', 'e'}
 +
>>> a= list(a)
 +
>>> a
 +
['i', 'e']
 +
</nowiki>
 +
 +
----
 +
=== add() ===
 +
<nowiki>
 +
>>> a = {'i', 'e'}
 +
>>> a.add('f')
 +
>>> a
 +
{'f', 'e', 'i'}
 +
</nowiki>
 +
----
 +
=== discard() ===
 +
<nowiki>
 +
>>> a = {'f', 'e', 'i'}
 +
>>> a.discard('e')
 +
>>> a
 +
{'f', 'i'}
 +
</nowiki>
 +
----
 +
=== frozenset ===
 +
 +
frozenset-Objekte sind wie Tupel oder Strings nicht änderbar.
 +
 
----
 
----
  
Zeile 317: Zeile 939:
 
  wert4
 
  wert4
 
Es können verschiedene Datentypen verwendet werden, z. B. auch Zahlen.
 
Es können verschiedene Datentypen verwendet werden, z. B. auch Zahlen.
 +
----
 +
=== get() ===
 +
Bei Verwendung von ''get()'' können Default-Werte gesetzt werden:
 +
<nowiki>
 +
monate = {1:"Januar",2:"Februar",3:"März",4:"April",5:"Mai",6:"Juni",12:"Dezember"}
 +
print(monate.get(12,"Schlüssel nicht zulässig"))</nowiki>
 +
Ausgabe: Dezember
 +
print(monate.get(13,"Schlüssel nicht zulässig"))
 +
Ausgabe: Schlüssel nicht zulässig
 +
 +
----
 +
 +
=== Dictionarys verändern ===
 +
 +
Dictionarys verbinden:
 +
<nowiki>
 +
>>> d = {'A': 1, 'B': 2, 'C': 3}
 +
>>> e ={'E':33}
 +
>>> d.update(e)
 +
>>> d
 +
{'A': 1, 'B': 2, 'C': 3, 'E': 33}
 +
</nowiki>
 +
 +
----
 +
oder:
 +
<nowiki>
 +
>>> a = {"Name":"John Doe","Wohnort":"Hollywood"}
 +
>>> b = {"Alter":56,"Beruf":"Schauspieler"}
 +
>>> c = {**a, **b}
 +
>>> c
 +
{'Name': 'John Doe', 'Wohnort': 'Hollywood', 'Alter': 56, 'Beruf': 'Schauspieler'}
 +
</nowiki>
 +
----
 +
Dictionarys erweitern:
 +
woerter = {}
 +
woerter["Denmark"] = "Dänemark"
 +
woerter["Poland"] = "Polen"
 +
print(woerter)
 +
Ausgabe:
 +
{'Denmark': 'Dänemark', 'Poland': 'Polen'}
 +
 +
----
 +
 +
=== Schlüssel überprüfen ===
 +
 +
Damit Skripte mit Dictionarys nicht auf Fehler laufen, überprüft man vorab, ob der jeweilige Schlüssel existiert.
 +
 +
Überprüfung mit den Operator ''in'':
 +
<nowiki>
 +
zaehler = dict()
 +
namen = ["Orga","Leos","Inter","Sovital","Algebraic"]
 +
for i in namen:
 +
    if i not in zaehler:
 +
        zaehler[i] = 1
 +
    else:
 +
        zaehler[i] = zaehler[i] + 1
 +
print(zaehler)
 +
{'Orga': 1, 'Leos': 1, 'Inter': 1, 'Sovital': 1, 'Algebraic': 1}
 +
</nowiki>
 +
 +
Überprüfung mit der Methode ''get()'':
 +
zaehler.get("Imotech", "nicht vorhanden")
 +
print(zaehler["Imotech"])
 +
Ausgabe:
 +
Wert für Imotech: nicht vorhanden.
 +
 +
Mit existierendem Schlüssel:
 +
zahl = zaehler.get("Leos", "nicht vorhanden")
 +
print(f"Zahl für Leos: {zahl}.")
 +
Ausgabe:
 +
Wert für Leos: 1.
 +
 +
Für einen bisher nicht existierenden Wert Schlüssel-Wert-Paar erstellen:
 +
zahl = zaehler.get("Imotech", 0) + 1
 +
print(f"Zahl für Imotech: {zahl}.")
 +
Ausgabe:
 +
Wert für Imotech: 1.
 +
 +
----
 +
 +
=== Abfrage des Wertes mit values() ===
 +
 +
Die Methode ''values()'' ermöglicht die Verwendung einer Durchlaufvariablen zur Abfrage des Wertes:
 +
<nowiki>
 +
>>> d = {'A': 1, 'B': 2, 'C': 3}
 +
>>> for i in d.values():
 +
...    print(i)
 +
...
 +
1
 +
2
 +
3
 +
</nowiki>
 +
----
 +
 +
=== Abfrage von Schlüssel und Wert mit items() ===
 +
 +
Die Methode ''items()'' ermöglicht die Verwendung zweier Durchlaufvariablen zur Abfrage von Schlüssel und Wert:
 +
<nowiki>
 +
>>> d = {'A': 1, 'B': 2, 'C': 3}
 +
>>> for i,j in d.items():
 +
...    print(i,j)
 +
...
 +
A 1
 +
B 2
 +
C 3
 +
>>>
 +
</nowiki>
 +
----
 +
 +
=== Methode setdefault() ===
 +
 +
Wenn in einem Dictionary Schlüssel-Wert-Paare verarbeitet werden, so führen bei noch nicht vorhandenem Schlüssel Inkrementierungen zu "KeyError-Ausnahmen". Deshalb muss vorher ein Schlüssel initialisiert werden. Wenn noch kein Schlüssel vorhanden ist, setzt die Dictionary-Methode ''setdefault()'' eine Initialisierung.
 +
dictionary.setdefault(key, 0) #
 +
 +
''key'' ist hier der Schlüssel, nach dem gesucht wird und der im Dictionary noch nicht existiert.
 +
 +
default − ist der Wert, der gesetzt wird (z. B. 0). Wenn kein Default-Wert gesetzt wird, setzt Python anstelle eines Wertes ''None'')
 +
 +
Beispiel:
 +
<nowiki>
 +
woerterbuch = {}
 +
...
 +
if key in woerterbuch:
 +
    woerterbuch.setdefault(key, 0) # Initialisierung
 +
    woerterbuch[key] += 1 # Ab jetzt kann inkrementiert werden
 +
</nowiki>
 +
steht für
 +
<nowiki>
 +
woerterbuch = {}
 +
...
 +
if key not in woerterbuch:
 +
    woerterbuch[key] = 0 # Initialisierung
 +
if key in woerterbuch:
 +
    woerterbuch[key] += 1 # Ab jetzt kann inkrementiert werden
 +
</nowiki>
 +
 +
----
 +
 +
=== Dictionary als Schlüsselwort-Argument ===
 +
<nowiki>
 +
>>> sw_arg = {"sep":" >> ", "end":" -\n"}
 +
>>> print("Das","ist","nur","ein","Beispiel",**sw_arg)
 +
Das >> ist >> nur >> ein >> Beispiel -
 +
>>> </nowiki>
 +
 +
----
 +
 +
== Konstanten ==
 +
''None''
 +
 +
signalisiert einen leeren oder nicht vorhandenen Wert.
 +
 +
Wenn eine Funktion keinen Rückgabewert enthält (z. B. <code>print()</code>) oder nur mit ''return'' endet, gibt Python "stillschweigend" den Wert ''None'' zurück.
 +
>>> print(print("hello"))
 +
hello
 +
None
 +
Es ist der einzige Wert des Datentyps "NoneType":
 +
>>> type(None)
 +
<class 'NoneType'>
 +
 +
----
 +
 +
Sonderzeichen:
 +
import string
 +
string.punctuation
 +
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
 +
 +
----
 +
 +
>>> import math
 +
>>> math.pi
 +
3.141592653589793
 +
 +
----
 +
 +
== Operatoren ==
 +
<nowiki>
 +
+      -      *      **      /      //      %      @
 +
<<      >>      &      |      ^      ~      :=
 +
<      >      <=      >=      ==      !=
 +
</nowiki>[https://docs.python.org/3/reference/lexical_analysis.html#operators][https://docs.python.org/3/library/stdtypes.html]
  
 
----
 
----
Zeile 324: Zeile 1.127:
 
* https://www.python-kurs.eu/python3_bedingte_anweisungen.php
 
* https://www.python-kurs.eu/python3_bedingte_anweisungen.php
  
Sonderfall: Bedingung in einer Zeile prüfen:
+
----
 +
 
 +
=== if-Anweisung ===
 +
 
 +
 
 +
----
 +
 
 +
=== Bedingter Ausdruck / conditional expression ===
 +
 
 +
Man kann eine Bedingung in einer Zeile prüfen:
 
  name = input("Is this a test? ")
 
  name = input("Is this a test? ")
 
  x = "YES" if name == "Test" else "NO"
 
  x = "YES" if name == "Test" else "NO"
Zeile 330: Zeile 1.142:
  
 
----
 
----
 +
 
== Schleifen ==
 
== Schleifen ==
  
Zeile 352: Zeile 1.165:
  
 
* https://www.python-kurs.eu/python3_for-schleife.php
 
* https://www.python-kurs.eu/python3_for-schleife.php
 +
 +
----
 +
=== Beispiele: ===
  
 
  <nowiki>
 
  <nowiki>
Zeile 370: Zeile 1.186:
 
----
 
----
  
 +
a = [a+b for a in 'alles' if a != 's' for b in 'gut' if b != 'u']
 +
print(a, end = " ")
 +
Ausgabe:
 +
['ag', 'at', 'lg', 'lt', 'lg', 'lt', 'eg', 'et']
 +
 +
----
 +
 +
=== continue ===
 +
 +
Die Schleife wird unterbrochen:
 +
<nowiki>
 +
for i in 'Hello World':
 +
if i == 'o':
 +
continue
 +
print (i, end = ' ')
 +
 +
H e l l  W r l d </nowiki>
 +
 +
----
 
=== break ===
 
=== break ===
 +
 +
Die Schleife wird verlassen:
 +
<nowiki>
 +
for i in 'Hello World':
 +
if i == 'e':
 +
break
 +
else:
 +
print ("Der Buchstabe 'x' kommt in diesem String nicht vor.")
 +
</nowiki>
 +
Es erfolgt keine Ausgabe.
 +
 +
----
 +
=== else ===
 +
 +
Für Kenner anderer Programmiersprachen kurios: Schleifen können mit ''else'' abgeschlossen werden. Die Anweisungen im else-Teil werden ausgeführt, sobald die Bedingung nicht mehr erfüllt ist
 
  <nowiki>
 
  <nowiki>
 
for i in 'Hello World':
 
for i in 'Hello World':
Zeile 378: Zeile 1.228:
 
print ("Der Buchstabe 'x' kommt in diesem String nicht vor.")
 
print ("Der Buchstabe 'x' kommt in diesem String nicht vor.")
 
</nowiki>
 
</nowiki>
 +
Ausgabe:
 +
Der Buchstabe 'x' kommt in diesem String nicht vor
  
 
----
 
----
  
=== continue ===
+
== Fehler und Ausnahmen / exception ==
 +
 
 +
* https://py-tutorial-de.readthedocs.io/de/latest/errors.html
 +
 
 +
* https://www.python-kurs.eu/python3_ausnahmebehandlung.php
 +
=== unspezifisch ===
 +
<nowiki>
 +
alter = input("Wie alt bist du? ")
 +
try:
 +
  alter = int(alter)
 +
except:
 +
  print("Falsche Eingabe!")
 +
else:
 +
  print("Du bist", alter, "Jahre alt.")
 +
finally:
 +
  print("Programmende")
 +
</nowiki>
 +
<code>else</code> wird nur aktiv, wenn keine Ausnahme ausgelöst wird. <code>finally</code> wird sowohl bei Ausnahmen wie auch ohne Fehler aktiv.
 +
 
 +
===Spezifizierung des Fehlers ===
 +
zahl1 = 150
 +
zahl2 = input("Geben Sie den Divisor an: ")
 +
try:
 +
    zahl2 = int(zahl2)
 +
    print("Der Quotient ist {}".format(zahl1 / zahl2))
 +
except ''ValueError'':
 +
    print("Sie müssen eine Zahl eingeben.")
 +
except  ''ZeroDivisionError'':
 +
    print("Division durch 0 nicht möglich.")
 +
except:
 +
    print("Ungültiger Wert!")
 +
 
 +
=== Fehler in einer Variablen speichern ===
 +
try:
 +
    print(10/0)
 +
except ZeroDivisionError as err:
 +
    print(err)
 +
Ausgabe:
 +
division by zero
 +
 
 +
----
 +
 
 +
=== Selbstdefinierte Ausnahmen mit <code>raise</code> ===
  
 
  <nowiki>
 
  <nowiki>
for i in 'Hello World':
+
class OutOfRangeError(Exception):
if i == 'o':
+
def __init__(self, wert):
continue
+
self.Wert = wert
print (i, end = ' ')
+
try:
 +
x = int(input("Geben Sie einen Wert zwischen 10 und 20 ein: "))
 +
if x > 20 or x < 10:
 +
raise OutOfRangeError(x)
 +
print("Ergebnis:", 4/x)
 
 
H e l l  W r l d </nowiki>
+
except OutOfRangeError as fehler:
 +
print("Die Zahl",fehler.Wert,"liegt nicht zwischen 10 und 20")
 +
</nowiki>
 +
 
 +
----
 +
 
 +
== Lesen und Schreiben von Dateien ==
 +
 
 +
=== Lesen ===
 +
Grundschema mit Ausgabe der Datei als String:
 +
<nowiki>
 +
datei = open("../assets/python.txt", "r", encoding = "utf-8")
 +
inhalt = datei.read()
 +
print(inhalt)
 +
datei.close()</nowiki>
 +
 +
Ausgabe zeilenweise mit for-Schleife:
 +
<nowiki>
 +
datei = open("../assets/python.txt", "r", encoding = "utf-8")
 +
for i in datei:
 +
    print(i)
 +
datei.close()</nowiki>
 +
 
 +
Zeilenanfang ermitteln:
 +
<nowiki>
 +
datei = open("../assets/python.txt", "r", encoding = "utf-8")
 +
for i in datei:
 +
    if i.startswith('Zum'):
 +
        print(i)</nowiki>
 +
<code>rstrip</code> entfernt Whitespace an der rechten Seite (hier die Leerzeile mit '\n').
 +
 
 +
----
 +
 
 +
=== Absolute Pfadnamen unter Windows ===
 +
 
 +
Achtung, hier müssen im Python-Skript 2 Backslashs gesetzt werden:
 +
<code>open('C:\\privat\\testdata\\beispiel.txt')</code>
 +
Man kann auch mit raw strings arbeiten:
 +
filename = r'c:\abc\def\ghi.txt'[https://lerner.co.il/2018/07/24/avoiding-windows-backslash-problems-with-pythons-raw-strings/]
 +
 
 +
----
 +
=== Textanalyse: das häufigste Wort ===
 +
<nowiki>
 +
dateiname = input("Geben Sie eine Datei an: ")
 +
datei = open(dateiname)
 +
 
 +
woerterbuch = dict()
 +
for zeilen in datei:
 +
    zeilen = zeilen.rstrip()
 +
    woerter = zeilen.split()
 +
    for wort in woerter:
 +
        woerterbuch[wort] = woerterbuch.get(wort,0) + 1
 +
 
 +
maxSchluessel = None
 +
maxWert = -1
 +
for schluessel,wert in woerterbuch.items():
 +
    if wert > maxWert:
 +
        maxSchluessel = schluessel
 +
        maxWert = wert
 +
 
 +
print(f"Das häufigste Wort ist \"{maxSchluessel}\", es kommt {maxWert} Mal vor.")</nowiki>
  
 
----
 
----
  
== pyperclip ==
+
=== Schreiben  ===
  
Installation:
+
Der Modus wird mit "a" angegeben (''append''):
 +
<nowiki>
 +
datei = open("../assets/python.txt", "a", encoding = "utf-8")
 +
datei.write("Eine neue Zeile!")
 +
datei.write("\nNoch eine neue Zeile!")
 +
datei.close()</nowiki>
 +
Das Escape-Zeichen ''\n'' verhindert, dass der folgenden Text in der selben Zeile angehängt wird.
  
<code>apt-get install python-pyperclip</code>
+
----
  
Das Modul pyperclip lässt sich aber erst laden nach
+
=== Schreiben: mehrere Zeilen nacheinander ===
  
<code>sudo pip3 install pyperclip</code>
+
<nowiki>
 +
f = open("bestelle.txt", 'a')
 +
weiter = 'j'
 +
while weiter == 'j':
 +
        bestnr = input("Bestellnummer: ")
 +
        f.write("\n"+bestnr)
 +
        weiter = input("Weiter mit mit j, Abbruch mit n: ")
 +
f.close()
 +
</nowiki>
 +
 
 +
----
 +
 
 +
=== Text komplett überschreiben ===
 +
 
 +
Der Modus wird mit "w" angegeben (''write''):
 +
<nowiki>
 +
datei = open("../assets/python.txt", "w", encoding = "utf-8")
 +
datei.write("""
 +
Python wurde mit dem Ziel größter Einfachheit und Übersichtlichkeit entworfen.
 +
Dies wird vor allem durch zwei Maßnahmen erreicht.
 +
Zum einen kommt die Sprache mit relativ wenigen Schlüsselwörtern aus.[13]
 +
Zum anderen ist die Syntax reduziert und auf Übersichtlichkeit optimiert.
 +
Dadurch lassen sich Python-basierte Skripte deutlich knapper formulieren als in anderen Sprachen.
 +
""")
 +
datei.close()</nowiki>
 +
Wenn der Dateiname bisher nicht existierte, wird die Datei neu angelegt.
  
 
----
 
----
Zeile 407: Zeile 1.396:
 
== pyinstaller ==
 
== pyinstaller ==
  
Installation:  
+
PyInstaller freezes (packages) Python applications into stand-alone executables, under Windows, GNU/Linux, Mac OS X, FreeBSD, Solaris and AIX.
apt install python-pip
+
 
 +
* https://www.pyinstaller.org/
 +
 
 +
----
 +
 
 +
=== Installation unter Windows ===
 +
 
 
  pip install pyinstaller
 
  pip install pyinstaller
  
<code>pyinstaller -F</code> erzeugt ein Stand Alone Executable. Dieses liegt dann im Verzeichnis ''dist''.
+
----
 +
 
 +
=== Installation unter Ubuntu ===
 +
 +
apt install python3-pip
 +
pip3 install pyinstaller
 +
 
 +
Bei Fehlermeldung "ModuleNotFoundError: No module named 'pip._internal'":
 +
 
 +
Kontrolle der Installation:
 +
pip3 -V
 +
 
 +
Neuinstallation erzwingen:
 +
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
 +
python3 get-pip.py --force-reinstall
 +
 
 +
Kontrolle der Installation:
 +
pip3 -V
 +
[https://askubuntu.com/questions/1025189/pip-is-not-working-importerror-no-module-named-pip-internal/1026848]
 +
 
 +
Jetzt funktioniert ''pip3 install pyinstaller''. Sollte analog auch auf Mac funktionieren.
 +
 
 +
----
 +
=== Ausführbare Dateien erzeugen ===
 +
 
 +
pyinstaller --onefile dateiname.py
 +
 
 +
----
 +
== IPython ==
 +
 
 +
IPython ist ein Kommandozeileninterpreter zum interaktiven Arbeiten mit der Programmiersprache Python.[https://de.wikipedia.org/wiki/IPython]
 +
 
 +
* https://ipython.org/
 +
 
 +
sudo apt install ipython3
 +
 
 +
Aufruf im Terminal:
 +
ipython3
 +
 
 +
Variablen zurücksetzen:
 +
%reset -f
 +
 
 +
Aufruf einer Datei:
 +
ipython3 datei.py
 +
aus IPython heraus:
 +
run datei.py
  
 
----
 
----
Zeile 417: Zeile 1.457:
 
== Typographie ==
 
== Typographie ==
  
Sonderzeichen Herz = <code>u'\u2764'</code>
+
>>> herz = u'\u2764'
 +
>>> print(herz)
 +
  
 
----
 
----
 +
 
== Formatierung ==  
 
== Formatierung ==  
  
Zeile 427: Zeile 1.470:
 
  >>> 22092.44
 
  >>> 22092.44
 
[https://www.gutefrage.net/frage/float-nur-mit-2-nachkommastellen-ausgeben]
 
[https://www.gutefrage.net/frage/float-nur-mit-2-nachkommastellen-ausgeben]
 +
 +
Als f-string:
 +
print(f"{kapital:.2f}")
 +
 +
----
 +
 +
== pip ==
 +
 +
''pip'' bzw. ''pip3'' ist ein Paketverwaltungsprogramm für Python.
 +
 +
Installation unter Ubuntu:
 +
apt install python3-pip
 +
 +
Installation unter Mac:
 +
# Download von ''http://bootstrap.pypa.io/get-pip.py''
 +
# Im Terminal ''cd Download''
 +
# ''sudo python3 get-pip.py'' ausführen.
 +
 +
----
 +
 +
 +
----
 +
 +
== Kompilieren ==
 +
 +
=== Ubuntu ===
 +
 +
Das Programm [[#pyinstaller | pyinstaller]] muss installiert sein.
 +
 +
  pyinstaller /''pfadzumskript''/''skript.py'
 +
 +
<code>pyinstaller -F</code> erzeugt ein Stand Alone Executable. Dieses liegt dann im Verzeichnis ''dist'' des Ordners, von dem aus in der Shell die Kompilierung gestartet wurde.
 +
----
 +
 +
=== Windows ===
 +
 +
* Über ''cmd'' vom User-Verzeichnis in das Skript-Verzeichnis wechseln:
 +
cd appdata\local\programs\python\python35\scripts
 +
 +
pip install pyinstaller
 +
 +
pyinstaller c:\''pfadzumskript''\''skript.py''
 +
 +
<code>pyinstaller -F</code> erzeugt ein Stand Alone Executable. Dieses liegt dann im Python-Verzeichnis im Unterordner ''scripts\dist''.
 +
 +
 +
----
 +
 +
== Type Hints ==
 +
 +
Python verwendet eine dynamische Typisierung, dies kann zu Problemen/Fehlern führen, die erst während der Laufzeit erkannt werden. Mit Type Hints soll dieses Problem behoben werden.[https://www.dinotools.de/2020/03/04/type-hints-in-python/] Beispiel:
 +
<nowiki>
 +
def add(a: int, b: int) -> int:
 +
    return a + b
 +
</nowiki>
 +
 +
Zur Analyse wird das Tool ''mypy'' benötigt:
 +
python3 -m pip install mypy
 +
 +
----
 +
 +
== Jupyter Notebook ==
 +
 +
* https://www.digitalocean.com/community/tutorials/how-to-set-up-jupyter-notebook-with-python-3-on-ubuntu-18-04
  
 
----
 
----
Zeile 434: Zeile 1.541:
 
=== Deutsche Sonderzeichen lassen sich in IDLE nicht abspeichern ===
 
=== Deutsche Sonderzeichen lassen sich in IDLE nicht abspeichern ===
  
Entweder an den Anfang des Skripts folgende Zeile setzen:
+
An den Anfang des Skripts folgende Zeile setzen:
 
  # -*- coding: utf-8 -*-
 
  # -*- coding: utf-8 -*-
 
bzw.
 
bzw.
 
  # -*- coding: cp1252 -*-
 
  # -*- coding: cp1252 -*-
 
[https://docs.python.org/2.4/lib/standard-encodings.html]
 
[https://docs.python.org/2.4/lib/standard-encodings.html]
 
oder in IDLE (Shell-Menü) folgende Einstellung vornehmen:
 
''Options > Configure IDLE > General > Default Source Encoding > UTF-8''
 
  
 
----
 
----
Zeile 451: Zeile 1.555:
 
Man kann sich ''2to3.py'' natürlich auch in das lokale Verzeichnis legen. Umwandlung mit  
 
Man kann sich ''2to3.py'' natürlich auch in das lokale Verzeichnis legen. Umwandlung mit  
 
  python -w 2to3.py py2Datei.py  
 
  python -w 2to3.py py2Datei.py  
 +
 +
----
 +
 +
=== Programm schließt sich sofort nach der Ausführung ===
 +
 +
In Windows: am Ende des Skripts folgende Zeile einfügen:
 +
os.system("pause")
 +
 +
In Linux: am Ende des Skripts folgende Zeile einfügen:
 +
input
  
 
----
 
----
  
 
== Links und Quellen ==
 
== Links und Quellen ==
 +
 +
* https://bugs.python.org/file47781/Tutorial_EDIT.pdf Python Tutorial Release 3.7.0 Guido van Rossum and the Python development team
 +
 +
* https://www.w3resource.com/python-exercises/
 +
 +
* https://readthedocs.org/projects/fiftyexamples/downloads/pdf/latest/
 +
 +
* http://openbook.rheinwerk-verlag.de/python/39_002.html
 +
 +
* https://www.guru99.com/python-tutorials.html
 +
 +
* https://pynative.com/ Learn Python with Tutorials, Exercises, and Quizzes
 +
 +
* https://runestone.academy/runestone/books/published/thinkcspy/index.html
 +
 +
* https://www.python-lernen.de/
  
 
* https://wiki.python.org/moin/
 
* https://wiki.python.org/moin/
 +
 +
* https://www.learnpython.org/
 +
 +
* https://www.practicepython.org/
  
 
* https://www.python-kurs.eu/python3_kurs.php
 
* https://www.python-kurs.eu/python3_kurs.php
 
* http://docs.python.org/2.7/tutorial
 
  
 
* http://pythontutor.com/
 
* http://pythontutor.com/
Zeile 468: Zeile 1.600:
 
* http://python4kids.net/how2think/
 
* http://python4kids.net/how2think/
  
 +
* https://www.journaldev.com/python-tutorial
 +
 +
* https://www.grund-wissen.de/informatik/python/_downloads/grundkurs-python3.pdf
 +
 +
* https://docs.python-guide.org/ The Hitchhiker’s Guide to Python
 +
 +
* http://www.miwilhelm.de/sprachen/python/
 +
 +
* http://www.ipb.uni-tuebingen.de/kurs/comp/12_bioinformatic/python/kurs12_python06re.html
 +
 +
* https://www.tuxcademy.org/download/de/pyth/pyth-de-manual.pdf
 +
 +
* https://steakrecords.com/python/
 +
 +
* https://data-flair.training/blogs/python-project-ideas/
 +
 +
* https://www.dataquest.io/blog/python-projects-for-beginners/
 +
 +
* https://careerkarma.com/blog/python-projects-beginners/
 +
 +
* https://fr.wikibooks.org/wiki/Programmation_Python
  
 
----
 
----
Zeile 484: Zeile 1.637:
  
 
* [https://www.youtube.com/watch?v=X822zqlHpSE Python. Полезные библиотеки (GeekBrains)]
 
* [https://www.youtube.com/watch?v=X822zqlHpSE Python. Полезные библиотеки (GeekBrains)]
 +
 +
* [https://www.youtube.com/watch?v=b1_XCl3gu90&list=PLb0zKSynM2PCmp5J5LWM3PcZXBaCoQkXj&index=1 Bildbearbeitung in Python]
 +
 +
* [https://www.youtube.com/watch?v=tZcYkeffmGs&list=PLb0zKSynM2PBYzz6l37rWH3B_n_7P40QP Konkrete Mathemaik für Informatiker]
  
 
----
 
----
  
 
== Bücher ==
 
== Bücher ==
 +
 +
* [https://www.hanser-fachbuch.de/buch/Python+3+Einsteigen+und+Durchstarten/9783446454699 Kalista, Heiko: Python 3. Einsteigen und Durchstarten, München 2018 (Hanser)]
  
 
* [https://www.hanser-fachbuch.de/buch/Einfuehrung+in+Python+3/9783446452084 Klein, Bernd: Einführung in Python 3. Für Ein- und Umsteiger, München 2018 (Hanser)]
 
* [https://www.hanser-fachbuch.de/buch/Einfuehrung+in+Python+3/9783446452084 Klein, Bernd: Einführung in Python 3. Für Ein- und Umsteiger, München 2018 (Hanser)]
 +
 +
* [https://www.dpunkt.de/buecher/12869/Python%20Crashkurs.html Matthes, Eric: Python Crashkurs, Heidelberg 2017]
 +
 +
* [https://www.dpunkt.de/buecher/10387/-python-kinderleicht%21.html Briggs, Jason R.: Python kinderleicht, Heidelberg 2016]
  
 
* [https://www.wiley-vch.de/de/fachgebiete/computer-und-informatik/python-der-sprachkurs-fuer-einsteiger-und-individualisten-978-3-527-76066-4  Willemer, Arnold: Python. Der Sprachkurs für Einsteiger und Individualisten, Weinheim 2015]
 
* [https://www.wiley-vch.de/de/fachgebiete/computer-und-informatik/python-der-sprachkurs-fuer-einsteiger-und-individualisten-978-3-527-76066-4  Willemer, Arnold: Python. Der Sprachkurs für Einsteiger und Individualisten, Weinheim 2015]

Aktuelle Version vom 31. Dezember 2020, 21:38 Uhr

Seitenübersicht
Zur Seite "Python: Klassen"
Zur Seite "Python: Module"
Zur Seite "Python: Turtle"
Zur Seite "Python: Tkinter"
Zur Seite "Python: Pygame"
Zur Seite "Python: PyQT"
Zur Seite "Python: Anaconda"


Inhaltsverzeichnis

Allgemeines

Die Sprache wurde Anfang der 1990er Jahre von Guido van Rossum am Centrum Wiskunde & Informatica in Amsterdam entwickelt.


Coding Conventions


Online-Interpreter

Ein Online-Interpreter befindet sich auf

Hier kann man sich ein Login erstellen. Man kann auch ein anonymes repl aufrufen, z. B.


shebang

Bei Ausführung auf der Shell/Kommandozeile verweist ein "shebang" am Anfang des Skripts auf die Datei, die das Skript ausführen soll. In Linux (Ubuntu) ist dies z. B.

#! /usr/bin/python3

Damit der "shebang" auf allen unixoiden System (z. B. auch Mac) funktioniert, empfiehlt sich die Schreibweise

#! /usr/bin/env python3

Gegebenenfalls muss das Skript vorher aufführbar gemacht werden:

chmod 0755 script.py

Unter Windows wird der "shebang" ignoriert.


IDEs

IDLE

IDLE ist die IDE des Python-Projekts.

IDLE personalisieren

> Options, Configure IDLE

Verhalten bei F5

Die Aufforderung zu speichern bei der Ausführung einer noch nicht gesicherten Datei abschalten:

  • Reiter General, At Start of Run (F5) > No Prompt

History in der IDLE-Shell aktivieren
  • Reiter Keys > history-next > Get New Keys for Selection, 'Up Arrow und Down Arrow auswählen und speichern.

Kommandozeile beenden

Die Kommandozeile wird in IDLE, bash oder cmd folgendermaßen beendet:

exit()

oder

quit()

oder

Strg-D

Thonny

Thonny ist eine minimalistische IDE, die nur die für Einsteiger notwendigen Grundfunktionen enthält. Thonny gibt es für Windows, Mac und Linux.

Installation auf Ubuntu:

apt install thonny


Auskommentieren mit Alt-3

Einkommentieren (Kommentierung entfernen) mit Alt-4


Pycharm

Pycharm hat einen wesentlich größeren Funktionsumfang als IDLE oder Thonny. Pycharm gibt es für Windows, Mac und Linux. Neben der Professional Edition gibt es auch eine kostenlose Community Edition.

Installation auf Ubuntu:[1]

snap install pycharm-community --classic

oder manuell Tarball.[2]


Visual Studio

Die Entwicklungsumgebung Visual Studio von Microsoft lässt sich auch um Funktionalitäten für Python erweitern.


Pyzo

Installation unter Ubuntu:

pip install pyzo --upgrade

Vorausgesetzt wird eine vorhandene Python-Installation unter Ubuntu (apt-get install python3-pip python3-pyqt5)[3])


Wing

Installation:

sudo snap install wing-personal7 --classic

[4]

Aufruf im Terminal mit

wing-personal7

mu

https://codewith.mu/ Code with Mu: a simple Python editor for beginner programmers.

Installieren mit

sudo apt-get install mu-editor

oder

pip3 install mu-editor 

Starten mit

 python3 –m mu

Funktionen

Allgemeines


Funktionsadresse in Variablen speichern

Die Speicheradresse einer Funktion kann man einer Variablen zuweisen.

def zaehleBis10():
    zahl = 1
    while zahl <= 10:
        print(zahl)
        zahl += 1

neueFunktion = zaehleBis10
neueFunktion()


Vorbelegte Parameter

Parameter können vorbelegt und gegebenenfalls beim Funktionsaufruf geändert werden.

def aufsummieren(a = 10):
    summe = 0
    for i in range(1,a + 1,1):
        summe += i
    print(summe)
    return summe

aufsummieren(11)

Man kann einzelne Parameter vorbelegen und andere ohne Vorbelegung lassen. Allerdings müssen nach dem ersten vorbelegten Parameter alle weiteren auch vorbelegt sein.


Parameter anhand des Namens übergeben

Wenn man die Namen der Parametervariablen anspricht, braucht man nicht die vorgegebene Reihenfolge zu beachten. Unten stehende Funktionsaufrufe produzieren die gleiche Ausgabe:

def termin(tag, monat, jahr):
   print("Heute ist der "+str(tag)+"."+str(monat)+"."+str(jahr))

termin(2,11,2019)
termin(jahr=2019,monat=11, tag=2)

Ausgabe:
 Heute ist der 2.11.2019
 Heute ist der 2.11.2019



Tupel als Parameter

Vor den Parameter wird ein Sternchen gesetzt. Mit Hilfe dieser Konstruktion kann man eine unbegrenzte Anzahl von Werten eingeben:

def aufsummieren(*twert):
    summe = 0
    for i in twert:
        summe += i
    print(summe)
    return summe

aufsummieren(2,3,10,9)


Dictionarys als Parameter

Es ist möglich, variable Parameter über Namenszuweisungen anzusprechen. Vor den Parameter werden zwei Sternchen gesetzt:

def dictAlsParameter(**woerterbuch):
   for wort in woerterbuch:
      print(wort,woerterbuch[wort])

dictAlsParameter(Name = "Jon",Nachname = "Doe",Wohnort = "Hollywood")


lambda-Funktionen

lambda-Funktionen können anonym sein. Sie enthalten eine implizite return-Anweisung und werden in einer Variablen gespeichert.

>>> rechnen = lambda a, b: a + b
>>> rechnen(3,4)
7

Rekursion

Eine rekursive Funktion ist eine Funktion, die sich selbst wieder aufruft:

# Fakultätsberechnung
def fak (x):
    if x == 1:
        return 1
    else:
        return(x*fak(x-1))

print(fak(5)) # Ergebnis: 120


Eventuell muss man eine Abbruchbedingung einbauen:

def rek (x):
    print(x)
    x += 1
    if x < 100:
        rek(x)
    
rek(1)


input()

input() hält das Programm an und wartet auf eine Tastatureingabe. Die Eingabe kann in einer Variablen gespeichert werden; diese hat den Dateityp string. Unter bestimmten Bedingungen kann der Dateityp umgewandelt werden, z. B. Ziffern können mit int() oder float() in Ganzzahlen bzw. Gleitkommazahlen konvertiert werden.

Umwandlung mit eval()

Strings, Tupel und Dictionarys werden mit eval() umgewandelt:

>>> a = input("Eingabe: ")
Eingabe: ["Egon","Thea","Emma"]
>>> a
'["Egon","Thea","Emma"]'
>>> b = list(a)
>>> b
['[', '"', 'E', 'g', 'o', 'n', '"', ',', '"', 'T', 'h', 'e', 'a', '"', ',', '"', 'E', 'm', 'm', 'a', '"', ']']
>>> c = eval(a)
>>> c
['Egon', 'Thea', 'Emma']
>>> 


Mehrere Eingaben

>>> a,b,c = input("3 Eingaben, getrennt durch Leerzeichen: ").split()
3 Eingaben, getrennt durch Leerzeichen: Python, Perl, Javascript
>>> a
'Python,'
>>> b
'Perl,'
>>> c
'Javascript'


format()

name = John
alter = 44
print("Du heißt {} und bist {} Jahre alt.".format(name,alter))

[...] Ausgabe:

Du heißt John und bist 44 Jahre alt.

Textausrichtung:

print('{:<25}'.format(text)) # linksbündig
print('{:>25}'.format(text)) # rechtsbündig 
print('{:^25}'.format(text)) # zentriert

Statt format() werden in neueren Python-Versionen formatierte Strings (f-strings) empfohlen:[5]

print(f"Du heißt {name} und bist {alter} Jahre alt.")

Currying

Currying ... ist die Umwandlung einer Funktion mit mehreren Argumenten in eine Sequenz von Funktionen mit jeweils einem Argument.[6]

def uncurried_add(x, y):
    return x + y

def curried_add(x):
    return lambda y: x + y

print(uncurried_add(3, 5)) # 8
print(curried_add(3)(5)) # 8

add_three = curried_add(3)
print(add_three(5)) # 8
print(add_three(12)) # 15


String

Ein String, oder Zeichenkette, kann man als eine Sequenz von einzelnen Zeichen sehen.[7]

String-Formatierung

Eingebaute Funktion format

wert1 = 1.0 / 3.0
wert2 = 10.0 / 7.0
# Formatierte Ausgabe:
print("Wert 1: {0:.2f}, Wert 2: {1:.4f}".format(wert1, wert2))

Ausgabe:
Wert 1: 0.33, Wert 2: 1.4286


String-Literale / f-strings

wert1 = 1.0 / 3.0
wert2 = 10.0 / 7.0
# Formatierte Ausgabe mit String-Literal:
print(f"Wert 1: {wert1:.2f}, Wert 2: {wert2:.4f}")

Ausgabe:
Wert 1: 0.33, Wert 2: 1.4286


Auslesen von Zeichen aus der Kette

Über die Indexnummern der Zeichenkette kann man einzelne Zeichen ausgeben lassen:

>>> meinString = "Zeichenkette"
>>> print(meinString[0])
Z

Man kann die Indexnummern auch rückläufig verwenden, dann ist [-1] das letzte Zeichen der Kette:

>>> meinString = "Zeichenkette"
>>> print(meinString[-2:])
te
>>> print(meinString[:-2])
Zeichenket

Länge des Strings

Die Funktion len gibt die Länge des Strings (Anzahl der Zeichen) zurück:

>>> meinString = "Zeichenkette"
>>> len(meinString)
12
>>> len("aha")
3

String-Methoden

Liste eingebauter String-Methoden:


Prüfen auf Datentyp str

if isinstance(value, str):

ergibt True, wenn es sich um eine Variable vom Typ string handelt.


upper case / lower case / title

Strings können in Groß- bzw. Kleinbuchstaben umgewandelt werden:

>>> string1 = "hallo"
>>> string1 = string1.upper()
>>> print(string1)
HALLO
>>> string2 = "GUTEN TAG"
>>> string2 = string2.lower()
>>> print(string2)
guten tag
>>> string3 = "schmitz"
>>> string3 = string3.title()
>>> string3
'Schmitz'

>>> text = "AB"
>>> text  = str.lower(text)
>>> text
'ab'


Teilstrings ersetzen mit replace

>>> meinString = "Mein neues Programm"
>>> meinString = meinString.replace("neues", "schönes")
>>> print (meinString)
Mein schönes Programm

Testen auf numerische Eingabe

Test, alle Zeichen in einem String numerisch sind:

str.isnumeric()

>>> za='45'
>>> za.isnumeric()
True

in-Operator

Der in-Operator gibt einen booleschen Wert zurück:

>>> sd = "Jason"
>>> print("s" in sd)
True

Backslash

Der Backslash hat folgende Funktionen:

Backslash.png

[8]










Zahlen

Es gibt Ganzzahlen (int), Fließkommazahlen (float) und komplexe Zahlen (complex).


Ganzzahlen

dezimal - binär - octal - hexadezimal

dezimal binär octal hexadezimal
31 bin(31) = 0b11111 oct(31) = 0o37 hex(31) = 0x1f

Die Verwandlung in dezimale Ganzzahlen erfolgt mit int(): int(0b11111) == 31


Ganzzahlige Division / floor division

Operator //'

In [11]: -13 // 4                                                               
Out[11]: -4

-4 ist die nächstkleinere Zahl!


Exponentialschreibweise

Es ist möglich, sehr große oder sehr kleine float-Zahlen mittels e oder E in Exponential-Schreibweise anzugeben. Die Zahl hinter dem e gibt dabei an, um wie viele Stellen der Dezimalpunkt innerhalb der Zahl verschoben wird.[9]

>>> 4.3e3
4300.0
>>> 7.92e-5 == 0.0000792
True
>>> 


Umwandlung mit format()

>>> format(5.8e-06, ".8f")
'0.00000580'

[10]


Komplexe Zahlen

Python includes complex numbers as an official type. Complex numbers arise when taking the square roots of negative numbers. There is no real number whose square root is -9, so we say that it equals 3i where i represent the square root of -1. Another example of a complex number is 2i + 3. Python uses j instead of i.

You can take a look at the following code snippet to learn how to work with complex number types.

Divide 2 + 3j by 1 - 5j, enclosing both operations within parentheses:[11]

>>> (2 + 3j) / (1 - 5j)
(-0.5+0.5j)
>>> a = 2 + 3j
>>> type(a)
<class 'complex'>

Man kann auch die Funktion complex verwenden:

>>> a = complex(2, 3)
>>> a
(2 + 3j)

Den Betrag kann man u. a. mit abs() ermitteln:

>>> a = complex(2, 3)
>>> abs(a)
3.605551275463989

The standard library’s cmath module ( cmath for complex math) provides access to a number of other specialized functions to work with complex numbers.


Funktion abs()

abs() liefert den absoluten Wert einer Zahl.

>>> x = -3.25
>>> y = abs(x)
>>> print(y)
3.25

Funktion pow()

Diese Funktion berechnet die Potenz x hoch y:

>>> x = 3
>>> y = 4
>>> z = pow(x,y)
>>> print(z)
81 

Funktion round()

Diese Funktion rundet Dezimalzahlen auf bzw. ab:

>>> round(5.96734959002,2)
5.97

Die Zahl nach dem Komma bezeichnet die Anzahl der "Nachkommastellen")


Funktion eval()

Diese Funktion übernimmt String-Argumente und wertet sie Python-Ausdruck aus: >>> eval('12 + 3') 15


Modul math

Für die Verwendung der math-Funktionen (ceil, floor, sqrt etc.) muss zuerst das Modul math importiert werden:

import math

bzw.

from math import *

Brüche: Modul fractions

>>> from fractions import Fraction
>>> f = Fraction(3, 4)
>>> f
Fraction(3, 4)
>>> float(f)
0.75

fractions können mit anderen Zahlentypen kombiniert werden:

>>> Fraction(3, 4) + 1 + 1.5
3.25

Wenn in dem Ausdruck ein float enthalten ist, wird das Ergebnis als float ausgegeben. Bei der Rechnung mit einem Fraction und einem int wird ein Fraction ausgegeben.

>>> Fraction(3, 4) + 1 + Fraction(1/4)
Fraction(2, 1)

Fractions lassen sich mit den Funktionen int() und float umwandeln.


isinteger()

Prüft, ob eine Gleitpunktzahl den gleichen Wert wie eine Ganzzahl hat.

>>> 1.1.is_integer()
False
>>> 1.0.is_integer()
True

Listen

Die Liste (list) ist ein sequentieller Datentyp. Was Python eine Liste nennt, würde in den meisten anderen Programmiersprachen als Array bezeichnet werden.[12]

Listenelemente werden über einen 0-basierten Index angesprochen. Man kann auf Listen auch vom Ende her zugreifen. Dann ist -1 der Index für das letzte Element, -2 für das vorletzte usw.


Mit range Zahlenliste erstellen

Beispiel:

zahlenliste = list(range(1,11))
print(zahlenliste) # Ausgabe: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Listen addieren

>>> a = ['h', 'a', 'l', 'l', 'o']
>>> b = ['h', 'a', 'l']
>>> c = a + b
>>> c
['h', 'a', 'l', 'l', 'o', 'h', 'a', 'l']


extend()

Mit extend() hängt man eine bestehende Liste an eine andere bestehende Liste an:

# language list
language = ['French', 'English', 'German']

# another list of language
language1 = ['Spanish', 'Portuguese']

language.extend(language1)

# Extended List
print('Language List: ', language) # Ausgaben: Language List:  ['French', 'English', 'German', 'Spanish', 'Portuguese']
[13]

Alternativ:

language = language + language1

append()

Mit append() hängt man an eine Liste an ein weiteres Element an:

language = ['French', 'English', 'German']
language.append("Italian")

insert()

insert() fügt mit Hilfe der Indexnummer ein weiteres Element in die Liste ein:

language = ['French', 'English', 'German']
language.insert(1,"Dutch")

Weitere häufig verwendete Listenfunktionen

  • remove(x) entfernt das Element x aus der Liste.
  • clear() leert die ganze Liste.
  • pop() entfernt das letzte Element aus der Liste.
  • index(x) sucht das Element x und gibt seine Indexnummer aus
  • count(x) zählt, wie oft das Element x in der Liste vorkommt.
  • sort() sortiert die Listenelemente.
  • reverse() kehrt die Reihenfolge um.
  • copy() erstellt einen Klon der Liste: list2 = list1.copy()

Listen ausgeben

Ausgabe mit print

>>> metres = [1, 4, 9, 16, 25, 36,'hallo']
>>> print(*metres)
1 4 9 16 25 36 hallo


Nummerierte Ausgabe mit enumerate

>>> b = ['h', 'a', 'l']
>>> for i,j in enumerate(b):
...     print(i,j)
... 
0 h
1 a
2 l
>>> 


Listenobjekte vertauschen

zahlenliste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
zahlenliste.insert(2,zahlenliste.pop(3))
print(zahlenliste) #Ausgabe: [1, 2, 4, 3, 5, 6, 7, 8, 9, 10]


Liste in String umwandeln

Voraussetzung: Die Objekte in der Liste sind vom Ty str.

>>> li = ['h','a','l','l','o']
>>> li
['h', 'a', 'l', 'l', 'o']
>>> st = ''.join(li)
>>> st
'hallo'


Mehrfachzuweisung (multiple assignment trick, tuple unpacking)

>>> cat = ['fat', 'gray', 'loud']
>>> size, color, disposition = cat
>>> disposition
'loud'


Listen sortieren

sort()

Funktion sort(): liste.sort()

 cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()

Ausgabe: ['audi', 'bmw', 'subaru', 'toyota']

... in umgekehrter Reihenfolge:

>>> cars = ['bmw', 'audi', 'toyota', 'subaru']
>>> cars.sort(reverse=True)
>>> cars
['toyota', 'subaru', 'bmw', 'audi']

... nicht case-sensitiv:

>>> spam = ['a', 'z', 'A', 'Z']
>>> spam.sort(key=str.lower)
>>> spam
['a', 'A', 'z', 'Z']

sorted()

cars = ['bmw', 'audi', 'toyota', 'subaru']
y = sorted(cars)

Ausgabe y: ['audi', 'bmw', 'subaru', 'toyota']


und rückwärts sortiert:

y = sorted(cars, reverse=True)

Ausgabe y: ['toyota', 'subaru', 'bmw', 'audi']


Bubblesort

def exchange(x1, x2) :
  Tausch = x1
  x1 = x2
  x2 = Tausch
  return x1, x2
def bubblesort(x, Index):
  for i in range(Index):
    for j in range(Index-i-1):
      if x[j] > x[j+1] :
        x[j], x[j+1] = exchange(x[j], x[j+1]);

x = [14,6,44,89,26]
Index = len(x)
bubblesort(x,Index)
print(x)

Ausgabe:

[6, 14, 26, 44, 89]

Quelle: [14], S. 105


Kürzere Version:

def bubbleSort(nlist):
    for passnum in range(len(nlist)-1,0,-1):
        for i in range(passnum):
            if nlist[i]>nlist[i+1]:
                temp = nlist[i]
                nlist[i] = nlist[i+1]
                nlist[i+1] = temp

nlist = [14,46,43,27,57,41,45,21,70]
bubbleSort(nlist)
print(nlist)
[15]

List Comprehension (Listen-Abstraktion, Listennotation

List comprehensions sind syntaktische Gefüge, die beschreiben, wie vorhandene Listen oder andere iterierbare Objekte verarbeitet werden, um aus ihnen neue Listen zu erstellen.[16]

>>> l1 = [0, 1, 2, 3, 4, 5]
>>> l2 = [i*i for i in l1]
>>> l2
[0, 1, 4, 9, 16, 25]


>>> liste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> [i for i in liste if i % 2 == 0]
[2, 4, 6, 8, 10]
[17]

>>> abverkauf = 9
>>> auf_lager = [21, 7, 9, 11]
>>> uebrig = [i - abverkauf for i in auf_lager if i > abverkauf]
>>> uebrig
[12, 2]


Inventarliste, die Paare als Tupel enthält absteigend nach Menge sortieren:

bestand = [("Äpfel", 22), ("Melonen", 4), ("Birnen", 18),
           ("Orangen", 76), ("Grapefruit", 51),]
absteigend_sortiert = [(j, i) for i,j in bestand]
absteigend_sortiert.sort(reverse=True)
bestand = [(i, j) for j,i in absteigend_sortiert]
print(bestand)


Tupel

Tupel (tuple) können so wie Listen über Indexnummern abgerufen werden. Allerdings sind Tupel unveränderlich.

>>> koordinaten = (2,3,4)
>>> print (koordinaten[0])
2

Listen von Tupeln:

>>> tupleListe = [koordinaten, (55,89), (23,9)]
>>> tupleListe[0]
(2, 3, 4)
>>> tupleListe[0][1]
3


Set (Menge)

Sammlung von Objekten, die durch Kommata voneinander getrennt werden und mit geschweiften Klammern umgeben sind. Ein set-Objekt ist eine nicht geordnete Kollektion unveränderbarer Objekte.

 a = {'i', 'e'}

In einem Set kann jeder Wert nur einmal vorkommen. Die Set-Datenstruktur ist für sehr schnelle Nachschlageoperationen optimiert.

>>> a = 'eieieieieieii'
>>> a
'eieieieieieii'
>>> a = list(a)
>>> a
['e', 'i', 'e', 'i', 'e', 'i', 'e', 'i', 'e', 'i', 'e', 'i', 'i']
>>> a = set(a)
>>> a
{'i', 'e'}
>>> a= list(a)
>>> a
['i', 'e']


add()

>>> a = {'i', 'e'}
>>> a.add('f')
>>> a
{'f', 'e', 'i'}


discard()

>>> a = {'f', 'e', 'i'}
>>> a.discard('e')
>>> a
{'f', 'i'}


frozenset

frozenset-Objekte sind wie Tupel oder Strings nicht änderbar.


Dictionarys

Dictionarys enthalten Schlüssel-Werte-Paare.

>>> meinDict = {"schluessel1" : "wert1", "schluessel2" : "wert2", "schluessel3" : "wert3", "schluessel4" : "wert4", "schluessel5" : "wert5"}
>>> print(meinDict["schluessel4"])
wert4
>>> print(meinDict.get("schluessel4"))
wert4

Es können verschiedene Datentypen verwendet werden, z. B. auch Zahlen.


get()

Bei Verwendung von get() können Default-Werte gesetzt werden:

monate = {1:"Januar",2:"Februar",3:"März",4:"April",5:"Mai",6:"Juni",12:"Dezember"}
print(monate.get(12,"Schlüssel nicht zulässig"))

Ausgabe: Dezember

print(monate.get(13,"Schlüssel nicht zulässig"))

Ausgabe: Schlüssel nicht zulässig


Dictionarys verändern

Dictionarys verbinden:

>>> d = {'A': 1, 'B': 2, 'C': 3}
>>> e ={'E':33}
>>> d.update(e)
>>> d
{'A': 1, 'B': 2, 'C': 3, 'E': 33}


oder:

>>> a = {"Name":"John Doe","Wohnort":"Hollywood"}
>>> b = {"Alter":56,"Beruf":"Schauspieler"}
>>> c = {**a, **b}
>>> c
{'Name': 'John Doe', 'Wohnort': 'Hollywood', 'Alter': 56, 'Beruf': 'Schauspieler'}


Dictionarys erweitern:

woerter = {}
woerter["Denmark"] = "Dänemark"
woerter["Poland"] = "Polen"
print(woerter)

Ausgabe:

{'Denmark': 'Dänemark', 'Poland': 'Polen'}

Schlüssel überprüfen

Damit Skripte mit Dictionarys nicht auf Fehler laufen, überprüft man vorab, ob der jeweilige Schlüssel existiert.

Überprüfung mit den Operator in:

zaehler = dict()
namen = ["Orga","Leos","Inter","Sovital","Algebraic"]
for i in namen:
    if i not in zaehler:
        zaehler[i] = 1
    else:
        zaehler[i] = zaehler[i] + 1
print(zaehler)
{'Orga': 1, 'Leos': 1, 'Inter': 1, 'Sovital': 1, 'Algebraic': 1}

Überprüfung mit der Methode get():

zaehler.get("Imotech", "nicht vorhanden")
print(zaehler["Imotech"])

Ausgabe:

Wert für Imotech: nicht vorhanden.

Mit existierendem Schlüssel:

zahl = zaehler.get("Leos", "nicht vorhanden")
print(f"Zahl für Leos: {zahl}.")

Ausgabe:

Wert für Leos: 1.

Für einen bisher nicht existierenden Wert Schlüssel-Wert-Paar erstellen:

zahl = zaehler.get("Imotech", 0) + 1
print(f"Zahl für Imotech: {zahl}.")

Ausgabe:

Wert für Imotech: 1.

Abfrage des Wertes mit values()

Die Methode values() ermöglicht die Verwendung einer Durchlaufvariablen zur Abfrage des Wertes:

>>> d = {'A': 1, 'B': 2, 'C': 3}
>>> for i in d.values():
...     print(i)
... 
1
2
3


Abfrage von Schlüssel und Wert mit items()

Die Methode items() ermöglicht die Verwendung zweier Durchlaufvariablen zur Abfrage von Schlüssel und Wert:

>>> d = {'A': 1, 'B': 2, 'C': 3}
>>> for i,j in d.items():
...     print(i,j)
... 
A 1
B 2
C 3
>>> 


Methode setdefault()

Wenn in einem Dictionary Schlüssel-Wert-Paare verarbeitet werden, so führen bei noch nicht vorhandenem Schlüssel Inkrementierungen zu "KeyError-Ausnahmen". Deshalb muss vorher ein Schlüssel initialisiert werden. Wenn noch kein Schlüssel vorhanden ist, setzt die Dictionary-Methode setdefault() eine Initialisierung.

dictionary.setdefault(key, 0) # 

key ist hier der Schlüssel, nach dem gesucht wird und der im Dictionary noch nicht existiert.

default − ist der Wert, der gesetzt wird (z. B. 0). Wenn kein Default-Wert gesetzt wird, setzt Python anstelle eines Wertes None)

Beispiel:

woerterbuch = {}
...
if key in woerterbuch:
    woerterbuch.setdefault(key, 0) # Initialisierung
    woerterbuch[key] += 1 # Ab jetzt kann inkrementiert werden

steht für

woerterbuch = {}
...
if key not in woerterbuch:
    woerterbuch[key] = 0 # Initialisierung
if key in woerterbuch:
    woerterbuch[key] += 1 # Ab jetzt kann inkrementiert werden


Dictionary als Schlüsselwort-Argument

>>> sw_arg = {"sep":" >> ", "end":" -\n"}
>>> print("Das","ist","nur","ein","Beispiel",**sw_arg)
Das >> ist >> nur >> ein >> Beispiel -
>>> 

Konstanten

None

signalisiert einen leeren oder nicht vorhandenen Wert.

Wenn eine Funktion keinen Rückgabewert enthält (z. B. print()) oder nur mit return endet, gibt Python "stillschweigend" den Wert None zurück.

>>> print(print("hello"))
hello
None

Es ist der einzige Wert des Datentyps "NoneType":

>>> type(None)
<class 'NoneType'>

Sonderzeichen:

import string
string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

>>> import math
>>> math.pi
3.141592653589793

Operatoren

+       -       *       **      /       //      %      @
<<      >>      &       |       ^       ~       :=
<       >       <=      >=      ==      !=
[18][19]

Verzweigungen (bedingte Anweisungen)


if-Anweisung


Bedingter Ausdruck / conditional expression

Man kann eine Bedingung in einer Zeile prüfen:

name = input("Is this a test? ")
x = "YES" if name == "Test" else "NO"
print(x)

Schleifen


while

x = 1000
while x > 100:
	print (x, end = ' ')
	x = x / 2

Ausgabe:

1000 500.0 250.0 125.0


for


Beispiele:

>>> z = 1
>>> for i in 'Hallo':
	print (i * z)
	z = z + 1

	
H
aa
lll
llll
ooooo



a = [a+b for a in 'alles' if a != 's' for b in 'gut' if b != 'u']
print(a, end = " ")

Ausgabe:

['ag', 'at', 'lg', 'lt', 'lg', 'lt', 'eg', 'et'] 

continue

Die Schleife wird unterbrochen:

for i in 'Hello World':
	if i == 'o':
		continue
	print (i, end = ' ')
	
H e l l   W r l d 

break

Die Schleife wird verlassen:

for i in 'Hello World':
	if i == 'e':
		break
else:
	print ("Der Buchstabe 'x' kommt in diesem String nicht vor.")

Es erfolgt keine Ausgabe.


else

Für Kenner anderer Programmiersprachen kurios: Schleifen können mit else abgeschlossen werden. Die Anweisungen im else-Teil werden ausgeführt, sobald die Bedingung nicht mehr erfüllt ist

for i in 'Hello World':
	if i == 'x':
		break
else:
	print ("Der Buchstabe 'x' kommt in diesem String nicht vor.")

Ausgabe:

Der Buchstabe 'x' kommt in diesem String nicht vor

Fehler und Ausnahmen / exception

unspezifisch

alter = input("Wie alt bist du? ")
try:
   alter = int(alter)
except:
   print("Falsche Eingabe!")
else:
   print("Du bist", alter, "Jahre alt.")
finally:
   print("Programmende")

else wird nur aktiv, wenn keine Ausnahme ausgelöst wird. finally wird sowohl bei Ausnahmen wie auch ohne Fehler aktiv.

Spezifizierung des Fehlers

zahl1 = 150
zahl2 = input("Geben Sie den Divisor an: ")
try:
   zahl2 = int(zahl2)
   print("Der Quotient ist {}".format(zahl1 / zahl2))
except ValueError:
   print("Sie müssen eine Zahl eingeben.")
except  ZeroDivisionError:
   print("Division durch 0 nicht möglich.")
except:
   print("Ungültiger Wert!")

Fehler in einer Variablen speichern

try:
    print(10/0)
except ZeroDivisionError as err:
    print(err)

Ausgabe:

division by zero

Selbstdefinierte Ausnahmen mit raise

class OutOfRangeError(Exception):
	def __init__(self, wert):
		self.Wert = wert
try:
	x = int(input("Geben Sie einen Wert zwischen 10 und 20 ein: "))
	if x > 20 or x < 10:
		raise OutOfRangeError(x)
	print("Ergebnis:", 4/x)
	
except OutOfRangeError as fehler:
	print("Die Zahl",fehler.Wert,"liegt nicht zwischen 10 und 20")


Lesen und Schreiben von Dateien

Lesen

Grundschema mit Ausgabe der Datei als String:

datei = open("../assets/python.txt", "r", encoding = "utf-8")
inhalt = datei.read()
print(inhalt)
datei.close()

Ausgabe zeilenweise mit for-Schleife:

datei = open("../assets/python.txt", "r", encoding = "utf-8")
for i in datei:
    print(i)
datei.close()

Zeilenanfang ermitteln:

datei = open("../assets/python.txt", "r", encoding = "utf-8")
for i in datei:
    if i.startswith('Zum'):
        print(i)

rstrip entfernt Whitespace an der rechten Seite (hier die Leerzeile mit '\n').


Absolute Pfadnamen unter Windows

Achtung, hier müssen im Python-Skript 2 Backslashs gesetzt werden:

open('C:\\privat\\testdata\\beispiel.txt')

Man kann auch mit raw strings arbeiten:

filename = r'c:\abc\def\ghi.txt'[20]

Textanalyse: das häufigste Wort

dateiname = input("Geben Sie eine Datei an: ")
datei = open(dateiname)

woerterbuch = dict()
for zeilen in datei:
    zeilen = zeilen.rstrip()
    woerter = zeilen.split()
    for wort in woerter:
        woerterbuch[wort] = woerterbuch.get(wort,0) + 1

maxSchluessel = None
maxWert = -1
for schluessel,wert in woerterbuch.items():
    if wert > maxWert:
        maxSchluessel = schluessel
        maxWert = wert

print(f"Das häufigste Wort ist \"{maxSchluessel}\", es kommt {maxWert} Mal vor.")

Schreiben

Der Modus wird mit "a" angegeben (append):

datei = open("../assets/python.txt", "a", encoding = "utf-8")
datei.write("Eine neue Zeile!")
datei.write("\nNoch eine neue Zeile!")
datei.close()

Das Escape-Zeichen \n verhindert, dass der folgenden Text in der selben Zeile angehängt wird.


Schreiben: mehrere Zeilen nacheinander

f = open("bestelle.txt", 'a')
weiter = 'j'
while weiter == 'j':
        bestnr = input("Bestellnummer: ")
        f.write("\n"+bestnr)
        weiter = input("Weiter mit mit j, Abbruch mit n: ")
f.close()


Text komplett überschreiben

Der Modus wird mit "w" angegeben (write):

datei = open("../assets/python.txt", "w", encoding = "utf-8")
datei.write("""
Python wurde mit dem Ziel größter Einfachheit und Übersichtlichkeit entworfen. 
Dies wird vor allem durch zwei Maßnahmen erreicht. 
Zum einen kommt die Sprache mit relativ wenigen Schlüsselwörtern aus.[13] 
Zum anderen ist die Syntax reduziert und auf Übersichtlichkeit optimiert. 
Dadurch lassen sich Python-basierte Skripte deutlich knapper formulieren als in anderen Sprachen.
""")
datei.close()

Wenn der Dateiname bisher nicht existierte, wird die Datei neu angelegt.


pyinstaller

PyInstaller freezes (packages) Python applications into stand-alone executables, under Windows, GNU/Linux, Mac OS X, FreeBSD, Solaris and AIX.


Installation unter Windows

pip install pyinstaller

Installation unter Ubuntu

apt install python3-pip
pip3 install pyinstaller

Bei Fehlermeldung "ModuleNotFoundError: No module named 'pip._internal'":

Kontrolle der Installation:

pip3 -V

Neuinstallation erzwingen:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 
python3 get-pip.py --force-reinstall

Kontrolle der Installation:

pip3 -V

[21]

Jetzt funktioniert pip3 install pyinstaller. Sollte analog auch auf Mac funktionieren.


Ausführbare Dateien erzeugen

pyinstaller --onefile dateiname.py

IPython

IPython ist ein Kommandozeileninterpreter zum interaktiven Arbeiten mit der Programmiersprache Python.[22]

sudo apt install ipython3

Aufruf im Terminal:

ipython3

Variablen zurücksetzen:

%reset -f 

Aufruf einer Datei:

ipython3 datei.py

aus IPython heraus:

run datei.py

Typographie

>>> herz = u'\u2764'
>>> print(herz)
❤

Formatierung

Formatierung von float-Zahlen ("Gleitkommazahlen") auf 2 Nachkommastellen: '%.2f' %

kapital = 22092.442508224092
print('%.2f' % kapital)
>>> 22092.44

[23]

Als f-string:

print(f"{kapital:.2f}")

pip

pip bzw. pip3 ist ein Paketverwaltungsprogramm für Python.

Installation unter Ubuntu:

apt install python3-pip

Installation unter Mac:

  1. Download von http://bootstrap.pypa.io/get-pip.py
  2. Im Terminal cd Download
  3. sudo python3 get-pip.py ausführen.



Kompilieren

Ubuntu

Das Programm pyinstaller muss installiert sein.

 pyinstaller /pfadzumskript/skript.py'

pyinstaller -F erzeugt ein Stand Alone Executable. Dieses liegt dann im Verzeichnis dist des Ordners, von dem aus in der Shell die Kompilierung gestartet wurde.


Windows

  • Über cmd vom User-Verzeichnis in das Skript-Verzeichnis wechseln:
cd appdata\local\programs\python\python35\scripts
pip install pyinstaller
pyinstaller c:\pfadzumskript\skript.py

pyinstaller -F erzeugt ein Stand Alone Executable. Dieses liegt dann im Python-Verzeichnis im Unterordner scripts\dist.



Type Hints

Python verwendet eine dynamische Typisierung, dies kann zu Problemen/Fehlern führen, die erst während der Laufzeit erkannt werden. Mit Type Hints soll dieses Problem behoben werden.[24] Beispiel:

def add(a: int, b: int) -> int:
    return a + b

Zur Analyse wird das Tool mypy benötigt:

python3 -m pip install mypy

Jupyter Notebook


Troubleshooting

Deutsche Sonderzeichen lassen sich in IDLE nicht abspeichern

An den Anfang des Skripts folgende Zeile setzen:

# -*- coding: utf-8 -*-

bzw.

# -*- coding: cp1252 -*-

[25]


Code liegt in Python 2 vor

>> Umwandlung mit dem Skript 2to3.py. Das Skript liegt im Verzeichnis von Python 2.

Man kann sich 2to3.py natürlich auch in das lokale Verzeichnis legen. Umwandlung mit

python -w 2to3.py py2Datei.py 

Programm schließt sich sofort nach der Ausführung

In Windows: am Ende des Skripts folgende Zeile einfügen:

os.system("pause")

In Linux: am Ende des Skripts folgende Zeile einfügen:

input

Links und Quellen


Youtube


Bücher


| |