Python 无限循环问题

Python infinite while loop issue

我正在尝试制作一个脚本,要求用户在 Python 中输入,它应该会因响应 "Please enter first name" 而出错,然后 return 用户返回初始输入问题提示。

这不起作用,而是在询问名字和姓氏之后,如果没有给出名字和姓氏,我将陷入第一个错误的无限循环。


# User input for first name
first_name = input('Enter FIRST name here: ')
# User input for last name
last_name = input('Enter LAST name here: ')

def print_name():

    # store user input in separate variable
    fname = first_name
    lname= last_name

    while True:
        # throw error if user enters no first name
        if len(fname) == 0:
            # error msg
            print('No FIRST name entered...')
            # loop back to prompt asking for first name
            continue
        else:
            # if first name given move on to prompting for last name
            # break loop
            break

    # loop into prompting user for last name
    while True:
        # throw error if user enters no last name
        if len(lname) == 0:
            print('No LAST name entered...')
            # loop back to prompt asking for last name
            continue
        else:
            # if last name given move on to running print command
            # break loop
            break

        return fname, lname

    print(f'your name is {fname} {lname}')

print_name()

有人可以帮助我了解这里出了什么问题吗?它应该只在没有给出任何内容时循环回询问名字(或姓氏),否则它应该将用户名打印到控制台。两个名字也应该给出,如果没有给出名字,那么 id 预计在第一个 while 循环中会出现错误,如果没有给出姓氏也是如此。

请问还有更好的方法吗?使用 2 个 while 循环似乎是错误的?

问题出在你的无限循环上,你可以像这样简化你的函数:

def print_name():
    first_name = ""
    last_name = ""
    # User input for first name
    while first_name == "":
        first_name = input('Enter FIRST name here: ')
    # User input for last name
    while last_name == "":
        last_name = input('Enter LAST name here: ')
    print(f'your name is {first_name} {last_name}')

不要重复自己。如果您复制并粘贴一段代码,请停下来思考。它应该是一个函数,或者一个循环。

def wait_for_input(prompt):
    data = ""
    while data == "":
        data = input(prompt).strip()
    return data


def print_name(fname, lname):
    print(f'your name is {fname} {lname}')


first_name = wait_for_input('Enter FIRST name: ')
last_name = wait_for_input('Enter LAST name: ')

print_name(first_name, last_name)

另外,不要使用注释来重复代码所说的内容。

我觉得你是新手:

While 循环通常如下所示:

while <condition>
...
<check_condition>
...

这意味着在大多数情况下,每次执行循环时,while都会重新计算并再次检查条件。

在你的例子中,这会变成这样:

while (len(fname) == 0)
<show_error_message>
<get fname again>

您在此处编写的案例 (while true) 也存在并经常使用,但在非常不同的情况下,例如在基于事件的多线程程序中:

while true
<get_event>

这意味着程序的一部分(所谓的线程)正在等待捕获事件(如按钮点击),然后发生某些事情。然而,这主要是在多线程应用程序中完成的,这意味着 "main" 程序正在做某事,而子程序正在处理即将到来的事件。

试试这个代码:

def print_name():

    # store user input in separate variable
    first_name = input('Enter FIRST name here: ')

    fname = first_name



    while True:
        fname = first_name


        # throw error if user enters no first name
        if len(fname) == 0:
            # error msg
            print('No FIRST name entered...')
            first_name = input('Enter FIRST name here: ') 
            # loop back to prompt asking for first name
            continue
        else:
            # if first name given move on to prompting for last name
            # break loop
            break

    # loop into prompting user for last name
    while True:
        last_name = input('Enter LAST name here: ')
        lname= last_name

        # throw error if user enters no last name
        if len(lname) == 0:
            print('No LAST name entered...')
            # loop back to prompt asking for last name
            continue
        else:
            # if last name given move on to running print command
            # break loop
            break

        return fname, lname

    print(f'your name is {fname} {lname}')

print_name()

我不完全理解你为什么需要这么多循环。应该这样做:

def print_name():
    fname = input('Enter FIRST name here: ')
    if len(fname) == 0:
        raise Exception('No FIRST name entered...')

    lname= input('Enter LAST name here: ')
    if len(lname) == 0:
        raise Exception('No LAST name entered...')

    print(f"your name is {fname} {lname}")

如果您只想重复这个循环,您需要做的就是将 print_name() 函数嵌套在一个循环中。

编辑:既然我看到了其他答案,我相信@Tomalak 的答案更好,没有得到你真正想要的。