Come posso imparare a scrivere in modo efficace il codice Pythonic?


46

Fare una ricerca su Google per "pythonic" rivela una vasta gamma di interpretazioni. La pagina di Wikipedia dice:

Un comune neologismo nella comunità di Python è il pitone, che può avere una vasta gamma di significati legati allo stile del programma. Dire che il codice è pitonico significa dire che usa bene i modi di dire di Python, che è naturale o mostra fluidità nel linguaggio. Allo stesso modo, dire di un'interfaccia o di una caratteristica del linguaggio che è pitonico significa dire che funziona bene con i modi di dire di Python, che il suo uso si adatta bene al resto del linguaggio.

Discute anche il termine "unpythonic":

Al contrario, un segno di codice non pitonico è che tenta di scrivere codice C ++ (o Lisp, Perl o Java) in Python, ovvero fornisce una trascrizione approssimativa piuttosto che una traduzione idiomatica di forme da un'altra lingua. Il concetto di pitonicità è strettamente legato alla filosofia minimalista di leggibilità di Python ed evita l'approccio "c'è più di un modo per farlo". Il codice illeggibile o modi di dire incomprensibili non sono ritonici.

Cosa significa "pitone"? Come posso imparare ad applicarlo efficacemente nella pratica?


6
Penso che la tua domanda possa essere estesa a qualsiasi linguaggio di programmazione. Esiste sempre un modo di programmazione raccomandato che potrebbe essere accurato in un gran numero di casi e anche per migliorare la revisione, la leggibilità e la manutenzione. Penso anche che sfidare queste raccomandazioni possa far evolvere e far evolvere una lingua ...
Amine,

@Amine così vero. In realtà penso che dovrebbe essere presa in considerazione una wiki della comunità che consiste precisamente dove imparare i linguaggi linguistici - per tutte le lingue.
yati sagade


1
Commentatori: interrompere la pubblicazione di commenti non pertinenti; sono stati cancellati per un motivo. Se hai una risposta, lasciala come risposta. Se vuoi discutere l'argomento di questa domanda, utilizza la chat .

1
Praticando Python!
Dinamico

Risposte:


22

Ho scoperto che la maggior parte delle persone ha le proprie interpretazioni di cosa significhi essere "Pythonic". Da Wikipedia:

Un comune neologismo nella comunità di Python è il pitone, che può avere una vasta gamma di significati legati allo stile del programma. Dire che il codice è pitonico significa dire che usa bene i modi di dire di Python, che è naturale o mostra fluidità nel linguaggio. Allo stesso modo, dire di un'interfaccia o di una caratteristica del linguaggio che è pitonico significa dire che funziona bene con i modi di dire di Python, che il suo uso si adatta bene al resto del linguaggio.

Al contrario, un segno di codice non pitonico è che tenta di scrivere codice C ++ (o Lisp, Perl o Java) in Python, ovvero fornisce una trascrizione approssimativa piuttosto che una traduzione idiomatica di forme da un'altra lingua. Il concetto di pitonicità è strettamente legato alla filosofia minimalista di leggibilità di Python ed evita l'approccio "c'è più di un modo per farlo". Il codice illeggibile o modi di dire incomprensibili non sono ritonici.

Ho scoperto che più volte, più esempi "pythonic" sono in realtà derivati ​​da persone che cercano di essere intelligenti con i modi di dire di Python e (ancora, più volte che no) di rendere il loro codice praticamente illeggibile (che non è Pythonic).

Fintanto che ti attieni agli idiomi di Python ed eviti di provare a usare gli stili C ++ (o altri linguaggi) in Python, allora sei Pythonic.

Come sottolineato da WorldEngineer, PEP8 è un buon standard da seguire (e se usi VIM, ci sono plugin disponibili per la linting di PEP8).


Davvero, alla fine, se la tua soluzione funziona e non è assolutamente orribilmente inammissibile e lenta, a chi importa? Più volte, il tuo compito è quello di portare a termine un'attività, non di scrivere il codice pitone più elegante possibile.


Un'altra nota a margine (solo la mia opinione, sentiti libero di sottovalutare a causa sua;)): ho anche trovato la comunità Python piena di un sacco di ego (non che la maggior parte delle comunità non lo sia , è solo un po 'più diffusa in comunità come C e Python). Quindi, combinando l'ego con interpretazioni errate dell'essere "pitonico" tenderà a produrre un sacco di negatività priva di fondamento. Prendi ciò che leggi dagli altri con un granello di sale. Attenersi agli standard e alla documentazione ufficiali e andrà tutto bene.


