Python无限循环问题

问题描述 投票:0回答:1

我试图用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()

请谁能帮我理解一下这里到底出了什么问题?它应该只在什么都没有给出的时候才会循环到询问名字(或姓氏),否则它应该把用户的名字打印到控制台。两个名字都应该给出,如果第一个名字没有给出,那么我希望在第一个while循环中出现错误,就像没有给出姓氏一样。

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

python python-3.x while-loop infinite-loop
1个回答
3
投票

别重复了。如果你复制粘贴了一段代码,请停下来思考。它应该是一个函数,或者是一个循环。

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)

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


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

1
投票

我觉得你是个新手。 I have the impression you are new at this:

While循环一般是这样的

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

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

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

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

你在这里写的案例while true)也是存在的,并且经常被使用,但在非常不同的情况下,比如在基于多线程事件的程序中。

while true
<get_event>

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


1
投票

我不太明白为什么你需要这么多循环。像这样的程序就可以了。

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()函数嵌套在一个循环中就可以了

EDIT: 现在我看到了其他的答案,我相信@Tomalak的答案更好,是没有得到你真正想要的东西。


0
投票

试试这段代码。

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()
© www.soinside.com 2019 - 2024. All rights reserved.