Код не компилируется — не удается выяснить проблему

#python-3.x

#python-3.x

Вопрос:

Я уже несколько дней нахожусь в тупике по этому поводу и, кажется, могу понять, в чем проблема. Я могу запустить все это нормально, за исключением тех случаев, когда я выбираю опцию 1 в меню консоли. Я смогу выполнить первые вводы, а затем каждый раз получаю сообщение об ошибке. Также по какой-то причине, когда выбран другой вариант, он не переходит к этому варианту, а просто начинает использовать код генератора паролей. Любая помощь будет признательна. Все еще довольно новичок во всем этом.

 import math
import sys
import random
import datetime
import string
import secrets
from datetime import date
while 1:
    print("nWelcome to the application that will solve your everday problems!")
    print("nPlease Select an Option from the List Below:")
    print("1: To Generate a New Secure Password ")
    print("2: To Calculate and Format a Percentage ")
    print("3: To Receive the amount of days until Jul 4th, 2025 ")
    print("4: To Calculate the Leg of Triangle by using the Law of Cosines ")
    print("5: To Calculate the Volume of a Right Circular Cylinder ")
    print("6: To Exit the Program ")
    choice = int(input("Please enter your Selected Option: "))
    if choice == 6:
        print("nThank you for coming, Have a Great Day!")
        break
    elif choice == 1:
        def input_length(message):
            while True:
                try:    #check if input is integer
                    length = int(input(message))
                except ValueError:
                    print("Not an integer! Try again.")
                    continue
                if length < 5:  #check if password's length is greater then 5
                    print("Too short password!")
                    continue
                else:
                    return length
        def input_yes_no(message):
            while True:
                option = input(message).lower()
            if option not in ('y', 'n'):  #check if user entered y/n (or Y/N)
                print("Enter y or n !")
            else:
                return option
        def get_options():
            while True:
                use_upper_case = input_yes_no("Use upper case? [y/n]: ")
                use_lower_case = input_yes_no("Use lower case? [y/n]: ")
                use_numbers = input_yes_no("Use numbers? [y/n]: ")
                use_special_characters = input_yes_no("Use special characters? [y/n]: ")
                options = (use_upper_case, use_lower_case, use_numbers, use_special_characters)
            if all(option == 'n' for option in options): #check if all options are 'n'
                print("Choose some options!")
            elif all(option == 'n' for option in options[:-1]) and options[-1] == 'y':
                print("Password can not contain only special characters")
                 return options
        def generate_alphabet(use_upper_case, use_lower_case, use_numbers, use_special_characters):
            alphabet = '' 
        if use_upper_case == 'y' and use_lower_case == 'y':
            alphabet = string.ascii_letters
        elif use_upper_case == 'y' and use_lower_case == 'n':
             alphabet = string.ascii_uppercase
        elif use_upper_case == 'n' and use_lower_case == 'y':
             alphabet = string.ascii_lowercase
        if use_numbers == 'y':
             alphabet  = string.digits
        if use_special_characters == 'y':
             alphabet  = string.punctuation
        def generate_password(alphabet, password_length, options):
            use_upper_case = options[0]
            use_lower_case = options[1]
            use_numbers = options[2]
            use_special_characters = options[3]
        while True: 
            password = ''.join(secrets.choice(alphabet) for i in range(password_length))
            if use_upper_case == 'y':
                if not any(c.isupper() for c in password):
                continue
            if use_lower_case == 'y':
                if not any(c.islower() for c in password):
                continue
            if use_numbers == 'y':
                if not sum(c.isdigit() for c in password) >= 2:
                continue
            if use_special_characters == 'y':
                if not any(c in string.punctuation for c in password):
                continue
            break
        def main():
            password_length = input_length("Enter the length of the password: ")
            options = get_options()
            alphabet = generate_alphabet(*options)
            password = generate_password(alphabet, password_length, options)
            print("Your password is: ", password)
        if __name__ == "__main__":
             main()
    elif choice == 2:
       Num = float(input("Please Enter the Numerator: "))
       Denom = float(input("Please Enter the Denomenator: "))
       Deci = int(input("Please Enter the Number of Decimal Places You Would Like: "))
       Val = Num/Denom*100
       Val = round(Val, Deci)
       print("nThe Percentage of the numbers you entered is", Val, "%")
    elif choice == 3:
        Today = datetime.date.today()
        Future = date(2025, 7, 25)
        Diff = Future - Today
        print("nTotal numbers of days till July 4th, 2025 is:", Diff.days)
    elif choice == 4:
        A = int(input("Please Enter angle A: "))
        B = int(input("Please enter angle B: "))
        Angle = int(input("Please Enter the Angle of the Triangle: "))
        c = A*A   B*B - 2*A*B*math.cos(math.pi/180*Angle)
        print("nThe Leg of the Triangle is:", round(c))
    elif choice == 5:
        Radius = int(input("Please Enter the Radius of the Cylinder: "))
        Height = int(input("Please Enter the Height of the Cylinder: "))
       Volume = (math.pi*Radius*Radius)*Height
       print("nThe Volume of the Cylinder is:", Volume)
  

Комментарии:

1. Определение функций в if блоках — странная идея… Начните с перемещения всех определений функций в начало вашего кода, что сделает основную структуру более понятной.

2. Хорошо, я так и сделаю, спасибо. Я думаю, что я ошибся в том, что я разработал два отдельных раздела программы отдельно, а затем решил собрать их вместе.

3. Является ли ваш отступ таким в вашей реальной программе или это ошибка копирования / вставки?

4. Это не так, мне пришлось немного подкорректировать его, чтобы иметь возможность опубликовать его здесь. Я получал сообщение об ошибке «Неправильно отформатирован» при попытке опубликовать его здесь.