2
+1 per una bella risposta (tranne per la citazione da quando l'ho usata nell'OP).

Ugh .. Dovrei rileggere il PO prima di pubblicare la citazione: P
Demian Brecht,

3
Piuttosto, esiste un'alta correlazione tra l'ego e l'essere online online, esprimendo opinioni in qualsiasi comunità. Fondamentalmente non vedi così tanto le persone non egoiste perché non scrivono molto in primo luogo.
Isarandi,

17

Pythonic deve codificare in modo idiomatico in Python. Significa usare strutture e formattazioni che funzionano bene per Python dal punto di vista della programmazione ma anche dal punto di vista della lettura della comunità. È molto simile al modo in cui K&R ha fissato lo standard per lo stile di programmazione C per lungo tempo. Questa guida mostra che devi codificare in modo idiomatico in Python. PEP 8 è indicato in quella guida, quindi probabilmente vale la pena leggerlo.


1
@MattFenwick Non è il 90% di ciò che riguarda la programmazione? I bravi programmatori passano molto tempo a leggere il codice e, in quanto tempo, scrivono molto codice. Più codice Pythonic leggi e più scrivi in ​​Python, più Pythonic sarà il tuo codice. Non credo che ci siano scorciatoie qui.
Kris Harper,

2
Link eccellente !
Ethan Furman,

13

Scrivere il codice "Pythonic" IMHO sta semplicemente facendo un uso efficace delle funzioni (V) HLL fornite dal linguaggio. Come esempio onnipresente,

x, y = 7, 'fuhrer'

Questo è molto Pythonic. Ricordo quando ho iniziato a studiare C # dopo mesi di solo Python,

int x, y = 10, z;

in qualche modo mi ha confuso, ma mi ci è voluto un minuto per tornare alle mie radici C / C ++.

Un altro modo Pythonic sta usando lambdas.

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

verrà effettivamente stampato lin ordine decrescente.

Poi c'è la "dattilografia" molto usata, ma molto meno compresa - Se cammina e parla come un'anatra, la tratti come un'anatra. Ciò è vagamente correlato alle interfacce in altri linguaggi OO.

Anche l'uso di metodi di programmazione funzionale, ove applicabile, come l'uso di map e ridurre, sono considerati pitonici.

Ho visto pubblicare una risposta mentre scrivevo e contiene un bel link. PS: Non è che la tua conoscenza di Python sia limitata. Posso scommettere che Python non è stata la tua prima lingua e, quindi, (come la maggior parte di noi pitonisti) dovrai imparare a diventare "idiomatico" con il serpente! Saluti!


Non ho incluso il link in quanto era già stato pubblicato mentre scrivevo - Risposta di WorldEngineer :) Pensa solo a "sfruttare" le funzionalità del linguaggio per il tuo e quello degli altri, e avrai Pythonic sulla strada, e per favore segui quel collegamento
yati sagade il

4
In realtà, molti pacifico che map, reduce, lambdae tali sono idiomatica per sé. La comprensione dell'elenco e l'espressione del generatore sono un'alternativa e molti li preferiscono ogni volta che è ragionevolmente possibile (in particolare, sono meno rumorosi quando avresti comunque bisogno di una lambda). Certamente hanno i loro usi e programmi di programmazione funzionale in altri modi di dire (decoratore per esempio).

@delnan è d'accordo - e ancora di più quando si tratta di Python 3. La conclusione è che le caratteristiche funzionali dovrebbero essere usate esattamente dove richiesto. E questo (c'è solo un modo ovvio di farlo) è idiomatico :)
yati sagade,

Personalmente, non ho mai capito le preferenze delle persone per il tuo primo esempio. Questo è molto più facile da analizzare mentalmente (che è lo Zen di Python, il codice viene letto più spesso di quanto sia scritto): (x, y) = (7, 'fuhrer')- eppure sono quasi sempre "corretto" che senza parentesi è il modo migliore per scriverlo!
Izkata,

2
Direi che il tuo esempio di ordinamento specifico non è pitonico. Perché reintrodurre il riordino con un lambda se puoi print(sorted(l, reverse=True)), cosa che dice esplicitamente al lettore cosa sta succedendo. Troverei anche discutibile il tuo primo esempio. Sono due incarichi compressi in uno; va bene, ma non lo definirei molto Pythonic. I lettori devono guardare più a lungo rispetto a quello che hanno due compiti.
phresnel,

