Einführung in Python

Auftakt

Willkommen bei der Online-Anleitung für Python von Google. Er basiert auf dem intern angebotenen Einführungskurs in Python. Wie auf der Seite für die Einrichtung erwähnt, wird in diesem Material Python 3 behandelt.

Wenn Sie auf der Suche nach einem MOOC-Begleitkurs sind, empfehlen wir Ihnen die Kurse von Udacity und Coursera (Einführung in das Programmieren [für Anfänger] oder Einführung in Python). Wenn Sie online lernen möchten, ohne Videos im eigenen Tempo zu lernen, dann probieren Sie die am Ende dieses Blogposts aufgeführten Tipps aus. Sie enthalten alle Lerninhalte sowie einen interaktiven Python-Interpreter, mit dem Sie üben können. Was ist dieser „Dolmetscher“, den wir erwähnen? Im nächsten Abschnitt erfährst du mehr.

Einführung in die Sprache

Python ist eine dynamische, interpretierte (mit Bytecode kompilierte) Sprache. Im Quellcode gibt es keine Typdeklarationen von Variablen, Parametern, Funktionen oder Methoden. Dadurch wird der Code kurz und flexibel und Sie verlieren die Art der Kompilierungszeit des Quellcodes. Python verfolgt die Typen aller Werte zur Laufzeit und kennzeichnet Code, der während der Ausführung keinen Sinn ergibt.

Eine hervorragende Möglichkeit zu sehen, wie Python-Code funktioniert, besteht darin, den Python-Interpreter auszuführen und Code direkt darin einzugeben. Wenn Sie mal eine Frage wie „Was passiert, wenn ich einem list ein int hinzufüge?“ haben, können Sie schnell und wahrscheinlich am besten sehen, was passiert, indem Sie die Frage einfach in den Python-Interpreter eingeben. Unten sehen Sie, was tatsächlich passiert.

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

Die zwei Zeilen Python wird ausgegeben, nachdem Sie python eingegeben haben und vor der Eingabeaufforderung >>>, welche Version von Python Sie verwenden und wo sie erstellt wurde. Wenn als Erstes „Python 3.“ ausgegeben wird, sollten diese Beispiele funktionieren.

