IndexError: list index out of range - Randint

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zero0815
User
Beiträge: 2
Registriert: Dienstag 23. Februar 2021, 16:56
Wohnort: Witten

Hallo zusammen, ich habe euch durch Zufall bei einer Google suche nach dem Fehler, welcher im Betreff steht gefunden.
Nun bin ich leider ein wenig überfragt, da ich aktuell noch die Sprache lerne und meine kleinen aber feinen Probleme mit der Objektorientierten "Programmierung" habe. Deshalb ich mein "Programm" auch so simpel geschrieben.

Code: Alles auswählen

from random import randint

def startUp():

    h = input('Was möchtest du machen?\n' +
              'name für Namepicker oder number für Numberpicker!\n')

    if h == 'name':
        randomName()

    elif h == 'number':
        randomNumber()

    else:
        print('Eingabefehler!\n' +
              'Eingabe wiederholen!')
        startUp()

def abfrage():

    d = input('Noch eine Abfrage?\n' +
    'j oder n?\n')

    if d == 'j':

        g = input('Was möchtest du machen ?\n' +
                  'name für Namepicker oder number für Numberpicker!\n')

        if g == 'name':

            randomName()

        elif g == 'number':

            randomNumber()

        else:

            print('Eingabefehler!\n' +
                  'Eingabe wiederholen!')

            abfrage()

    elif d == 'n':

        exit('Vielen Dank für das Benutzen des Randompickers!')

    else:

        print('Eingabe nicht korrekt!\n' +
        'Bitte wiederholen!\n')

        abfrage()

def randomName():

    a = input('Wieviele Namen?\n')

    b = [input('Name: ') for i in range(0, int(a))]

    c = randint(0, int(a))

    print(b[c])

    abfrage()

def randomNumber():

     e = input('Wieviel Zahlen?\n')

     f = randint(1, int(e))

     print(f)

startUp()
Und zwar habe ich vor bei der randomName() Funktion einen zufälligen Namen zu ziehen.
Das klappt auch, bei dem ersten Versuch, aber bei einer neuen durchführung bekomme ich den Fehler: IndexError: list index out of range.

Außerdem habe ich nur folgende Fehlerbeschreibung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/Users/xxx/OneDrive/Desktop/Programme/Python Projekte/Randompicker/Random_Name.py", line 75, in <module>
    startUp()
  File "C:/Users/xxx/OneDrive/Desktop/Programme/Python Projekte/Randompicker/Random_Name.py", line 9, in startUp
    randomName()
  File "C:/Users/xxx/OneDrive/Desktop/Programme/Python Projekte/Randompicker/Random_Name.py", line 65, in randomName
    abfrage()
  File "C:/Users/xxx/OneDrive/Desktop/Programme/Python Projekte/Randompicker/Random_Name.py", line 31, in abfrage
    randomName()
  File "C:/Users/xxx/OneDrive/Desktop/Programme/Python Projekte/Randompicker/Random_Name.py", line 63, in randomName
    print(b[c])Traceback (most recent call last):
Traceback (most recent call last):
Vielleicht könnt Ihr mir ja besser helfen.

Vielen Dank schon einmal im Voraus!
Mit freundlichen Grüßen

Zero
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Grundsätzlich bedeutet der Fehler, dass du auf den Index einer Liste zugreifen möchtest, der nicht existiert.
Du solltest dir rund um die Zeile, in der der Fehler auftritt, anzeigen lassen, welche Werte dort an die Namen gebunden sind.

Wir sollten aber kurz deinen Code anschauen:

Benutze sprechende Namen, die dir (und anderen) sagen, was sie bedeuten. Diese einbuchstabigen, willkürlichen Namen sind nichtssagend.

Funktionen sind keine Sprungmarken. Funktionen haben eine Aufgabe. Alles was sie brauchen, um diese Aufgabe zu erledigen, bekommen sie als Parameter, und geben ein Ergebnis mittels return zurück. Du verwendest sie aber, um an bestimmte Stellen im Code zu "springen". Das geht so weit, dass du - statt Schleifen zu benutzen - Funktionen rekursiv aufrufst. Das heißt, du packst das, was eigentlich in eine Schleife gehört, in eine Funktion und rufst an deren Ende die Funktion wieder auf. Dadurch wird die Funktion aber nicht etwa verlassen. Das sieht man auch schön in deiner Fehlermeldung, denn der Traceback zeigt, dass du noch immer in "StartUp" steckst.

Datenstrukturen, Schleifen, Funktionen. Du solltest es dir noch einmal anschaun.
Zero0815
User
Beiträge: 2
Registriert: Dienstag 23. Februar 2021, 16:56
Wohnort: Witten

sparrow hat geschrieben: Dienstag 23. Februar 2021, 19:51 Datenstrukturen, Schleifen, Funktionen. Du solltest es dir noch einmal anschaun.
Alles klar, ich habe das nur noch so im Kopf, dass ich bei wiederkehrenden Operationen lieber Funktionen definieren sollte, statt immer wieder Schleifen neu zu tippen / zu kopieren. :)
Mit freundlichen Grüßen

Zero
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das stimmt ja auch. Nur benutzt du sie falsch.
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Du verwendest Python wie BASIC und Funktionsaufrufe wie GOTOs. Das ist, höflich gemeint, Murks.
Hier mal deine Idee vernünftig umgesetzt.
Es fehlt noch einiges, wie z.B. die Überprüfung der Eingaben in den Funktionen auf Korrektheit.

Code: Alles auswählen

from random import randint

def auswahl():
    while True:
        eingabe = input('Was möchtest du machen?\n' +
                  'name für Namepicker oder\n' +
                  'number für Numberpicker oder\n' +
                  'ende zum Beenden!\n')
        if eingabe == 'name':
            random_name()
        elif eingabe == 'number':
            random_number()
        elif eingabe == 'ende':
            print('Vielen Dank für das Benutzen des Randompickers!')
            break
        else:
            print('Eingabefehler!\n' +
                  'Eingabe wiederholen!')

def random_name():
    anzahl = int(input('Wieviele Namen?\n'))
    namen = [input('Name: ') for _ in range(anzahl)]
    print(f'Zufällig ausgewählter Name: {namen[randint(0, anzahl-1)]}\n')

def random_number():
    anzahl = int(input('Wieviele Zahlen?\n'))
    print(f'Zufällige Zahl: {randint(1, anzahl)}\n')

if __name__ == '__main__':
    auswahl()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zero0815: Variablennamen sollten aussagekräftig sein, einbuchstabige Namen sind das fast nie. startUp und abfrage enthalten fast den selben Code, also mit dem Nicht-Kopieren hat das nicht ganz geklappt. Rekursive Aufrufe sind kein Ersatz für Schleifen. Wenn etwas wiederholt werden soll, benutzt man eine Schleife.
Antworten