猿问

密码生成器 - 嵌套 while 循环

我正在研究下面的密码生成器和一个让我困惑的问题。


有一个嵌套的 while 循环询问用户是否愿意在生成密码后选择一个新密码。每次您选择“是”时,理想情况下它应该生成一个新密码来替换旧密码。事实并非如此,每次重新选择时,它都会在旧密码上添加一个新密码。


我不在这里做什么?


import random

from string import ascii_lowercase, ascii_uppercase, digits


special_chars = "!#$%&*@^"

available_chars = list(ascii_lowercase) + list(ascii_uppercase) + list(digits) + list(special_chars)



def get_length():

    user_l = ""

    while not user_l.isdigit() or int(user_l) < 6:

        user_l = input("Please input a password length.\n")

    return int(user_l)

    print(int(user_l))


def pwd_gen(length):

    return [random.choice(available_chars) for i in range(length)]



def pwd_chk(length):

    pwd = []

    while True:

        pwd = pwd_gen(length)

        if set(pwd) & set(ascii_lowercase) == set():

            continue

        elif set(pwd) & set(ascii_uppercase) == set():

            continue

        elif set(pwd) & set(digits) == set():

            continue

        elif set(pwd) & set(special_chars) == set():

            continue

        else:

            print("\nYour password is " + "".join(pwd))

            while True:

                accept = input("Would you like a different password? Y/N\n\n")

                if accept.lower() == "n" or accept.lower() == "no":

                    print("\nYour password is:")

                    break

                elif accept.lower() == "y" or accept.lower() == "yes":

                    pwd_chk(length)

                    break

                else:

                    print("\nInvalid input. Your password is " + "".join(pwd))

                    continue

            break


    pwd = "".join(pwd)

    print(pwd)


pwd_chk(get_length())


皈依舞
浏览 180回答 2
2回答

MM们

选择“Y”后并没有停止循环,因此未完成的函数将继续执行。通过使用return语句(而不是break),您可以停止函数打印它生成的密码。import randomfrom string import ascii_lowercase, ascii_uppercase, digitsspecial_chars = "!#$%&*@^"available_chars = list(ascii_lowercase) + list(ascii_uppercase) + list(digits) + list(special_chars)def get_length():&nbsp; &nbsp; user_l = ""&nbsp; &nbsp; while not user_l.isdigit() or int(user_l) < 6:&nbsp; &nbsp; &nbsp; &nbsp; user_l = input("Please input a password length.\n")&nbsp; &nbsp; return int(user_l)&nbsp; &nbsp; print(int(user_l))def pwd_gen(length):&nbsp; &nbsp; return [random.choice(available_chars) for i in range(length)]def pwd_chk(length):&nbsp; &nbsp; pwd = []&nbsp; &nbsp; while True:&nbsp; &nbsp; &nbsp; &nbsp; pwd = pwd_gen(length)&nbsp; &nbsp; &nbsp; &nbsp; if set(pwd) & set(ascii_lowercase) == set():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; elif set(pwd) & set(ascii_uppercase) == set():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; elif set(pwd) & set(digits) == set():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; elif set(pwd) & set(special_chars) == set():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("\nYour password is " + "".join(pwd))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while True:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; accept = input("Would you like a different password? Y/N\n\n")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if accept.lower() == "n" or accept.lower() == "no":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("\nYour password is:")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elif accept.lower() == "y" or accept.lower() == "yes":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pwd_chk(length)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return # CHANGE THIS FROM "break" TO "return"! #&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("\nInvalid input. Your password is " + "".join(pwd))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; pwd = "".join(pwd)&nbsp; &nbsp; print(pwd)pwd_chk(get_length())作为旁注,如果您实际使用它们,则不应使用默认的随机模块来生成密码。使用该secrets模块或使用随机数生成器播种更安全import osimport randomrandom.seed(os.urandom(16))实现安全。

慕虎7371278

您可以添加一个标志而不是再次调用该函数(内部 while 代码):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while True:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replace_password = False # Flag added here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; accept = input("Would you like a different password? Y/N\n\n")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if accept.lower() == "n" or accept.lower() == "no":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("\nYour password is:")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elif accept.lower() == "y" or accept.lower() == "yes":&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replace_password = True # Setting flag&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print("\nInvalid input. Your password is " + "".join(pwd))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if replace_password: # Action based on flag&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break
随时随地看视频慕课网APP

相关分类

Python
我要回答