(Python) TypeError: ‘float’ object is niet onderschrijfbaar

Ik heb eindelijk het geduld om Python weer te gebruiken en ik probeer wat wiskundige dingen om er weer in te komen, maar ik probeer nu een Python-script te maken en het kwam met de foutmelding ‘float’ object is not subscriptable’ .
Nogmaals, ik ben net terug in Python en ik heb geen idee wat dit betekent. Het ligt misschien voor de hand, maar alles wat ik zie op stackoverflow is dat mensen anderen vertellen hoe ze hun specifieke code moeten repareren in plaats van uit te leggen wat het betekent, dus ik weet niet wat de oorzaak zou kunnen zijn. Het enige wat ik weet is dat het iets te maken heeft met het feit dat Pi een decimaal getal is (floating point number??), maar ik zie niet in waarom het geen n-de karakter ervan zou kunnen krijgen.

Het verschijnt voor “if pi[digit] == digitChar:” op regel 11. Hier is mijn code:

pi = 0
divideBy = 1
digit = 1
digitChar = 3
digitOccurance = 1
while True:
    pi = pi - 4 / divideBy
    divideBy = divideBy + 2
    pi = pi + 4 / divideBy
    divideBy = divideBy + 2
    if pi[digit] == digitChar:
        digit = digit + 1
        digitOccurance = 0
        print(digitChar)
    else:
        digitChar = pi[digit]

Het laatste stukje code is eigenlijk om de spam te stoppen en slechts één cijfer per keer weer te geven. Het is bedoeld om het [cijfer] cijfer van ‘pi’ te krijgen en te testen of het hetzelfde was als het vorige. Als dit het geval is, beweegt het langs een teken en drukt het teken [digitChar] af.

Heel erg bedankt voor de hulp bij voorbaat!


Antwoord 1, autoriteit 100%

Voor floats (en ints) heb je niet zomaar toegang tot het n-de karakter. Dat is wat “niet onderschrijfbaar” betekent.

Strings daarentegen zijnonderschrijfbaar (net als lijsten en woordenboeken). Dus de basisoplossing is om je float naar een string te converteren. Het nieuwe probleem is echter dat de “.” in de vlotter zit een deel van de snaar. Dus wanneer u uw str(pi)[digit] == digitChardoet, moet u ervoor zorgen dat de typen op één lijn liggen. Je zou int(str(pi)[digit]) == digitCharkunnen doen, maar dit zou mislukken voor de “.” karakter. Of je kunt str(pi)[digit] == str(digitChar)doen en dat zou voor alles werken.

Je zou het ook zo kunnen instellen dat digitCharaltijd een string is. Aangezien je het digitCarhebt genoemd, zou het logisch zijn dat het type van de variabele ook een tekenreeks is.

pi = 0
divideBy = 1
digit = 1
digitChar = '3'
digitOccurance = 1
while True:
    pi = pi - 4 / divideBy
    divideBy = divideBy + 2
    pi = pi + 4 / divideBy
    divideBy = divideBy + 2
    # digitChar is a string
    if str(pi)[digit] == digitChar:
        digit = digit + 1
        digitOccurance = 0
        print(digitChar)
    else:
        # make sure to maintain `digitChar` as a string/char type
        digitChar = str(pi)[digit]

Wat de uitvoer betreft, lijkt het erop dat u enkele fouten in uw logica heeft die voorkomen dat u de juiste uitvoer krijgt.


Antwoord 2

Een “subscript” verwijst naar het gebruik van []voor indexering. Een floatis niet indexeerbaar, omdat het geen reeks of container is. Je kunt str(pi)[digit]gebruiken, hoewel dat ook de komma zou bevatten.


Antwoord 3

import math
from math import pi as pi #use pythons math pi or you can add your own
divideBy = 1
digit = 1
digitChar = 3
digitOccurance = 1
PI = str(pi) # convert float pi to string so you can do your calculations and use the str
while True:
    pi = pi - 4 / divideBy
    divideBy = divideBy + 2
    pi = pi + 4 / divideBy
    divideBy = divideBy + 2
    try: 
        if PI[digit] == digitChar:
            digit = digit + 1
            digitOccurance = 0
            print(digitChar)
        else:
            digitChar = PI[digit]
    except IndexError: # stop the index error that is produced
        break

Other episodes