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.