Melhor resposta
Para entender os tipos de hash em python, você precisa entender o que é hashing e por que é usado. Portanto, aqui está uma breve visão geral do hashing:
Quando você faz o hash de um objeto, isso realmente significa que você o está executando por meio de alguma função. Essa função é chamada de função hash. O que essa função hash faz é fornecer uma saída exclusiva para uma entrada exclusiva. Por exemplo, digamos que temos uma função hash chamada hash e duas variáveis aeb tais que a! = B, então hash (a)! = Hash (b). Em teoria, de qualquer maneira. Na prática, você executará em uma colisão hash. Isso significa a! = B mas hash (a) == hash (b). Um exemplo seria se sua função hash for x mod 10, então hash (12) == hash (2). Existem algumas maneiras de lidar com isso.
Python usa isso para armazenar chaves em dicionários. A maneira como eles fazem isso é fazer o hash do objeto e, em seguida, mapear o hash para um índice em uma matriz e colocar o valor lá. Então, por exemplo, digamos que você queira armazenar “123” na chave “abc”. Digamos que o python inicializou uma matriz para um dicionário com 10. O que o python fará é hash (abc) e depois mod por 10 para colocá-lo em um dicionário. Digamos que o hash (abc) retorne 1234. O Python então modifica isso em 10 para obter 4. Ele então coloca “123” no índice 4.
Então, basicamente, um tipo hashble é apenas um tipo que pode ser hash. Você pode tornar uma função hashble substituindo \_\_hash\_\_ e \_\_eq\_\_ em python. Mas você deve ter cuidado para se certificar de que o hash retorna a mesma coisa sempre que obtém o mesmo objeto. Por exemplo, se você fizer \_\_hash\_\_ retornar um número aleatório toda vez que você chamá-lo, nunca mais encontrará seu objeto em um hashable. Ao mesmo tempo, você não deseja retornar a mesma coisa para todos os objetos, porque então você obterá muitos falsos positivos.
Claro que isso é um pouco mais complicado e extremamente breve visão geral, mas este é o básico por trás do hashing
Resposta
Esta é uma pergunta difícil (mas boa). Em inglês americano, a pergunta pode ser lida como “liste todas as coisas que a linguagem Python não pode fazer”. Isso é difícil (para mim) porque eu não sabia o suficiente para listar todos eles. A seguir, listei algumas das coisas que o Python não pode fazer. Leia todas as outras respostas para obter mais informações.
- Python não funciona para drivers de dispositivo. Os drivers de dispositivo devem ser super rápidos e responsivos. Python também não costuma ser. Os drivers de dispositivo devem ser executados de forma autônoma. Python tem um grande sistema de tempo de execução. Python usa um sistema de coleta de lixo semelhante ao Java. Em alguns casos, as pausas para a coleta de lixo são intoleráveis.
- Python não pode ser usado em alguns computadores realmente pequenos. Alguns computadores (como o Arduino em geral) são pequenos demais para o Python. Python tem uma biblioteca de tempo de execução que consome muita memória para algumas máquinas. Existe algo chamado MicroPython. No entanto, mesmo o MicroPython usa muito mais memória do que alguns sistemas (muito pequenos). Observe que o Raspberry Pi é baseado em Python.
- O Python realmente não é executado no navegador. Existem ferramentas e soluções para este problema. No entanto, JavaScript é (de longe) a ferramenta dominante para programação front-end, não Python.
- Python não é tão portátil. Na verdade, Python é superportável. No entanto, você deve ter o tempo de execução do Python já instalado. Como consequência, a maioria dos jogos não é escrita em Python. Instalar o tempo de execução do Python é um grande obstáculo para muitos aplicativos. Nesse aspecto, Python é muito parecido com Java. Java é realmente muito, muito portátil. No entanto, você deve ter uma JVM já instalada.
- Python é muito lento para alguns usos. Os jogos têm requisitos de FPS muito exigentes e precisam processar um grande número de pixels. Como consequência, a maioria dos jogos são escritos em C / C ++, não Python. Em média, Python é cerca de 100 vezes mais lento que C ++. Em muitos casos (na maioria das vezes), isso não é um grande problema. Para jogos e alguns outros aplicativos, é.
- Python não é muito uma linguagem de ‘bare metal’. Se você precisa acessar e manipular hardware diretamente, Python pode não ser uma boa escolha. Consulte o ponto 1 (drivers de dispositivo) acima. Observe que o Python não possui ponteiros verdadeiros com endereços de máquina reais. Este é um problema crítico em alguns casos.
- Python é basicamente de thread único (veja as outras respostas). Este é um grande problema em alguns casos (não muitos realmente) e um não-problema em outros. Observe que Python não faz um trabalho particularmente bom no uso de núcleos tradicionais. No entanto, algumas bibliotecas Python muito importantes exploram núcleos CUDA.
De modo geral, Python é uma ferramenta muito boa. Pessoalmente, adoro isso. No entanto, não é a escolha certa para tudo.