Bästa svaret
För att förstå hashable-typer i python måste du förstå vad hashing är och varför det används. Så här är en kort översikt över hashing:
När du hasar ett objekt betyder det verkligen att du kör igenom någon funktion. Denna funktion kallas en hash-funktion. Vad den här hashfunktionen gör är att ge dig en unik utgång för en unik ingång. Låt oss till exempel säga att vi har en hash-funktion som heter hash och två variabler a och b så att a! = B, sedan hash (a)! = Hash (b). Teoretiskt sett ändå. I praktiken kommer du att springa i en hashkollision. Det betyder a! = B men hash (a) == hash (b). Ett exempel kan vara om din hashfunktion är x mod 10 då hash (12) == hash (2). Det finns några sätt att hantera detta.
Python använder detta för att lagra nycklar i ordböcker. Sättet de gör detta är att de hash-objektet, sedan mappar hash till ett index i en matris och sedan placerar värdet där. Så till exempel, låt oss säga att du vill lagra “123” vid tangenten “abc”. Låt oss säga att python initierade en matris för en ordlista till 10. Vad python kommer att göra är hash (abc) och sedan mod det med 10 för att lägga det i en ordlista. Låt oss säga hash (abc) returnerar 1234. Python ändrar sedan det med 10 för att få 4. Det sätter sedan ”123” i index 4.
Så i grund och botten är en hashtyp bara en typ som Du kan göra en funktion hashbar genom att skriva över \_\_hash\_\_ och \_\_eq\_\_ i python. Men du måste vara försiktig för att se till att hash returnerar samma sak varje gång det får samma objekt. Till exempel om du gör \_\_hash\_\_ returnerar du ett slumpmässigt tal varje gång du kallar det kommer du aldrig hitta ditt objekt i en hash igen. Samtidigt vill du inte returnera samma sak för varje objekt, för då får du många falska positiva effekter.
Naturligtvis är detta lite mer komplicerat och det här är extremt kort översikt men det här är grunderna bakom hashing
Svar
Detta är en tuff fråga (men en bra fråga). På amerikansk engelska kan frågan läsas som ”lista alla saker som Pythonspråket inte kan göra”. Det är svårt (för mig) eftersom jag inte vet tillräckligt för att lista dem alla. Nedan har jag listat några av de saker som Python inte kan göra. Läs alla andra svar för mer information.
- Python fungerar inte för enhetsdrivrutiner. Enhetsdrivrutiner måste vara supersnabba och extremt lyhörda. Python tenderar inte att vara heller. Enhetsdrivrutiner måste köra fristående. Python har ett stort system för körning. Python använder ett skräpsamlingssystem som Java. I vissa fall är pauser för skräpsamling oacceptabla.
- Python kan inte användas på några riktigt små datorer. Vissa datorer (som Arduino i allmänhet) är bara för små för Python. Python har ett körtidsbibliotek som tar för mycket minne för vissa maskiner. Det finns något som heter MicroPython. Men även MicroPython använder mycket mer minne än vissa (mycket små) system har. Observera att Raspberry Pi är Python-baserad.
- Python körs inte riktigt i webbläsaren. Verktyg och lösningar finns för detta problem. JavaScript är dock (överlägset) det dominerande verktyget för front-end-programmering, inte Python.
- Python är inte så bärbart. Egentligen är Python superportabel. Du måste dock ha Pythons körtid redan installerad. Som en konsekvens är de flesta spel inte skrivna i Python. Att installera Pythons körtid är för mycket av ett hinder för många applikationer. I detta avseende är Python ungefär som Java. Java är faktiskt väldigt, väldigt bärbart. Du måste dock ha en JVM redan installerad.
- Python är för långsam för vissa användningsområden. Spel har mycket krävande FPS-krav och behöver bearbeta ett stort antal pixlar. Som en konsekvens är de flesta spel skrivna i C / C ++, inte Python. I genomsnitt är Python ungefär 100 gånger långsammare än C ++. I många (faktiskt) fall är det inte så mycket problem. För spel och andra applikationer är det.
- Python är inte mycket av ett ”bare metal” -språk. Om du behöver direkt åtkomst till och manipulera hårdvara kanske Python inte är ett bra val. Se punkt 1 (enhetsdrivrutiner) ovan. Observera att Python inte har riktiga pekare med faktiska maskinadresser i dem. Detta är i vissa fall ett kritiskt problem.
- Python är ganska mycket engängad (se de andra svaren). Detta är ett stort problem i vissa fall (inte riktigt många) och i andra fall inte ett problem. Observera att Python inte gör ett särskilt bra jobb med att använda traditionella kärnor. Men vissa mycket viktiga Python-bibliotek utnyttjar CUDA-kärnor.
Sammantaget är Python ett ganska bra verktyg. Personligen älskar jag det. Det är dock inte rätt val för allt.