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.