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 的答案更好,没有得到你真正想要的。
我正在尝试制作一个脚本,要求用户在 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 的答案更好,没有得到你真正想要的。