
Alcune librerie Python, come panda, NumPy e Pillow (PIL), sono in modo che i metodi possono essere concatenati ed elaborati in ordine (= concatena dei metodi).
Il concatenamento di metodi non è una sintassi speciale, poiché si limita a ripetere il processo di chiamata di un metodo direttamente dal valore restituito.
Il numero di caratteri per riga tende ad essere lungo si utilizza catene di metodi, ma è possibile utilizzare le interruzioni per quando le righe secondo necessità.
Innanzitutto, questo articolo le seguenti descrizioni di base utilizzando i panda come esempio.
- Metodo concatenamento nei panda
- Interruzioni di riga tra parentesi
- Usa le barre rovesciate
- Racchiudi tra parentesi per interrompere le linee
Successivamente, questo articolo presenta esempi di NumPy e Pillow (PIL).
- Concatenamento di metodi in NumPy
- Concatenamento di metodi in Cuscino(PIL)
PEP8, la guida allo stile Python (convenzioni di codifica), include la sezione una sull’indentazione ma non menzionata il concatenamento dei metodi.
Si conferma che i seguenti codici di esempio non generano alcun avviso dal controllo della codifica flake8.
Metodo concatenamento nei panda
Molti metodi di pandas.DataFrame e pandas.Series restituiscono pandas.DataFrame e pandas.Series ei metodi possono essere concatenati.
Se non utilizzare una catena di metodi, puoi scrivere, ad esempio, quanto segue:
Leggi il file con 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
Aggiungi nuove colonne a questo pandas.DataFrame, elimina le colonne non necessarie, ordina ed estrai solo le prime tre righe.
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
Lo stesso processo può essere scritto collegando i metodi come segue.
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
Se il concatenamento dei metodi sia comodo e semplice da scrivere, può portare a risultati imprevisti se colleghi molti metodi che non capisci bene. Se non li conosci, potrebbe essere più sicuro applicare i metodi uno per uno e controllare i risultati.
Ci sono anche alcuni svantaggi, come la mancanza di completamento per il secondo ei successivi metodi in alcuni editor.
Interruzioni di riga tra parentesi
In Python, puoi interrompere liberamente le righe tra parentesi, quindi scrivere come segue:
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
)
Nota che anche se puoi usare liberamente le interruzioni di riga, viene generato un errore se interrompi una riga in una stringa letterale.
# 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
Naturalmente, puoi interrompere le linee solo dove ci sono molti.
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)
Usa le barre rovesciate
In Python, la barra rovesciata () è un carattere di continuazione e, quando viene posizionato alla fine di una riga, ignora le interruzioni di riga successive e considera la riga continua.
Usando questo, puoi scrivere quanto segue.
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)
Racchiudi tra parentesi per interrompere le linee
Puoi anche utilizzare la regola per cui puoi interrompere liberamente le righe tra parentesi e racchiudere l’intero codice tra parentesi ().
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)
)
Anche in questo caso sei libero di usare o meno le interruzioni di riga, quindi puoi scrivere quanto segue.
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))
Mettere un punto (. ) alla fine di una riga non provoca un errore. Tuttavia, in questo caso, potrebbe essere difficile vedere che si tratta di una catena di metodi, quindi quindi evitarlo.
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)
)
Allo stesso modo, puoi scrivere una lunga stringa usando le parentesi per interrompere le righe nel codice. Vedi il seguente articolo.
Concatenamento di metodi in NumPy
Esistono diversi metodi per l’array NumPy ndarray che richiede ndarray.
Esempio senza concatenamento di metodi:
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]]
Esempio con concatenamento di metodi:
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]]
Interrompere una riga racchiudendola tra parentesi.
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]]
Nota che in NumPy, molte operazioni sono definite come funzioni con ndarray come argomento, piuttosto che come metodi di ndarray, quindi non puoi fare tutto con una catena di metodi come puoi con i panda.
Concatenamento di metodi in Cuscino(PIL)
Nella libreria di elaborazione delle immagini Pillow(PIL), le immagini sono rappresentate dal tipo di immagine. Alcuni metodi di immagine restituiscono anche l’immagine elaborata.
Esempio senza concatenamento di metodi:
Viene caricato un file immagine, vengono eseguiti vari processi e, infine, viene salvato come un altro file.
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)
Esempio con concatenamento di metodi:
Image.open('data/src/lena_square.png').convert('L').rotate(90).filter(ImageFilter.GaussianBlur()).save('data/temp/lena_square_pillow.jpg', quality=95)
Interrompere una riga racchiudendola tra parentesi.
Questo esempio può apparire un po’ strano perché se si esegue tutto, dal caricamento al salvataggio in una volta, è possibile completare il processo senza rilasciare il valore restituito a una variabile.
(
Image.open('data/src/lena_square.png')
.convert('L')
.rotate(90)
.filter(ImageFilter.GaussianBlur())
.save('data/temp/lena_square_pillow.jpg', quality=95)
)
