Java dev learning Python: quais conceitos eu preciso para entender?

38

Antecedentes: Eu fiz alguns tutoriais e escrevi alguns pequenos projetos. Tudo está indo bem o suficiente usando o Google e o StackOverflow .

Várias vezes nos últimos dias, me vi pensando "o que estou perdendo?" - Eu sinto que ainda estou pensando em Java enquanto escrevo em Python.

Esta pergunta no StackOverflow é cheia de dicas sobre quais recursos ler para aprender Python, mas ainda sinto que sou um desenvolvedor Java com um dicionário (sem trocadilhos) para traduzir em Python.

O que eu realmente quero fazer é refatorar minha cabeça para poder escrever Python Python em vez de Java disfarçado como Python, sem perder minhas habilidades em Java também.

Então, o ponto crucial da minha pergunta é: quais conceitos um desenvolvedor Java realmente precisa aprender a pensar Pythonic? Isso inclui tudo o que precisa ser desaprendido.

Observação: estou perguntando sobre conceitos de linguagem, não sobre a sintaxe da linguagem.

    
por LRE 13.02.2011 / 10:21
fonte

5 respostas

40

Alguns pontos além do que já foi dito:

  • O Python é dinâmico. A criação de uma classe é uma declaração executável , como é a importação de um módulo; isso pode ser feito condicional. Uma classe pode ser alterada após a criação; isso permite uma fácil metaprogramação e AOP.

  • Não há nenhuma interface; regras de digitação de pato. Se você precisa desesperadamente deles, existem 'classes básicas abstratas (ABCs)', mas geralmente você não perde interfaces, já que não há verificação de tipo estático de qualquer maneira.

  • Embora tudo seja um objeto, as funções vêm antes dos objetos. Ter apenas funções (e nenhuma classe) em um módulo é perfeitamente adequado.

  • Tudo é uma entidade de primeira classe. Passar funções como parâmetros, devolvê-los e atribuir variáveis é a norma. Idem para as aulas. Métodos são apenas funções; você pode manipular um método de instância como se fosse uma função regular, passá-lo, etc.

  • Use ditados, conjuntos, listas e tuplas integrados. Listas e ditos são mutáveis, as tuplas não são. Todos eles são muito eficientes e sintaticamente sucintos. Acostume-se a retornar vários valores de uma função usando uma tupla (você nem precisa de parênteses). Acostume-se a substituir hierarquias complexas de objetos muito simples por engenhocas feitas de listas simples, tuplas e dicts ('hashtables'), isso simplifica a vida.

  • O Python tem um bom suporte FP; aprenda as compreensões da lista e depois iteradores e geradores. Isso ajuda muito.

  • Qualquer operador pode ser sobrecarregado definindo métodos apropriados, para que a adição ou comparação possa retornar o que você quiser. Lembre-se disso trabalhando com coisas como SQLAlchemy.

  • Não há nenhum nulo, apenas Nenhum, um objeto completo. Você pode imprimir Nenhum muito bem, etc. Passando Nenhum onde outra instância é esperada resulta geralmente em um AttributeError, não um NPE, às vezes mais abaixo no pipeline de execução.

  • Devido à natureza totalmente dinâmica do Python, você não tem quase nenhuma verificação estática . Você pode se referir a um nome que nunca existe em seu programa (por exemplo, um erro de digitação), ou somente será definido em um caminho de execução específico, e nada o lembrará até que a execução realmente atinja essa referência e um NameError seja gerado. Tenha cuidado com o escopo de suas variáveis e escreva mais testes unitários.

  • Devido à natureza totalmente dinâmica do Python, os objetos quase sempre são maleáveis. Normalmente, você pode adicionar campos e métodos a uma instância e, assim, excluir ou substituir inadvertidamente seu estado ou conjunto de métodos. Seja cuidadoso ao atribuir atributos. Isso também permite possibilidades interessantes:)

  • Não existem constantes simbólicas, apenas variáveis. Verifique se você não sobrescreve inadvertidamente uma 'constante'. Se você quiser ter certeza absoluta de que não pode sobrescrever uma constante, use uma função ou uma propriedade (que é uma função disfarçada).

  • Os encadeamentos do Python são bons para o processamento limitado por E / S, mas não para o limite da CPU. Não tente acelerar uma tarefa computacional executando-a em encadeamentos paralelos.

por 14.02.2011 / 02:37
fonte
14

Leia este artigo: Python não é Java . (Além disso, vale a pena ler a maioria dos outros artigos na barra lateral, embora não relacionados a Java.) O artigo fornece algumas ótimas dicas sobre como os programadores Java podem usar o Python de forma não intencional (e como não).

    
por 13.02.2011 / 21:33
fonte
3

Eu mudei de Java para Python e uma das coisas mais úteis que encontrei foi a capacidade de testar código a partir do interpretador de linha de comando. Digite python na linha de comando e execute seu código de lá até acertar.

Estruturas também foram um pouco menos definidas em Python. Existem 10s de web frame funciona apenas para iniciantes. O Django mais ou menos substitui o Spring e o SQL Alchemy pelo Hibernate.

    
por 13.02.2011 / 14:20
fonte
2

Uma coisa importante seria entender a digitação dinâmica; outra é que os objetos são mutáveis e públicos. Menos importante, pelo menos inicialmente, é a vinculação de nomes versus variáveis.

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

Aqui, myjobtitle e o valor de job.title apontam para o mesmo objeto. O atributo de classe job.startDate foi atribuído primeiro a uma string e, em seguida, a um objeto de hora. E por fora de tudo isso, a instância de trabalho e até mesmo a própria classe pode ser alterada dinamicamente.

    
por 13.02.2011 / 13:25
fonte
1

Você também pode querer dar uma olhada em Jython . Ele pode suportar apenas o Python 2.5, mas achamos realmente poderoso poder fazer um protótipo rápido com o Python e depois reescrever em Java mais tarde, se necessário.

Com base na minha resposta a O que devo pensar quando mudar de Python para Java? essa pergunta foi encerrada como uma duplicata desta!

    
por 30.03.2012 / 15:43
fonte