Python: Unterschied zwischen den Versionen

Aus Flinkwiki
Wechseln zu: Navigation, Suche
(String)
(String)
Zeile 243: Zeile 243:
  
 
=== String-Formatierung ===
 
=== String-Formatierung ===
==== Eingebaute Funktion ''format'' ===
+
==== Eingebaute Funktion ''format'' ====
  
 
  <nowiki>
 
  <nowiki>

Version vom 30. August 2020, 15:09 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"


Inhaltsverzeichnis

Allgemeines

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

Ein Online-Interpreter befindet sich auf

  • repl.it

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

apt install pycharm-community 

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 Installation unter Ubuntu (apt-get install python3-pip python3-pyqt5)[2])


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

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.

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']
>>> 


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.

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

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

String

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

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

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'

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, ob ein String in Integer oder Float umgewandelt werden kann:

str.isnumeric()

in-Operator

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

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

Zahlen

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

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")


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 *

Listen

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

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.


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)
[6]

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 sortieren

Funktion sort(): liste.sort()


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: [7], 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)
[8]

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


Dictionarys

Verwendung

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.

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,"chlü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:

>>> 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)

Überprüfung mit der Methode get():

zaehler.get("Imotech", 0)
print(zaehler["Imotech"])

Ausgabe:

Zahl für Imotech: nicht vorhanden.

Mit existierendem Schlüssel:

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

Ausgabe:

Zahl 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:

Zahl für Imotech: 1.

Methode items()

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

for a,b in zaehler.items():
    print(a,b)

Lesen und Schreiben von Dateien

Öffnen und Anzeigen

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'[9]

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.")

Inhalte hinzufügen

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.


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.


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

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

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

pyinstaller

Installation Windows

pip install pyinstaller

Installation 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

[10]

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


Typographie

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

Formatierung

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

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

[11]


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.



Jupyter Notebook


Troubleshooting

Deutsche Sonderzeichen lassen sich in IDLE nicht abspeichern

Entweder an den Anfang des Skripts folgende Zeile setzen:

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

bzw.

# -*- coding: cp1252 -*-

[12]

oder in IDLE (Shell-Menü) folgende Einstellung vornehmen: Options > Configure IDLE > General > Default Source Encoding > UTF-8


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 

Links und Quellen


Youtube


Bücher


| |