
Einige Python-Bibliotheken wie Pandas, NumPy und Pillow (PIL) sind so konzipiert, dass Methoden verkettet und der Reihe nach miteinander verarbeitet werden können (= Methodenverkettung).
Die Methodenverkettung ist keine spezielle Syntax, da sie lediglich den Vorgang des Aufrufens einer Methode direkt aus dem Rückgabewert wiederholt.
Die Anzahl der Zeichen pro Zeile ist bei der Verwendung von Methodenketten tendenziell lang, aber SIE können bei Bedarf Klammern verwenden, um Zeilen zu umbrechen.
Zunächst stirbt dieser Artikel nach Grundlagen am Beispiel von Pandas.
- Methodenverkettung bei Pandas
- Zeilenumbrüche innerhalb von Klammern
- Verwenden Sie Backslashes
- Schließen Sie in Klammern ein, um Zeilen zu brechen
Als Nächstes stellt dieser Artikel Beispiele für NumPy und Pillow (PIL) vor.
- Methodenverkettung in NumPy
- Methodenverkettung in Pillow(PIL)
PEP8, der Styleguide für Python (Kodierungskonventionen), enthält einen Abschnitt über Einrückungen, erwähnt jedoch nicht ausdrücklich die Methodenverkettung.
Die following Beispielcodes Werden durch sterben flake8-Codierungsprüfung bestätigt, keine Warnungen auszulösen.
Methodenverkettung bei Pandas
Viele Methoden von pandas.DataFrame und pandas.Series geben pandas.DataFrame und pandas.Series zurück, und die Methoden can verkettet Werden.
Wenn Sie keine Methodenkette verwenden, können Sie beispielsweise folgendes schreiben:
Lesen Sie die Datei mit read_csv().
import pandas as pd
df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
# age state point
# name
# Alice 24 NY 64
# Bob 42 CA 92
# Charlie 18 CA 70
# Dave 68 TX 70
# Ellen 24 CA 88
# Frank 30 NY 57
Fügen Sie diesem Pandas.DataFrame neue Spalten hinzu, löschen Sie unnötige Spalten, sortieren und extrahieren Sie nur die ersten drei Zeilen.
df = df.assign(point_ratio=df['point'] / 100)
df = df.drop(columns='state')
df = df.sort_values('age')
df = df.head(3)
print(df)
# age point point_ratio
# name
# Charlie 18 70 0.70
# Alice 24 64 0.64
# Ellen 24 88 0.88
Derselbe Prozess kann geschrieben werden, jedoch Methoden wie folgt verbunden Werden.
df_mc = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0).assign(point_ratio=df['point'] / 100).drop(columns='state').sort_values('age').head(3)
print(df_mc)
# age point point_ratio
# name
# Charlie 18 70 0.70
# Alice 24 64 0.64
# Ellen 24 88 0.88
Obwohl das Verketten von Methoden bequem und einfach zu schreiben ist, kann es zu unerwarteten Ergebnissen führen, wenn Sie viele Methoden verbinden, sterben Sie nicht gut verstehen. Wenn Sie damit nicht vertraut sind, ist es möglicherweise sicherer, sterben Methoden Einzeln und sterben Ergebnisse zu überprüfen.
Es gibt auch einige Nachteile, wie z. B. die fehlende Vervollständigung für die zweite und weitere Methoden in Editoren.
Zeilenumbrüche innerhalb von Klammern
In Python können Sie Zeilen innerhalb von Klammern frei umbrechen, sodass Sie wie folgt schreiben können:
df_mc_break = pd.read_csv(
'data/src/sample_pandas_normal.csv',
index_col=0
).assign(
point_ratio=df['point'] / 100
).drop(
columns='state'
).sort_values(
'age'
).head(
3
)
Beachten SIE, dass. Selbst WENN SIE Zeilenumbrüche frei verwenden can, ein Fehler ausgelöst WIRD, WENN SIE Eine Zeile in Einem Zeichenfolgenliteral umbrechen.
# df_mc_break = pd.read_csv(
# 'data/src/sample_
# pandas_normal.csv',
# index_col=0
# ).assign(
# point_ratio=df['point'] / 100
# ).drop(
# columns="state"
# ).sort_values(
# 'age'
# ).head(
# 3
# )
# SyntaxError: EOL while scanning string literal
Natürlich können SIE Zeilen nur dort umbrechen, wo viele Zeichen vorhanden sind.
dfdf_mc_break_mc = pd.read_csv(
'data/src/sample_pandas_normal.csv', index_col=0
).assign(
point_ratio=df['point'] / 100
).drop(columns='state').sort_values('age').head(3)
Verwenden Sie Backslashes
In Python ist der Backslash () ein Fortsetzungszeichen, und wenn er am Ende einer Zeile platziert wird, überwacht er nachfolgende Zeilenumbrüche und betrachtet die Zeile als fortlaufend.
Mit diesem können Sie Folgendes schreiben.
df_mc_break_backslash = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
.assign(point_ratio=df['point'] / 100)
.drop(columns='state')
.sort_values('age')
.head(3)
Schließen Sie in Klammern ein, um Zeilen zu brechen
Sie können auch die Regel verwenden, dass Sie Zeilen innerhalb von Klammern frei umbrechen können, und den gesamten Code in Klammern () einschließen.
df_mc_break_parens = (
pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
.assign(point_ratio=df['point'] / 100)
.drop(columns='state')
.sort_values('age')
.head(3)
)
Auch in diesem Fall steht es Ihnen frei, Zeilenumbrüche zu verwenden oder nicht, also können Sie Folgendes schreiben.
df_mc_break_parens = (pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
.assign(point_ratio=df['point'] / 100)
.drop(columns='state')
.sort_values('age')
.head(3))
Das Setzen eines Punktes (. ) am Ende einer Zeile verursacht keinen Fehler. In diesem Fall kann es jedoch schwierig sein, zu erkennen, dass es sich um eine Methodenkette handelt, daher sollten Sie sie vermeiden.
df_mc_break_parens = (
pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0).
assign(point_ratio=df['point'] / 100).
drop(columns='state').
sort_values('age').
head(3)
)
Auf ähnliche Weise can SIE Eine lange Zeichenfolge schreiben, indem SIE Klammern verwenden, um Zeilen im Code umzubrechen. Siehe folgenden Artikel.
Methodenverkettung in NumPy
Es gibt mehrere Methoden des NumPy-Arrays ndarray, die ndarray zurückgeben.
Beispiel ohne Methodenverkettung:
import numpy as np
a = np.arange(12)
a = a.reshape(3, 4)
a = a.clip(2, 9)
print(a)
# [[2 2 2 3]
# [4 5 6 7]
# [8 9 9 9]]
Beispiel mit Methodenverkettung:
a_mc = np.arange(12).reshape(3, 4).clip(2, 9)
print(a_mc)
# [[2 2 2 3]
# [4 5 6 7]
# [8 9 9 9]]
Eine Zeile durch Einschließen in Klammern umbrechen.
a_mc_break_parens = (
np.arange(12)
.reshape(3, 4)
.clip(2, 9)
)
print(a_mc_break_parens)
# [[2 2 2 3]
# [4 5 6 7]
# [8 9 9 9]]
Beachten Sie, dass in NumPy viele Operationen als Funktionen mit ndarray als Argument und nicht als Methoden von ndarray definiert sind, sodass Sie nicht alles mit einer Methodenkette machen können, wie Sie es mit Pandas können.
Methodenverkettung in Pillow(PIL)
In der Bildverarbeitungsbibliothek Pillow(PIL) werden Bilder durch den Bildtyp dargestellt. Einige Methoden von Image geben auch das verarbeitete Image zurück.
Beispiel ohne Methodenverkettung:
Eine Bilddatei wird geladen, verschiedene Prozesse werden ausgeführt und schließlich als eine andere Datei gespeichert.
from PIL import Image, ImageFilter
im = Image.open('data/src/lena_square.png')
im = im.convert('L')
im = im.rotate(90)
im = im.filter(ImageFilter.GaussianBlur())
im.save('data/temp/lena_square_pillow.jpg', quality=95)
Beispiel mit Methodenverkettung:
Image.open('data/src/lena_square.png').convert('L').rotate(90).filter(ImageFilter.GaussianBlur()).save('data/temp/lena_square_pillow.jpg', quality=95)
Eine Zeile durch Einschließen in Klammern umbrechen.
Dieses Beispiel sieht vielleicht etwas seltsam aus, denn wenn Sie alles vom Laden bis zum Speichern auf einmal erledigen, können Sie den Vorgang abschließen, ohne den Rückgabewert einer Variablen zuzuweisen.
(
Image.open('data/src/lena_square.png')
.convert('L')
.rotate(90)
.filter(ImageFilter.GaussianBlur())
.save('data/temp/lena_square_pillow.jpg', quality=95)
)