Para um cara Java, o Python é um campo de jogos anárquico, onde qualquer um pode agarrar um clube e começar a atacar sua cabeça.
Para um cara Python, Java é um universo orwelliano, onde você está constantemente acorrentado à visão cada vez menor de como o universo funciona.
A verdade é tudo o que você pode fazer em um idioma e no outro da mesma forma limpa. No entanto, como você mencionou, existem diferenças importantes na comunidade quanto ao que significa limpar .
Maneira Java:
Um sistema limpo é aquele que faz o que se destina e nada mais, não permitirá extensões ou modificações que vão contra a natureza do objetivo pretendido e tentará aplicá-las o máximo possível através do compilador. A flexibilidade é obtida através da criação cuidadosa de interfaces simples dentro de estruturas rígidas. No Java, a caixa de areia deve sempre ser claramente delimitada e ultrapassar esses limites com o rápido feedback do compilador. Java fornece meios para definir estaticamente estruturas de objetos e criar interações dinâmicas a partir de instâncias delas. Quando trabalho em Java, tento criar, de maneira inteligente, blocos de construção básicos para uma solução com morte cerebral. Eu trabalho de baixo para cima principalmente quando tenho uma teoria de trabalho sobre como lidar com o problema.
Java tenderá a produzir software grande que pode abranger grandes equipes e fornecer ferramentas e meios para manter o rebanho sob controle. Se mantido desmarcado, isso fará com que equipes muito desapegadas trabalhem de forma independente em direção a um objetivo cada vez mais incerto. Eventualmente, cada equipe se torna sua própria "raison d'être" e o sistema como um todo se dilui, desviando o projeto principal. Isso pode levar a extremos de custos extremos e a enormes sistemas de software com desempenho e manutenção ruins.
Quase nunca existe uma maneira rápida e fácil de fazer as coisas em Java, mas o IDE e as ferramentas estão lá para tornar tarefas difíceis a apenas alguns cliques.
Maneira Python:
Clean significa conciso e facilmente legível. Um bom sistema python foi projetado para permitir que você chegue ao âmago dele e exponha seus segredos mais íntimos de uma maneira que você possa entender a partir do código o uso e a finalidade pretendidos. Ele também permitirá que você projete sua própria solução estendendo e / ou encapsulando o design original para que ele siga exatamente na sua direção. O Python fornece meios para criar modelos de objetos a partir dos quais você pode alterar dinamicamente a instância para atender às necessidades em questão. Em python, costumo resolver o problema imediatamente e depois espalhar o código em uma estrutura lógica, para que a solução final permaneça o mais simples e legível possível. Em python, costumo trabalhar de cima para baixo e gerenciar as complexidades de aumento por meio de uma abordagem de dividir e conquistar.
As equipes de Python tendem a produzir sistemas leves e são muito rápidas na entrega de uma solução funcional. Eles tenderão a ser um grupo unido trabalhando de maneira intercambiável em qualquer parte do sistema, validando a solução um do outro a cada chance que tiverem. Eles se alimentam criando uma sinergia que é bastante emocionante. No entanto, isso cria equipes difíceis de escalar para sistemas maiores e geralmente atingem uma espécie de teto de vidro. A introdução de novos membros na equipe ajudará, mas levará algum tempo para que o conhecimento se espalhe o suficiente para que a produtividade extra seja sentida. A equipe então se divide e a visão geral constante de todo o sistema se dilui, assim como a atmosfera dos primeiros dias. Isso pode levar a códigos excessivamente complicados para o que antes era um problema simples,
Quase sempre existe uma maneira rápida e fácil de fazer as coisas com o Python, mas a complexidade pode ser mais difícil de controlar quando o sistema atinge um determinado limite.
Em suma, ambos têm um lado sombrio e ambos têm força clara. No entanto, ao insistir nas duas comunidades, você descobrirá que a força de uma leva ao lado sombrio da outra e vice-versa.
Daí os debates acalorados sobre qual é o melhor.
Bem, o Python não possui interfaces, possui metaclasses e permite a digitação de patos. O Python possui compreensão de lista, que é muito poderosa e não existe em Java. Java tem um sistema de tipo rico com muitas estruturas de dados e Python apenas possui listas. Portanto, se você está aproveitando o que o Python possui em vez de tentar recriar o que o Java possui no Python, provavelmente está escrevendo código Pythonic.
Mas, no que diz respeito ao código OO, existem certos princípios básicos de estilo que não devem mudar de idioma para idioma: você sempre deve escrever um código que seja tímido e seco, esteja você escrevendo em Applescript, Python, Java ou C ++.
----Editar----
Como o @delnan salienta, existem na verdade CINCO tipos de dados compostos definidos pelo Python no nível do Kernel (lista, dict, tuple, set e frozenset, de acordo com minha cópia do "Python in a Nutshell"). Embora isso seja verdade, não é realmente relevante ao ponto que estou tentando enfatizar: o Python se baseia em listas como a estrutura de dados essencial. Sim, você PODE usar uma lista como uma pilha, mas você pode usar exatamente a mesma lista que uma fila. E então uma pilha novamente.
Java, por outro lado, possui uma estrutura de dados do kernel (Array, de acordo com "O Java Pocket Guide), mas, em geral, você não pode fazer muito em Java sem importar coleções. Depois de fazer isso, você tem acesso para uma biblioteca de tipos 'rica' (nesse sentido, imensamente complexa) com a qual obter a mesma funcionalidade que você possuía na lista do Python.
Obviamente, ambas as linguagens têm classes e Java possui interfaces, mas, embora sejam tipos de dados compostos, elas não são realmente estruturas de dados no sentido de livros didáticos.
Uma diferença é que você não pode exibir um item de uma fila do Java e não pode passar um objeto da fila do Java para algum lugar que esteja esperando uma lista vinculada do Java. Então, talvez por "rico" eu realmente queira dizer "rígido".
Então, para explicar o que quero dizer com "Python apenas possui listas", o que quero dizer é que você pode fazer praticamente tudo o que precisa fazer em Python, o que faria com Java Collections usando o tipo Pythons List. Esse tipo único faz o trabalho de muitos tipos em Java.
O que isso significa para o programador Python? Isso significa que você pode alavancar o tipo Python List para escrever código direto muito conciso sem o uso de bibliotecas adicionais - e a concisão (isto é, a característica de transmitir mais valor em menos caracteres) é uma característica principal do código "Pythonic" .
fonte