2009-02-19 30 views
15

Sono in procinto di imparare Python mentre implemento script di compilazione e così via. E per il momento tutto funziona bene in quanto gli script fanno ciò che devono fare. Ma continuo ad avere la sensazione che mi manchi qualcosa, come "The Python Way". So che gli script di compilazione e gli script di colla non sono in realtà il lavoro di sviluppo più eccitante e difficilmente possono essere un candidato per rivelare il vero potere di Python, ma mi piacerebbe comunque avere l'opportunità di avere la mente gonfia. Sviluppo principalmente in C# e trovo che il mio codice Python abbia un aspetto terribilmente simile in struttura e stile a gran parte del mio codice C#. In altre parole, mi sembra di pensare in C# ma di scrivere in Python.Python: Mi manca qualcosa?

Mi manca davvero qualcosa?

(Nota: Mi rendo conto che non è tanto una questione di programmazione ed è abbastanza ampio e non ci può essere una risposta definitiva così mi mod giù nel dimenticatoio se si deve.)

+0

Per la tua nota, questo potrebbe essere più adatto a una comunità di discussione wiki ... –

risposta

35

Si consiglia di leggere su Generators, Iterators, itertools e soprattutto List Comprehensions.

Questi sono i pilastri di qualsiasi cosa Pythonic. E per tutto il resto, c'è PEP-8.

Leggi questi concetti e prova a utilizzarli laddove appropriato. Ti auguro il meglio!

PS: Non dimenticare di import this;)

Addendum: Vorrei anche aggregare alcuni ottimi suggerimenti dati da altri in questo thread qui:

+0

La combinazione di generatori e di list comprehensions sembra fantastica. Penso che ne userò di più. Grazie. :) –

+1

itertools è un ottimo modulo per fare le cose in modo elegante. è spesso dimenticato. –

+3

Non dimenticare, python era già un linguaggio molto utile prima dell'esistenza di generatori, iteratori, itertools, list comprehensions, o anche PEPS! –

16

No - questo è comune per le persone che si spostano su Python da altre lingue simili a C. Credo che quello che stai cercando sia un modo per rendere il tuo codice più "Pythonic". La buona notizia è che più Python scrivi più Pythonic diventerà il tuo codice. È un trabocco naturale del "come posso fare questo più semplicemente" atteggiamento.

Un altro buon posto per guardare è The Zen of Python. Questi atteggiamenti verso lo sviluppo di Python ti aiuteranno anche nello stesso senso.

+0

Grazie per il link "Pythonic". Mi ha dato un'idea migliore di cosa sparare per ora. –

+0

Il collegamento "Pythonic" è rotto! – alexpinho98

3

Per aggiungere alle risposte di Andrew Hare e Baishampayan Ghose ...

Per ulteriori l'idioma di qualsiasi lingua deve implicare la lettura di un codice scritto in quell'idioma. Sto ancora imparando l'idioma di Python, ma ne ho parlato con altre lingue. Riesco a leggere le descrizioni delle liste, ma la lampadina si accende solo quando vedi queste cose in uso e dici "Wow! È fantastico! Due righe di codice ed è cristallino!" Quindi vai a cercare un codice pitone che trovi interessante e inizia a leggerlo e comprenderlo. La conoscenza rimarrà nella tua testa meglio se vedi tutto nel contesto di un programma di lavoro.

5

Recentemente ho imparato/migliorando il mio python risolvendo i problemi the Project Euler in python. Questo ha funzionato molto bene per me, perché:

  1. E 'divertente e competitivo, quindi sono motivati ​​ad andare avanti
  2. mi costringe a utilizzare le strutture dati Python in un modo davvero naturale per ottenere le prestazioni Ho bisogno, quindi mi ha insegnato molto su elenchi, set, stringhe, iterazione ecc.
  3. La maggior parte dei problemi richiede meno di una pagina di codice da risolvere, quindi hai più tempo per pensare a lucidare o riscrivere in un altro elegante modo
  4. Python si adatta facilmente con grandi numeri interi, e quindi sembra proprio il linguaggio giusto per usare

Lo consiglio vivamente.

+0

Ho anche imparato molto a fare alcuni dei problemi di Project Euler in Python. Soprattutto gli aspetti di programmazione funzionale di Python usando i builtin e il modulo itertools. –

1

Mentre gli script di compilazione e gli script di indizio [sic] non sono davvero il lavoro di sviluppo più eccitante, sono completamente candidati per rivelare il vero potere di Python.

Per prima cosa, guarda i vari strumenti di make-like già scritti in Python.

Il grande pesce in questo stagno è Scons: http://www.scons.org/. Scopri questo.

questo post del blog parla delle alternative http://farmdev.com/thoughts/46/the-python-make-tool/

"mi piace ancora la possibilità di avere la mia mente soffiato" Start con Google: trovare strumenti Python che già fanno alcuni o tutti di ciò che si sta cercando di fare. Codice in meno, scarica e leggi di più.

+0

[Fabric] (http: // fabfile) è un altro strumento ispirato al trucco (incentrato sull'esecuzione remota piuttosto che sulla costruzione) con un design molto Pythonic. –

5

Stai leggendo Python che non hai scritto?

Ecco uno script dalla distribuzione Python 2.6.1 che elimina i file .pyc e .pyo.

#!/usr/local/bin/python 
"""Recursively zap all .pyc and .pyo files""" 
import os 
import sys 

# set doit true to actually delete files 
# set doit false to just print what would be deleted 
doit = 1 

def main(): 
    if not sys.argv[1:]: 
     if os.name == 'mac': 
      import EasyDialogs 
      dir = EasyDialogs.AskFolder(message='Directory to zap pyc files in') 
      if not dir: 
       sys.exit(0) 
      zappyc(dir) 
     else: 
      print 'Usage: zappyc dir ...' 
      sys.exit(1) 
    for dir in sys.argv[1:]: 
     zappyc(dir) 

def zappyc(dir): 
    os.path.walk(dir, walker, None) 

def walker(dummy, top, names): 
    for name in names: 
     if name[-4:] in ('.pyc', '.pyo'): 
      path = os.path.join(top, name) 
      print 'Zapping', path 
      if doit: 
       os.unlink(path) 

if __name__ == '__main__': 
    main() 

Quanti idiomi Python riesci a trovare in questo?

+1

Quattro. Naturalmente, ho individuato anche un paio di anti-idiomi. ;-) –

