Hilfe bei einem zufälligen Code Generator!

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
Jax
User
Beiträge: 1
Registriert: Samstag 23. Januar 2016, 12:56

Hallo liebes Python-Forum,

Ich habe neulich angefangen mit dem Programmieren und habe mit Python als Anfängersprache begonnen.
Mein erstes Projekt, soll dem User entweder einen zufälligen Code aus entweder Buchstaben oder Zahlen generieren.
Dabei darf der User sich selbst aussuchen wie lange dieser zufällig generierte Code ist.

Mein Problem:
Der User soll an einer bestimmten Stelle im Code seine gewünschte Codelänge eingeben als Input.
Dieser wird dann durch einen Loop mit try geschickt um zu schauen, ob der input sich in ein int umwandeln lässt.
Danach versuche ich mit range die vom User eingegebene Zahl zu benutzen.
Leider klappt das nicht so ganz nach meinen Vorstellungen.

Der Code:

Code: Alles auswählen

#importing the needed moduls
import random
from random import randint
from random import choice
import string
from string import ascii_uppercase

#############################################################################

#create the main loop
right_input = 0
while right_input == 0:

    #Welcome the user
    print ("Welcome to the random word / number generator, made by Jax!")
    print ("")
    print ("Do you want to create a random word or a number?")

    #initiating the first user input, that decides what the user wants to generate
    user_choice = input("Please type in 'word' or 'number': ")

    #initiating the first if clause, if the user has written the right strings
    if user_choice == "word":
        right_input = 1
        print ("")
        print ("You succesfully decided, to generate a random word")
        print ("How many letters should your random word have?")

        #initiating the loop for the right answer
        right_wordlenght_input = 0
        while right_wordlenght_input == 0:
            
            #initiating the input, for the numbers of letters the random word should have
            user_numbers_word_choice = input("Please type in a wished number for the lenght of the randomly generated word: ")

            #initiating check if it is a number
            try:
                val = int(user_numbers_word_choice)
                right_wordlenght_input = 1
                print ("Your wished word lenght is:", user_numbers_word_choice)
                print ("")
                print ("Random word will be generatet. . .")
        
                print(''.join(choice(ascii_uppercase) for i in range(user_numbers_word_choice)))

            #adding the exception of user input aint a number
            except:
                print ("Thats not a number, please try again")
                print ("")
                

    elif user_choice == "number":
        print ("")
        print ("placeholder2")
        right_input = 1
        
    else:
        print ("placeholder3")
        print ("")
Gewünscht wäre ein kleiner Denkanstoß oder eine Hilfestellung, da ich schon seit einiger Zeit an diesem Problem sitze.
Danke fürs Lesen, ich freue mich auf eure Antworten!
Zuletzt geändert von Anonymous am Samstag 23. Januar 2016, 15:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Jax: Der Denkanstoss wäre: Schreibe Funktionen. Das ist so schon viel zu lang, und ausserdem alles global auf Modulebene. Schreib für die einzelnen Teilaufgaben jeweils eine kleine Funktion und teste die ob sie funktioniert. Und dann kannst Du das alles zu einem Hauptprogramm zusammen setzen. Das steht üblicherweise in einer Funktion die `main()` heisst.

Aus den ``while``-Schleifen würde ich ”Endlosschleifen” machen (``while True:``), die dann mit ``break`` oder ``return`` verlassen werden können wenn die Abbruchbedingung innerhalb der Schleife erfüllt wurde.

Der Code in einem ``try``/``except``-Block sollte möglichst begrenzt sein und nur den Codeteil, und vor allem auch nur die konkrete(n) Ausnahme(n) abdecken, die man prüfen möchte. Wenn irgendwo in Deinem Block mit dem ”nackten” ``except`` *irgendeine* Ausnahme auftritt, wird dem Benutzer gesagt, dass es keine Zahl wäre. Also beispielsweise auch wenn Du Dich als Programmierer bei einem Namen vertippt hast, oder wenn der Benutzer eine sehr grosse Zahl eingegeben hat und das zu einem `MemoryError` führt. Du willst eigentlich nur einen `ValueError` in der Zeile mit der Umwandlung in eine ganze Zahl behandeln. Noch ein Tipp: Das ``try``/``except``-Konstrukt kennt auch einen ``else``-Zweig.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jax: ab einer bestimmten Länge und Verschachtelungstiefe verliert jeder den Überblick. Definiere Funktionen die eine bestimmte Aufgabe erfüllen, die Du auch einzeln testen kannst. Hier ein Denkanstoß:

Code: Alles auswählen

import random
from string import ascii_uppercase 
 
def input_choice(options):
    while True:
        choice = input("Please type in %s:" % ' or '.join(map(repr,options)))
        if choice in options:
            return choice
    
def input_number(prompt):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("That's not a number, please try again.")

def process_word():
    print("")
    print("You succesfully decided, to generate a random word.")
    print("How many letters should your random word have?")
    
    length = input_number("Please enter the length of the randomly generated word: ")
 
    print("Your wished word lenght is:", length)
    print("")
    print("Random word will be generated . . .")

    print(''.join(random.choice(ascii_uppercase) for _ in range(length)))

def process_number():
    # TODO: write function
    pass
            
def main():
    #Welcome the user
    print("Welcome to the random word / number generator, made by Jax!")
    print("")
    print("Do you want to create a random word or a number?")
 
    choice = input_choice(["word", "number"])
    if choice == "word":
        process_word()
    elif choice == "number":
        process_number()
    else:
        print("internal error!")

if __name__ == '__main__':
    main()
Antworten