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


38

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

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

Esta pergunta no StackOverflow está 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 para Python.

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

Portanto, o cerne da minha pergunta é: quais conceitos um desenvolvedor Java realmente precisa aprender a pensar em Pythonic? Isso inclui tudo o que precisa ser desaprendido.

Nota: Estou perguntando sobre conceitos de linguagem, não sobre sintaxe de linguagem.


9
Deixe de lado a ideia de que a programação deve ser difícil.

Respostas:


40

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

  • Python é dinâmico. A criação de uma classe é uma instrução executável , assim 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 fácil metaprogramação e AOP.

  • Não há interfaces; regras de digitação de pato. Se você precisar deles desesperadamente, existem 'classes básicas abstratas (ABCs)', mas geralmente você não perde as interfaces, pois 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ê-las e atribuir a variáveis ​​é a norma. O mesmo vale 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, distribuí-lo etc.

  • Use ditados, conjuntos, listas e tuplas embutidos. Listas e ditados são mutáveis, tuplas nã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 dictos ('hashtables'), simplificando a vida.

  • O Python tem um bom suporte de FP; aprenda a compreensão da lista e, em seguida, iteradores e geradores. Isso ajuda muito.

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

  • Não há 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 em um NPE, às vezes mais abaixo no pipeline de execução.

  • Devido à natureza totalmente dinâmica do Python, você quase não tem verificações estáticas . Você pode se referir a um nome que nunca existe no seu programa (por exemplo, um erro de digitação) ou apenas é 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 de unidade.

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

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

  • Os threads do Python são bons para processamento vinculado à E / S, mas não para CPU. Não tente acelerar uma tarefa computacional executando-a em threads paralelos.


+1 pontos muito bons. Nitpicking: Nonegeralmente causa AttributeError(mas não importa, você geralmente não precisa disso) e pode (e em alguns casos deve) escrever objetos imutáveis ​​(por exemplo, através namedtuple).

@danlan: obrigado, corrigi o texto :) Sim, você pode criar objetos imutáveis. Mas os objetos que você geralmente cria criando uma classe regular e, em seguida, instâncias dela são muito mutáveis, a menos que você tome várias medidas especiais. O fato de a atribuição a um atributo de instância indefinido geralmente o definir silenciosamente, em vez de causar um erro, pode ser uma surpresa para um programador Java.
9000

1
Python (e outras linguagens FP) substitui uma compilação de código mais detalhada de blocos de construção mais simples por compilação de código compacta em blocos de construção mais complexos. Pense nos processadores RISC vs CISC.
Paul

1
Eu adicionaria conjuntos às estruturas de dados.
sakisk 19/09/12

2
Há pouco mais de três anos desde que fiz essa pergunta. Devo dizer que este conselho se levantou muito bem.
LRE 31/03

14

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


6
"XML não é a resposta." - que vai muito além Java v Python ;-)
LRE

3

Mudei de Java para Python e uma das coisas mais úteis que encontrei foi poder testar o código do interpretador de linha de comando. Digite python na linha de comando e execute seu código a partir daí até acertar.

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


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 associação de nomes vs 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 recebeu primeiro uma sequência de caracteres e depois um objeto de tempo. E, ao longo de tudo, a instância do trabalho e até a própria classe podem ser alteradas dinamicamente.


1

Você também pode dar uma olhada no Jython . Ele pode suportar apenas o Python 2.5, mas achamos realmente poderoso poder prototipar rapidamente com o Python e depois reescrever em Java mais tarde, se necessário.

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.