7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Il codice Pythonic è:

  • Leggibile
  • Semplice (il più semplice possibile, ma non più semplice)
  • Ben pensato

1
+1. Lo Zen di Python è più importante per scrivere codice pitonico che seguire un elenco di idiomi; quest'ultimo non coprirà tutte le circostanze.
Doval,

6

Ogni volta che ho provato ad imparare una nuova lingua, ho scoperto che leggere il codice da persone che conoscono la lingua come il palmo della loro mano, alzare lo sguardo / chiedere qualcosa che sembra strano, e quindi provare a imitare il loro stile è il cosa migliore da fare. Esempi:

In Python, dato che siamo sull'argomento, ho trovato gli esempi di Dive Into Python incredibilmente utili per iniziare. Tendono a insegnare non solo le basi di Python, ma enfatizzare davvero il Python idiomatico .

Apprendendo D, poiché la documentazione non era eccezionale all'epoca perché la lingua era così all'avanguardia, ho imparato leggendo il codice nella biblioteca standard, in particolare alcuni dei capolavori di Andrei Alexandrescu .

Durante l'apprendimento del C ++ ho ereditato una base di codice da un programmatore C ++ piuttosto buono e ho imparato molto sulla programmazione idiomatica del C ++ dalla sua insistenza sul passaggio di contenitori STL per riferimento, ecc.

In tutte le lingue, trovo utile sfogliare le domande StackOverflow sulla lingua e vedere cosa fanno generalmente le persone per realizzare le cose di base.


+1 Una volta che conosci le basi di una lingua, leggere il codice ti aiuterà molto di più che leggere libri.
Pace,

3

Python non è Java potrebbe darti qualche consiglio utile. Non posso dire di più senza sapere che tipo di problemi stai riscontrando, ma è un consiglio molto concreto per i programmatori che provengono da un'altra lingua (in questo caso specificamente Java) su come fare Python in modo diverso.


2

Qualcuno ha detto di parafrasare, per imparare cos'è Pythonic, basterà estrarre del codice. Non sono d'accordo con quello. Se ti piace scrivere codice altamente denso, questo non lo rende più Pythonic.

Un modo per aiutarti a definire cos'è Pythonic per quanto ti riguarda, chiediti "Perché dovrei (intendendo te) usare il linguaggio Python?" Cosa ti piace di questo?

Per me è leggibilità e mancanza di compilazione e open source (praticamente tutto). Posso scaricare tonnellate di librerie e leggere il loro codice sorgente con meno stress sulle licenze rispetto a molte altre lingue.

Per me Python è bellissimo visivamente. Guido (il creatore di Python) continua a provare anche a me, attraverso le sue risposte in PEPS e discussioni) che le sue scelte su come ha fatto il linguaggio sono superiori alle mie idee su come avrebbe dovuto essere creato.

Per me, un grande programmatore è qualcuno con abilità decisionali molto informate su quale strada fare durante la programmazione. Per me, Python aiuta a fare rapidamente quelle scelte.

Semplificando la sintassi del codice sorgente consentendo la tipizzazione duck invece del tipo esplicito casting e l'aspettativa che i programmatori che revisionano il tuo codice "dovrebbero essere programmatori ben educati" porta a qualcosa che anche io chiamo "Pythonic"

Quindi ci sono due lati di ciò che è Pythonic. Uno è sintattico, l'altro è la pratica di. Come spiegare il lato più profondo di ciò che è "Pythonic" ..?

In Python non è un grosso problema farlo: alist = ['one', 'two', 'three \ n'] alist.append ((1234, 'Atuple'))

e la tupla verrà aggiunta all'elenco senza alcuna preoccupazione per i tipi di oggetto. La parte Pythonic non è che PUOI farlo, ma che il tuo codice dovrebbe ASPETTARLO e semplicemente funzionare / adattare.

Qualunque cosa funzioni sull'oggetto -alist-dovrebbe essere scritta con l'idea che un altro programmatore potrebbe entrare e aggiungere una non stringa all'elenco e che l'adattamento del codice sorgente da parte del nuovo programmatore non dovrebbe essere difficile da fare. Questo è il vantaggio di ducktype dopo tutto.


-2

Acquista un libro raccomandato. Leggilo. Dovrebbe darti una buona base per usare la lingua e un meccanismo che dovrebbe soddisfare lo stile della comunità

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.