【问题标题】:Python infinite while loop issuePython无限while循环问题
【发布时间】:2020-08-18 19:49:36
【问题描述】:

我正在尝试在 Python 中创建一个要求用户输入的脚本,它应该会在响应“请输入名字”时出错,然后将用户返回到初始输入问题提示。

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


# 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 循环似乎是错误的?

【问题讨论】:

  • 你进入了一个无限循环,因为len(fname) 永远不会改变。您需要再次请求输入,这次将其存储为 fname。
  • 你写一个函数如何循环,直到它从用户那里得到一个非空字符串,然后返回它?然后你可以调用它两次来得到这两个名字。

标签: python python-3.x while-loop infinite-loop


【解决方案1】:

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

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)

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

【讨论】:

  • 这就像我在使用不同的功能做不同的事情之前尝试过的,但对我来说变得更加混乱,我放弃了哈哈。是的,您的解决方案很有效,它不会将错误返回给用户,但这实际上更好,因为他们在提供某些东西之前无法继续前进。完美谢谢你,我明白了:)
【解决方案2】:

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

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}')

【讨论】:

    【解决方案3】:

    我觉得你是新手:

    While-loops 通常如下所示:

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

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

    在你的情况下,这会变成这样:

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

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

    while true
    <get_event>
    

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

    【讨论】:

    • 我对它有点陌生,是的。谢谢你,很高兴知道。
    【解决方案4】:

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

    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 的答案更好,没有得到你真正想要的。

    【讨论】:

    • 我不是专家,我知道有更好的方法可以做到这一点并且没有那么多循环我只是不知道我是如何尝试维护 DRY 代码但最终遇到了更多问题所以放弃了。我不知道代码的“引发异常”部分。谢谢
    • 这也有效,但不会让用户回到最初的异常问题,它只是结束脚本,这就是为什么我认为会包含一个 while 循环。
    • 是的,这就是为什么我认为 Tomalak 的回答更好,我没有考虑重新向用户询问信息。
    【解决方案5】:

    试试这个代码:

    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()
    

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 2017-10-12
      • 2020-11-30
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2017-08-26
      相关资源
      最近更新 更多