Einführung
In diesem Teil befassen wir uns genauer mit der Praxis des Schreibens von Python-Skripten.
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
In diesem Teil befassen wir uns genauer mit der Praxis des Schreibens von Python-Skripten.
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.
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.
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.
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')
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).
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.
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.
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.
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.
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.
Ä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:
print_report(report)
, die den Bericht ausgibt.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...
>>>
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.
Herzlichen Glückwunsch! Sie haben das Skripting-Labor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.