Java dev learning Python: quali concetti ho bisogno di avvolgere la mia mente?

38

Background: ho eseguito alcuni tutorial e scritto alcuni piccoli progetti. Tutto sta andando abbastanza bene con Google e StackOverflow .

Diverse volte negli ultimi giorni mi sono ritrovato a chiedermi "cosa mi manca?" - Sento che sto ancora pensando in Java mentre scrivo in Python.

Questa domanda su StackOverflow è piena di suggerimenti su quali risorse leggere per imparare Python, ma sento ancora di essere uno sviluppatore Java con un dizionario (non è un gioco di parole) da tradurre in Python.

Quello che voglio veramente è rifattorizzare la mia testa per poter scrivere Python Python invece che Java mascherato come Python, senza perdere neanche le mie capacità Java.

Quindi, il punto cruciale della mia domanda è: quali concetti ha realmente bisogno di un Java per imparare a pensare Pythonic? Ciò include tutto ciò che deve essere disimparato.

Nota: sto chiedendo informazioni sui concetti linguistici, non sulla sintassi del linguaggio.

    
posta LRE 13.02.2011 - 10:21
fonte

5 risposte

40

Alcuni punti in aggiunta a quanto già detto:

  • Python è dinamico. La creazione di una classe è un'istruzione eseguibile , come l'importazione di un modulo; può essere reso condizionale. Una classe può essere modificata dopo la creazione; questo consente una facile metaprogrammazione e AOP.

  • Ci sono le regole di battitura di anatra no interfaces; . Se hai un disperato bisogno di loro, ci sono "astratte classi di base (ABCs)", ma di solito non ti mancano le interfacce, dato che non c'è comunque alcun tipo di controllo statico.

  • Sebbene tutto sia un oggetto, le funzioni vengono prima degli oggetti. Avere solo funzioni (e nessuna classe) in un modulo va perfettamente bene.

  • Tutto è un'entità di prima classe. Passare le funzioni come parametri, restituirle e assegnarle alle variabili è la norma. Idem per le classi. I metodi sono solo funzioni; puoi gestire un metodo di istanza come se fosse una funzione normale, passarlo in giro, ecc.

  • Usa dict, set, elenchi e tuple integrati. Le liste e le dicts sono mutabili, le tuple no. Tutti sono molto efficienti e sintatticamente succinti. Abituati a restituire diversi valori da una funzione usando una tupla (non hai nemmeno bisogno di parentesi). Abituati a sostituire gerarchie complesse di oggetti molto semplici con aggeggi composti da liste semplici, tuple e dict ("hashtables"), semplifica la vita.

  • Python ha un bel po 'di supporto per FP; imparare le comprensioni delle liste e quindi gli iteratori e i generatori. Questi aiutano molto.

  • Qualsiasi operatore può essere sovraccaricato definendo i metodi corretti, quindi l'aggiunta o il confronto possono restituire ciò che si desidera. Ricorda che funziona con cose come SQLAlchemy.

  • Non c'è nulla, solo None, un oggetto a tutti gli effetti. È possibile stampare Nessuno bene, ecc. Passando Nessuno dove ci si aspetta un'altra istanza, solitamente si verifica un errore AttributeError, non un NPE, a volte più in basso nella pipeline di esecuzione.

  • A causa della natura completamente dinamica di Python, hai quasi nessun controllo statico . Puoi fare riferimento a un nome che non esiste mai nel tuo programma (ad esempio un errore di battitura) o che viene definito solo in un particolare percorso di esecuzione e nulla ti ricorderà finché l'esecuzione non raggiunge effettivamente questo riferimento e viene sollevata un'eccezione NameError. Fai attenzione con l'ambito delle tue variabili e scrivi più test unitari.

  • A causa della natura completamente dinamica di Python, gli oggetti sono quasi sempre malleabili. Di solito è possibile aggiungere campi e metodi anche a un'istanza e quindi inavvertitamente eliminare o sovrascrivere il proprio stato o set di metodi. Stai attento ad assegnare gli attributi. Ciò consente anche interessanti possibilità:)

  • Ci sono nessuna costante simbolica , solo variabili. Verifica di non sovrascrivere inavvertitamente una 'costante'. Se vuoi essere sicuro di non poter sovrascrivere una costante, usa una funzione o una proprietà (che è una funzione in incognito).

  • I thread di Python sono validi per l'elaborazione legata agli I / O, ma non per i limiti della CPU. Non provare a velocizzare un'attività computazionale eseguendola in thread paralleli.

risposta data 14.02.2011 - 02:37
fonte
14

Leggi questo articolo: Python non è Java . (Inoltre la maggior parte degli altri articoli nella barra laterale vale la pena di leggerli, anche se non relativi a Java.) L'articolo fornisce alcuni importanti suggerimenti su come i programmatori Java possono usare inavvertitamente male Python (e come non farlo).

    
risposta data 13.02.2011 - 21:33
fonte
3

Mi sono trasferito da Java a Python e una delle cose più utili che ho trovato è stata la possibilità di testare il codice dall'interprete della riga di comando. Digita python nella riga di comando ed esegui il codice da lì finché non lo ottieni correttamente.

Anche i framework erano un po 'meno definiti in Python. Ci sono 10 di frame Web funziona solo per i principianti. Django sostituisce più o meno Spring e SQL Alchemy per Hibernate.

    
risposta data 13.02.2011 - 14:20
fonte
2

Una cosa importante sarebbe capire la tipizzazione dinamica; un altro è che gli oggetti sono mutevoli e pubblici. Meno importante, almeno inizialmente, è il nome vincolante rispetto alle variabili.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

Qui, myjobtitle e il valore di job.title puntano allo stesso oggetto. All'attributo di classe job.startDate è stata prima assegnata una stringa, quindi a un oggetto orario. E attraverso tutto questo, l'istanza di lavoro e persino la classe stessa potrebbero essere cambiati dinamicamente.

    
risposta data 13.02.2011 - 13:25
fonte
1

Potresti anche dare un'occhiata a Jython . Può supportare solo Python 2.5, ma troviamo molto potente poter prototipare rapidamente con Python e poi riscriverlo in Java se necessario.

Basato sulla mia risposta a A cosa dovrei pensare quando si passa da Python a Java? come quella domanda è stata chiusa come duplicato di questo!

    
risposta data 30.03.2012 - 15:43
fonte

Leggi altre domande sui tag