6

Si dovrebbe dare un'occhiata a questo discorso, quando si inizia a fare la programmazione di sistemi con Python: http://www.dabeaz.com/generators/

+0

Oh wow, questa è una bella cosa quei generatori! –

0

vorrei suggerire trovare un pitone guru personale. Mostra loro parte del tuo codice e invitali a rivederlo/riscriverlo in Python idiomatico. Così sarai illuminato?

0

Per richiamare TLHOLADAY, leggere la libreria standard. Ecco dove si trova la roba "pitonica". Se non ti senti bene, leggi la fonte di sqlachemy o django o il tuo progetto preferito.

2

Scrivi un po 'di codice Python e pubblicalo su SO per la revisione e il feedback se è pitonico.

4

pensare come questo:

  • Se si sta scrivendo troppo per poco lavoro, qualcosa non va, questo non è divinatorio.

La maggior parte del codice Python che scriverai è molto semplice e diretto. Di solito non hai bisogno di molto lavoro per qualcosa di semplice. Se stai scrivendo troppo, fermati e pensa se c'è un modo migliore. (ed è così che ho imparato molte cose in Python!)

1

A parte roba come Generatori, Iteratori, Comprensioni delle liste ecc. menzionate da altre persone qui, vorrei suggerire un paio di concetti in più che ritengo aggiungano valore a qualcuno che tenta di fare le cose in modo "pitonico". Questi sono Decoratori e Meta Classes.

Per decoratori, la risposta stackoverflow this è altamente consigliata e per le classi Meta è possibile passare attraverso this.

+0

Sappiate che molti considerano le metaclassi eccessivamente ingegnerizzate e oggigiorno (2.6+) i decoratori di classe forniscono soluzioni più pitiose per la maggior parte dei casi di utilizzo di metaclassi. Tuttavia, è bello capire che l'istruzione 'class' esegue semplicemente il suo corpo in un nuovo spazio dei nomi e passa il risultato a' type (name, bases, content_dict) '- fa parte di" I Namespace sono una delle grandi idee ". –

2

Studio di API/strutture pythonic ben progettati. Alcuni dei migliori vivono al di fuori della libreria standard. Nota quello che ti permettono di non fare. I miei preferiti:

  • py.test è più divinatorio di unittest (che era basato su JUnit). Basta scrivere la funzione test_foo() anziché una classe che eredita da unittest.TestCase. Basta fare assert x == y anziché self.assertEqual(x, y). Molte altre prelibatezze ...

    • Doctest è anche più pitone di unittest. Molti rinunciano a causa di alcuni fastidi pratici, ma l'idea è brillante.

    • Se ci si immerge profondamente nel test, l'approccio di asserzione del modulo mock è più Pythonic di record di librerie concorrenti -> replay paradigm.

  • requests è uno dei più puliti API che abbia mai visto, il modo migliore di httplib + urllib + urllib2.

  • JSON e YAML sono più pitoni than XML.

    • JSON-RPC è più divinatorio di XMLRPC o brivido SOAP.

    • ElementTree è molto più pythonic API di DOM. Ottimizzando per i tag che hanno sia .text che per i bambini, si riduce l'XML < -> mancata corrispondenza dell'impedenza delle strutture dati (ma si può ancora fare il round-trip di contenuti misti tramite l'hack .tail).

  • Scapy è un quadro straordinariamente terso per l'invio e sezionare i pacchetti di rete.

  • Credo che lo Storm sia la più oggettivista mappatura relazionale oggettuale là fuori. Disclaimer: non ho quasi nessuna esperienza con gli ORM.

  • heapq è un modulo ben implementato. Basta leggere il codice.

  • itertools è molto potente. Leggi tutti gli esempi nella documentazione.
    opinioni variano se usarlo estesamente è divinatorio o un dialetto strano :-)

leggere "ciò che c'è di nuovo in Python", almeno per quanto riguarda l'ultima versione che si sta utilizzando. Leggi alcuni PEP. Capire perché le modifiche sono un miglioramento.

Infine, assicurati di sfruttare al meglio Python interattivo. Il modo migliore per imparare le API è provarle e vedere cosa succede! La modifica multi-linea, il completamento e l'accesso facile() sono caratteristiche indispensabili: controlla ipython (incluso il notebook!), Dreampie, bpython.

0

import this

Se è possibile inserire il codice accanto al Zen di Python e sentirsi bene su di esso si è a metà strada. Anche controlla il modulo this.py: un po 'di ironia.

L'altra metà è l'apprendimento di cose come: espressioni regolari, di lista, generatori, meta-classi, argomento disimballaggio, decoratori, elenco passo, 'con 'istruzione, assegnazione condizionale, built-in potenti come enumerate(), mappa(), zip(), ridurre(), qualsiasi() e pow(), e molti altri (controllare Hidden features of Python per più)

Lungo il percorso si può leggere altro codice della gente e modificarlo.

Finnaly: Informazioni sui finally e import antigravity

Problemi correlati