Python-Skriptschreiben Übung

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Teil befassen wir uns genauer mit der Praxis des Schreibens von Python-Skripten.

Was ist ein Skript?

Ein Skript ist ein Programm, das eine Reihe von Anweisungen ausführt und dann stoppt.

## program.py

Anweisung1
Anweisung2
Anweisung3
...

Bis zu diesem Punkt haben wir hauptsächlich Skripte geschrieben.

Ein Problem

Wenn Sie ein nützliches Skript schreiben, werden seine Funktionen und Funktionalität wachsen. Möglicherweise möchten Sie es auf andere verwandte Probleme anwenden. Im Laufe der Zeit könnte es zu einer kritischen Anwendung werden. Und wenn Sie nicht aufpassen, kann es zu einem riesigen, verwirbelten Durcheinander werden. Also, lasst uns uns organisieren.

Dinge definieren

Namen müssen immer definiert sein, bevor sie später verwendet werden.

def square(x):
    return x*x

a = 42
b = a + 2     ## Erfordert, dass `a` definiert ist

z = square(b) ## Erfordert, dass `square` und `b` definiert sind

Die Reihenfolge ist wichtig. Sie setzen die Definitionen von Variablen und Funktionen fast immer ganz oben.

Funktionen definieren

Es ist eine gute Idee, den gesamten Code, der mit einer einzelnen Aufgabe zusammenhängt, an einem Ort zu sammeln. Verwenden Sie eine Funktion.

def read_prices(filename):
    prices = {}
    with open(filename) as f:
        f_csv = csv.reader(f)
        for row in f_csv:
            prices[row[0]] = float(row[1])
    return prices

Eine Funktion vereinfacht auch wiederholte Vorgänge.

oldprices = read_prices('oldprices.csv')
newprices = read_prices('newprices.csv')

Was ist eine Funktion?

Eine Funktion ist eine benannte Folge von Anweisungen.

def funcname(args):
  Anweisung
  Anweisung
...
  return Ergebnis

Alle Python-Anweisungen können darin verwendet werden.

def foo():
    import math
    print(math.sqrt(2))
    help(math)

Es gibt keine besonderen Anweisungen in Python (was es leicht zu merken macht).

Funktionsdefinition

Funktionen können in beliebiger Reihenfolge definiert werden.

def foo(x):
    bar(x)

def bar(x):
    Anweisungen

## ODER
def bar(x):
    Anweisungen

def foo(x):
    bar(x)

Funktionen müssen nur vor ihrem tatsächlichen Verwendung (oder Aufruf) während der Programmausführung definiert werden.

foo(3)        ## foo muss bereits definiert sein

Aus stilistischen Gründen ist es wahrscheinlich üblicher, Funktionen in einer untere-zu-oben -Art und Weise zu definieren.

Untere-zu-oben - Stil

Funktionen werden als Bausteine behandelt. Die kleineren / einfacheren Blöcke kommen zuerst.

## myprogram.py
def foo(x):
  ...

def bar(x):
  ...
    foo(x)          ## Obige Definition
  ...

def spam(x):
  ...
    bar(x)          ## Obige Definition
  ...

spam(42)            ## Der Code, der die Funktionen verwendet, erscheint am Ende

Später definierte Funktionen bauen auf früher definierten Funktionen auf. Dies ist wiederum nur ein stilistischer Aspekt. Das Wichtigste im obigen Programm ist, dass der Aufruf von spam(42) am Ende steht.

Funktionsdesign

Idealerweise sollten Funktionen eine Schwarze Box sein. Sie sollten nur auf die übergebenen Eingaben operieren und globale Variablen und rätselhafte Nebeneffekte vermeiden. Ihre Hauptziele sind: Modularität und Vorhersehbarkeit.

Doc Strings

Es ist eine gute Praxis, Dokumentation in Form eines Doc-Strings beizubehalten. Doc-Strings sind Strings, die direkt nach dem Funktionsnamen geschrieben werden. Sie werden von help(), IDEs und anderen Tools verwendet.

def read_prices(filename):
    '''
    Liest Preise aus einer CSV-Datei mit Namen,Preis-Daten
    '''
    prices = {}
    with open(filename) as f:
        f_csv = csv.reader(f)
        for row in f_csv:
            prices[row[0]] = float(row[1])
    return prices

Eine gute Praxis für Doc-Strings ist es, einen kurzen einen-Satz-Zusammenfassung darüber zu schreiben, was die Funktion macht. Wenn weitere Informationen erforderlich sind, fügen Sie ein kurzes Verwendungsexempel zusammen mit einer detaillierteren Beschreibung der Argumente hinzu.

Typ-Annotationen

