Dev Java che impara Python: quali concetti ho bisogno per avvolgere la testa?


38

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

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

Questa domanda su StackOverflow è piena di suggerimenti su quali risorse leggere per l'apprendimento di Python, ma sento ancora che sono uno sviluppatore Java con un dizionario (nessun gioco di parole inteso) da tradurre in Python.

Quello che voglio davvero fare è refactorizzare la mia testa per poter scrivere Pythonic Python invece di Java travestito da Python, senza perdere neanche le mie abilità Java.

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

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


9
Lascia andare l'idea che la programmazione dovrebbe essere difficile.
Giobbe

Risposte:


40

Alcuni punti oltre a quanto già detto:

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

  • Non ci sono interfacce; regole di battitura delle anatre. Se ne hai disperatamente bisogno, ci sono "classi di base astratte (ABC)", ma di solito non perdi le interfacce, dal momento che non esiste alcun controllo statico del tipo.

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

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

  • Usa dadi, set, liste e tuple incorporati. Le liste e le parole 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). Abituarsi a sostituire complesse gerarchie di oggetti molto semplici con aggeggi costituiti da semplici elenchi, tuple e dadi ("hashtables"), semplifica la vita.

  • Python ha un bel po 'di supporto FP; imparare la comprensione dell'elenco e quindi iteratori e generatori. Questi aiutano molto.

  • Qualsiasi operatore può essere sovraccaricato definendo metodi adeguati, quindi l'aggiunta o il confronto possono restituire quello che vuoi. Ricorda che hai lavorato con cose come SQLAlchemy.

  • Non c'è null, solo None, un oggetto a tutti gli effetti. È possibile stampare Nessuno semplicemente bene, ecc. Passando Nessuno dove è prevista un'altra istanza, si ottiene di solito un AttributeError, non un NPE, a volte più in basso nella pipeline di esecuzione.

  • A causa della natura completamente dinamica di Python, non hai quasi alcun controllo statico . Puoi fare riferimento a un nome che non esiste mai nel tuo programma (ad esempio un refuso), o viene definito solo in un particolare percorso di esecuzione, e nulla ti ricorderà fino a quando l'esecuzione non raggiunge effettivamente questo riferimento e viene generato un NameError. Fai attenzione all'ambito delle tue variabili e scrivi più unit test.

  • 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 cancellare o sovrascrivere inavvertitamente il suo stato o set di metodi. Fare attenzione ad assegnare gli attributi. Ciò consente anche interessanti possibilità :)

  • Non ci sono costanti simboliche , 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 mascherata).

  • I thread di Python sono utili per l'elaborazione associata a I / O, ma non per la CPU. Non tentare di velocizzare un'attività computazionale eseguendola in thread paralleli.


+1 punti molto buoni. Nitpicking: di Nonesolito causa AttributeError(ma non importa, di solito non ne hai bisogno comunque) e puoi (e in alcuni casi dovresti) scrivere oggetti immutabili (ad esempio attraverso namedtuple).

@danlan: grazie, ho corretto il testo :) Sì, puoi creare oggetti immutabili. Ma gli oggetti che generalmente crei creando una classe normale e quindi le sue istanze sono molto mutabili, a meno che tu non prenda una serie di misure speciali. Il fatto che l'assegnazione a un attributo di istanza non definito di solito lo definisca in silenzio invece di causare un errore può essere una sorpresa per un programmatore Java.
9000

1
Python (e altri linguaggi FP) sostituisce la generazione di codice più dettagliata di blocchi di costruzione più semplici con la costruzione di codice compatto su blocchi di costruzione più complessi. Pensa ai processori RISC vs CISC.
Paul

1
Vorrei aggiungere set alle strutture di dati.
sakisk,

2
Poco più di 3 anni da quando ho posto questa domanda. Devo dire che questo consiglio si è alzato molto bene.
LRE

14

Leggi questo articolo: Python non è Java . (Inoltre, la maggior parte degli altri articoli nella barra laterale merita di essere letta, anche se non relativi a Java.) L'articolo fornisce alcuni ottimi suggerimenti su come i programmatori Java possano usare involontariamente Python (e come non farlo).


6
"XML non è la risposta." - che va ben oltre Java v Python ;-)
LRE

3

Mi sono trasferito da Java a Python e una delle cose più utili che ho scoperto è 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ì fino a quando non lo ottieni correttamente.

Anche i frame erano un po 'meno definiti in Python. Ci sono 10s di opere web frame solo per i principianti. Django sostituisce più o meno l'alchimia di Spring e SQL per Hibernate.


2

Una cosa importante sarebbe capire la digitazione dinamica; un altro è che gli oggetti sono mutabili e pubblici. Meno importante, almeno inizialmente, è l'associazione dei nomi 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 time. E attraverso tutto, l'istanza di lavoro e persino la classe stessa potrebbero essere cambiati in modo dinamico.


1

Potresti anche dare un'occhiata a Jython . Può supportare solo Python 2.5, ma troviamo davvero potente essere in grado di accelerare il prototipo con Python e poi riscrivere in Java in seguito, se necessario.

Sulla base della mia risposta a Cosa dovrei pensare quando si passa da Python a Java? poiché quella domanda ora è stata chiusa come duplicata di questa!

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.