Beste svaret
For å forstå hashable-typer i python, må du forstå hva hashing er og hvorfor det brukes. Så her er en kort oversikt over hashing:
Når du hash et objekt, betyr det virkelig at du kjører det gjennom en eller annen funksjon. Denne funksjonen kalles en hash-funksjon. Hva denne hashfunksjonen gjør er å gi deg en unik utgang for en unik inngang. La oss for eksempel si at vi har en hashfunksjon kalt hash og to variabler a og b slik at a! = B, så hash (a)! = Hash (b). I teorien uansett. I praksis vil du løpe inn i en hash-kollisjon. Det betyr a! = B men hash (a) == hash (b). Et eksempel kan være hvis hashfunksjonen din er x mod 10, så hash (12) == hash (2). Det er noen måter å håndtere dette på.
Python bruker dette til å lagre nøkler i ordbøker. Måten de gjør dette på er at de hash objektet, deretter kartlegger hash til en indeks i en matrise og deretter setter verdien der. La oss for eksempel si at du vil lagre “123” ved nøkkelen “abc”. La oss si at python initialiserte en matrise for en ordbok til 10. Det python vil gjøre er hash (abc) og deretter mod det med 10 for å sette det i en ordbok. La oss si hash (abc) returnerer 1234. Python endrer deretter med 10 for å få 4. Den setter deretter «123» i indeks 4.
Så i utgangspunktet er en hashable-type bare en type som Du kan gjøre en funksjon hashable ved å overskrive \_\_hash\_\_ og \_\_eq\_\_ i python. Men du må være forsiktig for å sørge for at hash returnerer det samme hver gang det får det samme objektet. For eksempel hvis du gjør \_\_hash\_\_, returner et tilfeldig tall hver gang du kaller det, vil du aldri finne gjenstanden din i en hashable igjen. Samtidig vil du ikke returnere det samme for hvert objekt, for da får du mange falske positive.
Dette er selvfølgelig litt mer komplisert, og dette er ekstremt kort oversikt, men dette er det grunnleggende bak hashing
Svar
Dette er et tøft spørsmål (men et godt spørsmål). På amerikansk engelsk kan spørsmålet leses som ‘liste opp alle tingene Python-språket ikke kan gjøre’. Det er vanskelig (for meg) fordi jeg ikke vet nok til å liste dem alle. Nedenfor har jeg listet opp noen av tingene Python ikke kan gjøre. Les alle de andre svarene for mer informasjon.
- Python fungerer ikke for enhetsdrivere. Enhetsdrivere må være superraske og ultraresponsive. Python pleier ikke å være det heller. Enhetsdrivere må kjøre frittstående. Python har et stort kjøretidssystem. Python bruker et søppeloppsamlingssystem som Java. I noen tilfeller er pauser for søppeloppsamling utålelige.
- Python kan ikke brukes på noen veldig små datamaskiner. Noen datamaskiner (som Arduino generelt) er bare for små for Python. Python har et kjøretidsbibliotek som tar for mye minne for noen maskiner. Det er noe som heter MicroPython. Imidlertid bruker selv MicroPython langt mer minne enn noen (veldig små) systemer har. Merk at Raspberry Pi er Python-basert.
- Python kjører egentlig ikke i nettleseren. Verktøy og løsninger finnes for dette problemet. JavaScript er imidlertid (langt) det dominerende verktøyet for frontend-programmering, ikke Python.
- Python er ikke så bærbart. Egentlig er Python super-bærbar. Du må imidlertid ha Python-kjøretiden allerede installert. Som en konsekvens er de fleste spill ikke skrevet i Python. Installering av Python-kjøretiden er for mye av en hindring for mange applikasjoner. I denne forbindelse er Python omtrent som Java. Java er faktisk veldig, veldig bærbart. Du må imidlertid ha en JVM allerede installert.
- Python er for treg for noen bruksområder. Spill har svært krevende FPS-krav og trenger å behandle et stort antall piksler. Som en konsekvens er de fleste spill skrevet i C / C ++, ikke Python. I gjennomsnitt er Python omtrent 100 ganger tregere enn C ++. I mange (faktisk) tilfeller er det ikke så mye et problem. For spill og noen andre applikasjoner er det det.
- Python er ikke mye av et bare metal språk. Hvis du trenger å få direkte tilgang til og manipulere maskinvare, kan det hende Python ikke er et godt valg. Se punkt 1 (enhetsdrivere) ovenfor. Merk at Python ikke har sanne pekere med faktiske maskinadresser. Dette er et kritisk problem i noen tilfeller.
- Python er ganske enkelt en-trådet (se de andre svarene). Dette er et stort problem i noen tilfeller (egentlig ikke mange) og et ikke-problem i andre. Merk at Python ikke gjør en spesielt god jobb med å bruke tradisjonelle kjerner. Noen svært viktige Python-biblioteker utnytter imidlertid CUDA-kjerner.
Samlet sett er Python et ganske godt verktøy. Personlig elsker jeg det. Det er imidlertid ikke det riktige valget for alt.