Sie können auch optionale Typhinweise zu Funktionsdefinitionen hinzufügen.

def read_prices(filename: str) -> dict:
    '''
    Liest Preise aus einer CSV-Datei mit Namen,Preis-Daten
    '''
    prices = {}
    with open(filename) as f:
        f_csv = csv.reader(f)
        for row in f_csv:
            prices[row[0]] = float(row[1])
    return prices

Die Hinweise haben keinerlei operative Wirkung. Sie sind rein informativ. Sie können jedoch von IDEs, Code-Checkern und anderen Tools genutzt werden, um mehr zu tun.

Im Abschnitt 2 haben Sie ein Programm namens report.py geschrieben, das einen Bericht ausdruckte, der die Leistung eines Aktienportfolios zeigt. Dieses Programm bestand aus einigen Funktionen. Beispielsweise:

## report.py
import csv

def read_portfolio(filename):
    '''
    Liest eine Aktienportfoliodatei in eine Liste von Dictionaries mit den Schlüsseln
    name, shares und price.
    '''
    portfolio = []
    with open(filename) as f:
        rows = csv.reader(f)
        headers = next(rows)

        for row in rows:
            record = dict(zip(headers, row))
            stock = {
                'name' : record['name'],
               'shares' : int(record['shares']),
                'price' : float(record['price'])
            }
            portfolio.append(stock)
    return portfolio
...

Es gab jedoch auch Teile des Programms, die einfach eine Reihe von skriptbasierten Berechnungen vornahmen. Dieser Code erschien am Ende des Programms. Beispielsweise:

...

## Ausgabe des Berichts

headers = ('Name', 'Anteile', 'Preis', 'Änderung')
print('%10s %10s %10s %10s'  % headers)
print(('-' * 10 +'') * len(headers))
for row in report:
    print('%10s %10d %10.2f %10.2f' % row)
...

In dieser Übung werden wir dieses Programm nehmen und es etwas stärker um die Verwendung von Funktionen organisieren.

Übung 3.1: Strukturieren eines Programms als Sammlung von Funktionen

Ändern Sie Ihr report.py-Programm so, dass alle wichtigen Operationen, einschließlich der Berechnungen und Ausgabe, von einer Sammlung von Funktionen durchgeführt werden. Genauer gesagt:

  • Erstellen Sie eine Funktion print_report(report), die den Bericht ausgibt.
  • Ändern Sie den letzten Teil des Programms so, dass es nichts weiter als eine Reihe von Funktionsaufrufen und keine andere Berechnung ist.
✨ Lösung prüfen und üben

Übung 3.2: Erstellen einer obersten Ebene-Funktion für die Programmausführung

Nehmen Sie den letzten Teil Ihres Programms und verpacken Sie ihn in eine einzelne Funktion portfolio_report(portfolio_filename, prices_filename). Stellen Sie sicher, dass die Funktion so funktioniert, dass der folgende Funktionsaufruf den Bericht wie zuvor erstellt:

portfolio_report('/home/labex/project/portfolio.csv', '/home/labex/project/prices.csv')

In dieser endgültigen Version wird Ihr Programm nichts weiter als eine Reihe von Funktionsdefinitionen sein, gefolgt von einem einzelnen Funktionsaufruf von portfolio_report() am Ende (der alle im Programm involvierten Schritte ausführt).

Indem Sie Ihr Programm in eine einzelne Funktion umwandeln, wird es einfacher, es mit unterschiedlichen Eingaben auszuführen. Versuchen Sie beispielsweise die folgenden Anweisungen interaktiv nach Ausführung Ihres Programms:

>>> portfolio_report('/home/labex/project/portfolio2.csv', '/home/labex/project/prices.csv')
... schauen Sie sich die Ausgabe an...
>>> files = ['/home/labex/project/portfolio.csv', '/home/labex/project/portfolio2.csv']
>>> for name in files:
        print(f'{name:-^43s}')
        portfolio_report(name, '/home/labex/project/prices.csv')
        print()

... schauen Sie sich die Ausgabe an...
>>>
✨ Lösung prüfen und üben

Kommentar

Python macht es sehr einfach, relativ unstrukturiertes Skriptcode zu schreiben, bei dem Sie einfach eine Datei mit einer Reihe von Anweisungen haben. Im Großen und Ganzen ist es fast immer besser, Funktionen soweit möglich zu nutzen. Irgendwann wird dieser Skriptcode wachsen, und Sie werden wünschen, dass Sie etwas mehr Organisation hätten. Ein weiterer, weniger bekannter Umstand ist, dass Python etwas schneller läuft, wenn Sie Funktionen verwenden.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Skripting-Labor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.