Wie Sie oben sehen, ist es einfach, mit Variablen und Operatoren zu experimentieren. Außerdem gibt der Interpreter in Python-Sprachsprache einen Laufzeitfehler aus, wenn der Code versucht, eine Variable zu lesen, der kein Wert zugewiesen wurde. Wie bei C++ und Java muss auch bei Python die Groß- und Kleinschreibung beachtet werden, sodass "a" und "A" unterschiedliche Variablen sind. Das Ende einer Zeile markiert das Ende einer Anweisung, sodass in Python im Gegensatz zu C++ und Java kein Semikolon am Ende jeder Anweisung erforderlich ist. Kommentare beginnen mit einem Rautenzeichen (#) und erstrecken sich bis zum Zeilenende.

Python-Quellcode

Python-Quelldateien verwenden die Erweiterung „.py“ und werden als „Module“ bezeichnet. Mit dem Python-Modul hello.py lässt es sich am einfachsten mit dem Shell-Befehl „python hello.py Alice“ ausführen. Dieser ruft den Python-Interpreter auf, um den Code in hello.py auszuführen, und übergibt ihm das Befehlszeilenargument „Alice“. Auf der offiziellen Dokumentationsseite finden Sie Informationen zu den verschiedenen Optionen, die Ihnen zur Verfügung stehen, wenn Sie Python über die Befehlszeile ausführen.

Hier sehen Sie ein sehr einfaches hello.py-Programm (beachten Sie, dass Codeblöcke streng durch Einrückungen und nicht durch geschweifte Klammern getrennt werden – mehr dazu später).

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

Das Ausführen dieses Programms über die Befehlszeile sieht so aus:

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

Importe, Befehlszeilenargumente und len()

Die äußersten Anweisungen in einer Python-Datei oder einem „Modul“ werden einmalig eingerichtet. Diese Anweisungen werden beim ersten Import des Moduls von oben nach unten ausgeführt und richten die Variablen und Funktionen ein. Ein Python-Modul kann direkt ausgeführt werden – wie oben unter python3 hello.py Bob beschrieben – oder es kann importiert und von einem anderen Modul verwendet werden. Wenn eine Python-Datei direkt ausgeführt wird, wird die Sondervariable „__name__“ auf „__main__“ gesetzt. Daher ist es üblich, dass die oben gezeigte Boilerplate-if __name__ ==...-Funktion eine main()-Funktion aufruft, wenn das Modul direkt ausgeführt wird, aber nicht, wenn das Modul von einem anderen Modul importiert wird.

In einem Python-Standardprogramm enthält die Liste sys.argv standardmäßig die Befehlszeilenargumente, wobei sys.argv[0] das Programm selbst, sys.argv[1] das erste Argument und so weiter ist. Wenn Sie argc oder die Anzahl der Argumente kennen, können Sie diesen Wert einfach mit len(sys.argv) von Python anfordern, wie im interaktiven Interpretercode oben bei der Abfrage der Stringlänge. Im Allgemeinen gibt len() Ihnen Aufschluss darüber, wie lang ein String ist, die Anzahl der Elemente in Listen und Tupeln (eine andere Array-ähnliche Datenstruktur) und die Anzahl der Schlüssel/Wert-Paare in einem Wörterbuch.

Benutzerdefinierte Funktionen

Funktionen in Python sind so definiert:

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

Beachten Sie auch, wie die Zeilen, aus denen die Funktion oder if-Anweisung besteht, gruppiert werden, indem alle die gleiche Einrückung haben. Außerdem haben wir zwei verschiedene Möglichkeiten für die Wiederholung von Strings vorgestellt. Der +-Operator ist benutzerfreundlicher, aber * funktioniert auch, weil es der „Repeat“-Operator von Python ist, d. h., dass '-' * 10 '----------' eine praktische Möglichkeit bietet, eine On-Screen-„Line“ zu erstellen. Im Codekommentar haben wir angegeben, dass * schneller als + funktioniert. Dies liegt daran, dass * die Größe des resultierenden Objekts einmal berechnet, während die Berechnung mit + bei jedem Aufruf von + erfolgt. Die Operatoren „+“ und „*“ werden als „überladene“ Operatoren bezeichnet, weil sie für Zahlen und Strings (und andere Datentypen) unterschiedliche Bedeutungen haben.

Das Schlüsselwort def definiert die Funktion, wobei ihre Parameter in Klammern und ihr Code eingerückt sind. Die erste Zeile einer Funktion kann ein Dokumentationsstring („docstring“) sein, der die Funktion der Funktion beschreibt. Der docstring kann eine einzelne Zeile oder eine mehrzeilige Beschreibung wie im obigen Beispiel sein. (Ja, das sind „dreifache Anführungszeichen“, eine Funktion, die nur in Python verfügbar ist!) In der Funktion definierte Variablen beziehen sich lokal auf diese Funktion, sodass das „Ergebnis“ in der obigen Funktion von einer „Ergebnisvariablen“ in einer anderen Funktion getrennt ist. Die Anweisung return kann ein Argument annehmen. In diesem Fall ist dies der an den Aufrufer zurückgegebene Wert.

Hier sehen Sie Code, der die obige Repeat()-Funktion aufruft und das zurückgegebene Ergebnis ausgibt:

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

Zur Laufzeit müssen Funktionen durch die Ausführung von "def" definiert werden, bevor sie aufgerufen werden. Normalerweise definieren Sie eine main()-Funktion am Ende der Datei mit den darüber aufgerufenen Funktionen.

Einzug

Eine ungewöhnliche Python-Funktion ist, dass die Leerraumeinrückung eines Code-Snippets Auswirkungen auf seine Bedeutung hat. Ein logischer Block von Anweisungen, wie die Anweisungen, aus denen eine Funktion besteht, sollte alle dieselbe Einrückung haben, die von der Einrückung der übergeordneten Funktion oder durch „if“ oder etwas insoweit festgelegt wird. Wenn eine der Zeilen in einer Gruppe einen anderen Einzug hat, wird sie als Syntaxfehler gekennzeichnet.

Die Verwendung von Leerzeichen in Python fühlt sich anfangs etwas seltsam an, aber es ist logisch und ich habe mich sehr schnell daran gewöhnt. Vermeiden Sie die Verwendung von TABs, da sie das Einrückungsschema erheblich erschweren (und natürlich können TABs auf verschiedenen Plattformen unterschiedliche Bedeutungen haben). Stellen Sie Ihren Editor so ein, dass Leerzeichen anstelle von TABs für Python-Code eingefügt werden.

Neue Fragen, die sich Neulinge stellen, lautet: „Wie viele Leerzeichen sollte ich einrücken?“ Gemäß dem offiziellen Python-Styleguide (PEP 8) sollten Sie den Einzug mit vier Leerzeichen vornehmen. (Zusatzinfo: Die interne Stilrichtlinie von Google sieht eine Einrückung um zwei Leerzeichen vor.)

Während der Laufzeit geprüfter Code

Python überprüft zum Zeitpunkt der Kompilierung nur sehr wenige Prüfungen und verschiebt fast alle Überprüfungen von Typ, Namen usw. in jeder Zeile, bis diese Zeile ausgeführt wird. Angenommen, die obige main()-Methode ruft die Repeat()-Funktion wie folgt auf:

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

Die if-Anweisung enthält einen offensichtlichen Fehler, bei dem die Funktion Repeat() versehentlich als repeeeet() eingegeben wird. Das Lustige in Python ist, dass dieser Code kompiliert und problemlos ausgeführt wird, solange der Name zur Laufzeit nicht "Guido" lautet. Nur wenn beim Ausführen tatsächlich versucht wird, repeeeet() auszuführen, stellt es fest, dass es keine solche Funktion gibt, und löst einen Fehler aus. Dieses Snippet enthält auch einen zweiten Fehler. Dem Namen wurde vor dem Vergleich mit "Guido" kein Wert zugewiesen. Python gibt einen "NameError" aus, wenn Sie versuchen, eine nicht zugewiesene Variable auszuwerten. Diese Beispiele zeigen, dass beim ersten Ausführen eines Python-Programms einige der ersten Fehler einfache Tippfehler oder nicht initialisierte Variablen wie diese sind. Dies ist ein Bereich, in dem Sprachen mit einem ausführlicheren Typsystem wie Java einen Vorteil haben ... Sie können solche Fehler bei der Kompilierung erkennen (aber natürlich müssen Sie all diese Typinformationen beibehalten ... das ist ein Kompromiss).

In Python 3 wurden Typhinweise eingeführt. Mit Typhinweisen können Sie für jedes Argument in einer Funktion den Typ und den Typ des Objekts angeben, das von der Funktion zurückgegeben wird. In der annotierten Funktion def is_positive(n: int) -> bool: ist beispielsweise das Argument n ein int und der Rückgabewert ein bool. Wir werden später darauf eingehen, was diese Typen bedeuten. Typhinweise sind optional. Sie werden mehr und mehr Code mit Typhinweisen sehen, denn wenn Sie diese verwenden, können einige Editoren wie cider-v und VS.code Prüfungen ausführen, um zu überprüfen, ob Ihre Funktionen mit den richtigen Argumenttypen aufgerufen werden. Sie können sogar Argumente vorschlagen und validieren, während Sie den Code bearbeiten. In dieser Anleitung geht es nicht um Typhinweise. Wir möchten aber sicherstellen, dass Sie über sie informiert sind, wenn Sie von ihnen hören oder sie in freier Wildbahn sehen.

Variablennamen

Da für Python-Variablen im Quellcode kein Typ ausgeschrieben ist, ist es besonders hilfreich, den Variablen aussagekräftige Namen zu geben, um sich an den Ablauf zu erinnern. Verwenden Sie also „name“, wenn es sich um einen einzelnen Namen handelt, und „names“, wenn es sich um eine Liste mit Namen handelt, und „Tupel“, wenn es sich um eine Liste von Tupeln handelt. Viele grundlegende Python-Fehler entstehen dadurch, dass Sie vergessen, welche Art von Wert in den einzelnen Variablen enthalten ist. Verwenden Sie also Ihre Variablennamen (alles, was Sie haben), um den Überblick zu behalten.

Was die eigentliche Benennung angeht: Einige Sprachen bevorzugen „unterstrichd_parts“ für Variablennamen, die aus „mehr als einem Wort“ bestehen, während andere Sprachen das CamelCasing bevorzugen. Im Allgemeinen bevorzugt Python die Unterstrich-Methode, führt Entwickler jedoch dazu, auf „CamelCasing“ zu setzen, wenn sie in vorhandenen Python-Code integriert werden, der diesen Stil bereits verwendet. Die Lesbarkeit zählt. Weitere Informationen finden Sie im Abschnitt zu den Namenskonventionen in PEP 8.

Wie Sie sich schon denken können, können Keywords wie "if" und "while" nicht als Variablennamen verwendet werden. In diesem Fall erhalten Sie einen Syntaxfehler. Achten Sie jedoch darauf, keine integrierten Begriffe als Variablennamen zu verwenden. Beispiel: Auch wenn 'str', 'list' und 'print' gute Namen zu sein scheinen, würden Sie diese Systemvariablen überschreiben. Integrierte sind keine Schlüsselwörter und sind daher anfällig für eine unbeabsichtigte Verwendung durch neue Python-Entwickler.

Weitere Informationen zu Modulen und ihren Namespaces

Angenommen, Sie haben ein Modul „binky.py“, das „def foo()“ enthält. Der voll qualifizierte Name dieser foo-Funktion lautet „binky.foo“. Auf diese Weise können verschiedene Python-Module ihre Funktionen und Variablen beliebig benennen, ohne dass Konflikte zwischen den Variablennamen entstehen, da sich „module1.foo“ von „module2.foo“ unterscheidet. Im Python-Vokabular würden wir sagen, dass binky, modul1 und modul2 jeweils ihre eigenen „Namespaces“ haben, bei denen es sich, wie Sie sich denken können, um Variablenname-zu-Objekt-Bindungen handelt.

Wir haben beispielsweise das Standardmodul „sys“, das einige Standardfunktionen des Systems enthält, wie die Funktion „argv list“ und die Funktion „exit()“. Mit der Anweisung „import sys“ können Sie dann auf die Definitionen im sys-Modul zugreifen und sie anhand ihres voll qualifizierten Namens verfügbar machen, z.B. sys.exit(). (Ja, „sys“ hat auch einen Namespace!)

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

Es gibt ein weiteres Importformular, das so aussieht: „from sys import argv, Exit“. Dadurch sind „argv“ und „exit()“ über ihre Kurznamen verfügbar. Wir empfehlen jedoch die ursprüngliche Form mit den voll qualifizierten Namen, da sich so viel einfacher feststellen lässt, woher eine Funktion oder ein Attribut stammt.

Es gibt viele Module und Pakete, die mit einer Standardinstallation des Python-Interpreters gebündelt sind, sodass Sie nichts weiter tun müssen, um sie zu verwenden. Diese werden zusammen als „Python Standard Library“ bezeichnet. Zu den häufig verwendeten Modulen/Paketen gehören:

  • sys – Zugriff auf "exit()", "argv", "stdin", "stdout" usw.
  • re – reguläre Ausdrücke
  • os – Betriebssystemschnittstelle, Dateisystem

Die Dokumentation aller Module und Pakete der Standardbibliothek finden Sie unter http://docs.python.org/library.

Onlinehilfe, help() und dir()

Es gibt verschiedene Möglichkeiten, Hilfe für Python zu erhalten.

  • Führen Sie eine Google-Suche durch und beginnen Sie dabei mit dem Wort „Python“, z. B. „Python-Liste“ oder „Python-String Kleinbuchstaben“. Der erste Treffer ist oft die Lösung. Diese Technik scheint für Python besser zu funktionieren als für andere Sprachen.
  • Auf der offiziellen Python-Dokumentationswebsite docs.python.org finden Sie hochwertige Dokumente. Trotzdem finde ich oft eine Google-Suche nach ein paar Wörtern, um schneller zu sein.
  • Außerdem gibt es eine offizielle Tutor-Mailingliste speziell für alle, die neu in Python und/oder Programmierung sind.
  • Viele Fragen (und Antworten) finden Sie auf StackOverflow und Quora.
  • Verwenden Sie die Funktionen help() und dir() (siehe unten).

Im Python-Interpreter ruft die Funktion help() Dokumentationsstrings für verschiedene Module, Funktionen und Methoden ab. Diese doc-Strings ähneln der Javadoc-Datei von Java. Die Funktion dir() gibt die Attribute eines Objekts an. Im Folgenden finden Sie einige Möglichkeiten, help() und dir() über den Interpreter aufzurufen:

  • help(len): Hilfestring für die integrierte len()-Funktion. Es handelt sich um „len“ und nicht um einen Aufruf der Funktion, was nicht gewünscht ist.
  • help(sys): Hilfestring für das Modul sys (zuerst muss ein import sys ausgeführt werden)
  • dir(sys)dir() ist wie help(), enthält aber nur eine kurze Liste der definierten Symbole oder „Attribute“
  • help(sys.exit) – Hilfestring für die Funktion exit() im Modul sys
  • help('xyz'.split): Hilfestring für die Methode split() für Stringobjekte. Sie können help() mit diesem Objekt oder mit einem Beispiel dieses Objekts und seinem Attribut aufrufen. Wenn Sie beispielsweise help('xyz'.split) aufrufen, ist das dasselbe wie help(str.split).
  • help(list) – Hilfestring für list-Objekte
  • dir(list): Zeigt list-Objektattribute einschließlich ihrer Methoden an
  • help(list.append): Hilfestring für die Methode append() für list-Objekte