2016-09-11 1 views
-1

Nach dem Ausführen meines Programms, das mehrere Male Kennwörter generiert, erhalte ich einen IndexError: list Index außerhalb des Bereichs. Ich bin nicht sicher, was das ProblemIndexError nach mehrmaligem Ausführen des Programms

import string 
import random 

def random_pass(length): 
    alphabet = list(string.ascii_letters + string.digits + string.punctuation) 
    password = [] 
    upper_case = list(string.ascii_uppercase) 
    count = 0 
    while count < length: 
      random_num = random.randint(0,len(alphabet)) 
      password.append(alphabet[random_num]) 
      #Checks to see if first character is a uppercase Letter 
      if password[0] not in upper_case: 
       first_letter = random.randint(0,len(upper_case)) 
       password[0] = upper_case[first_letter] 
      count += 1 
    return ''.join(password) 
def welcome(): 
    print("*****************************************************************") 
    print("*****************************************************************") 


def main(): 
    try: 
     get_length = int(input("Please enter the length of your password ")) 
    except ValueError: 
     print("Please enter numbers only") 
     main() 
    else: 
     print("Your {} character password is {}".format(get_length, random_pass(get_length))) 
     restart = input("Do you wish to create another password? y/n") 
     password = [] 
    if restart.lower() == 'y': 
     main() 
    else: 
     exit() 
main() 
+0

Sie müssen nicht nur die Fehlermeldung "IndexError: Liste Index außerhalb des Bereichs", sondern auch die vollständige Rückverfolgung in die Frage selbst enthalten. –

Antwort

2

random.randint erzeugen kann den Ende Wert als auch verursacht; Sie müssten random.randrange verwenden, um Zufallszahlen in dem Bereich zu generieren, der den Startwert enthält, und das Ende ausschließt.

0

Antti Haapala beantwortet Ihre Frage, aber ich sehe ein paar Dinge, die in Ihrem Code verbessert werden könnten. Die Idee ist, Ihren Code klarer zu machen.

Vor allem hier ist meine Version des Codes:

import string 
import random 

alphabet = string.ascii_letters + string.digits + string.punctuation 

def random_pass(length): 
    first_character = random.choice(string.ascii_uppercase) 
    password = ''.join(random.choice(alphabet) for x in range(length - 1)) 
    return first_character + password 

another_password = True 
while another_password: 
    try: 
     length_requested = int(input("Please enter the length of your password ")) 
    except ValueError: 
     print("Please enter numbers only") 
     another_password = True 
    else: 
     print("Your {} character password is {}".format(length_requested, random_pass(length_requested))) 
     restart = input("Do you wish to create another password (Y/N)? ") 
     another_password = restart.lower() == 'y' 

Die Modifikationen ich von Ihnen Code gemacht:

  • Da alphabet wird nie geändert, Sie brauchen es nicht jedes neu Zeit, die Sie anrufen random_pass(). Ich habe es in den globalen Geltungsbereich außerhalb jeder Funktionen
  • gesetzt
  • Da Sie auf ein Zeichen innerhalb einer Zeichenfolge auf die gleiche Weise Zugriff auf ein Element in einer Liste zugreifen können, müssen Sie keine Liste mit dem Inhalt alphabet oder string.ascii_uppercase erstellen .
  • Sie gewinnen mehr Verständnis definieren eine Variable mit dem gleichen Gehalt an string.ascii_uppercase
  • Anstatt eine zufällige Anzahl von Wahl, die Sie ein Zeichen in alphabet verwenden nicht zu wählen, können Sie direkt einen zufälligen Charakter mit random.choice(alphabet)
  • wählen Offenbar haben Sie eine Anforderung, dass das erste Zeichen des Passworts ein Großbuchstabe sein muss. In Ihrem Code überprüfen Sie dies innerhalb Ihrer while-Schleife für jedes neue Zeichen, aber das erste Zeichen ändert sich nicht, sobald Sie es festgelegt haben. Also habe ich es aus dieser Schleife gezogen.
  • Da Ihr erstes Zeichen innerhalb string.ascii_uppercase gewählt wird, habe ich random.choice(string.ascii_uppercase) dafür verwendet.
  • den Rest des Passwortes zu erstellen, benutzen ich ein generator expression einen zufälligen Charakter von alphabet und die .join() String-Methode zu wählen. Da ich bereits das erste Zeichen gewählt habe brauche ich nur length - 1 zufällige Zeichen.
  • Sie müssen main() nicht definieren, wenn Sie es nur später aufrufen.
    • Auch wenn Sie definieren main() es ist keine gute Idee, es rekursiv zu nennen, weil für jedes neues Passwort angefordert (und jedes Mal, wenn eine ungültige Eingabe durch den Benutzer eingegeben), hat den Code eine neue kleine Umfang Umgebung zu schaffen für dieser Funktionsaufruf und, noch wichtiger, muss er von allen vorherigen kleinen Umfang-Umgebung behalten. Du riskierst es, die Erinnerung zu erschöpfen. Ich habe stattdessen eine while-Schleife benutzt.
  • restart.lower() == 'y' einen boolean Wert geben Ich habe verwendet another_password zu ändern, die steuert, ob wir den Benutzer fragen weiter, wenn es ein neues Passwort will
  • Sie brauchen nicht exit() zu rufen, wenn Sie eine zurückkehren möchten Exit-Code für die Umgebung.
  • Wenn Sie weitere Fragen haben, zögern Sie nicht zu fragen. Und experimentiere weiter.

    Verwandte Themen