[英]Combine multiple while statements python
所以我有以下while语句,我想将它们组合起来。 因为如果你有20个这样的if语句,这会很烦人。
while True:
name = str(raw_input("NAME PLEASE\n"))
if name.isalpha():
break
print("Please chars dude")
while True:
age = raw_input("Please type your age\n")
if age.isdigit():
break
print("Please digits only")
如果我将它们组合在一起并且有人用'age'键入一个AZ字符,那么代码会重新开始,而不会保存'name'语句。 如果它是正确的,我希望它保存'name',并且只从false语句的if语句开始。
while True:
name = str(raw_input("NAME PLEASE\n"))
if name.isalpha():
break
print("Please chars dude")
age = raw_input("Please type your age\n")
if age.isdigit():
break
print("Please digits only")
使用函数封装查询信息。 您可以传入验证测试功能:
def ask(question, validator, errormessage):
while True:
result = raw_input(question)
if not validator(result):
print(errormessage)
continue
return result
name = ask("NAME PLEASE\n", lambda s: s.isalpha(), "Please chars dude")
age = ask("Please type your age\n", lambda s: s.isdigit(), "Please digits only")
这比任何数量的测试都要可读得多,以确定用户是否已输入正确的名称,而您现在只需询问年龄。
为什么不使用功能并减少过程中的一些重复?
def ask_input(prompt, error_msg, validation_fn):
while True:
data = raw_input(prompt)
if validation_fn(data):
return data
print(error_msg)
name = ask_input("NAME PLEASE\n", "Please chars dude", lambda x: x.isalpha())
age = ask_input("Please type your age\n", "Please digits only",
lambda x: x.isdigit())
在这种情况下,向ask_input()
函数提供提示(询问用户的内容),错误消息(无效输入时提供的内容)和验证功能。 这隐藏了函数调用后面的while循环,并为您提供了更有意义的代码读取。
lambda函数只是帮助进行验证的简单方法。 你可以这样做:
def isalpha(x):
return x.isalpha()
def isdigit(x):
return x.isdigit()
name = ask_input("NAME PLEASE\n", "Please chars dude", isalpha)
age = ask_input("Please type your age\n", "Please digits only", isdigit)
您可以先将变量设置为None,然后在赋值之前检查它们:
name, age = None, None
while True:
if name is None:
name = str(raw_input("NAME PLEASE\n"))
if not name.isalpha():
print("Please chars dude")
name = None
continue
if age is None:
age = raw_input("Please type your age\n")
if not age.isdigit():
print("Please digits only")
age = None
continue
print("input is valid")
break
继续将重新开始循环。 这更适合代码的逻辑,因为break实际上会停止并退出循环代码。
尝试这个:
name = None
age = None
while requires_info:
if name is None:
temp_name = str(raw_input("NAME PLEASE\n"))
if temp_name.isalpha():
name = temp_name
continue
else:
print("Please chars dude")
continue
if age is None:
temp_age = raw_input("Please type your age\n")
if temp_age.isdigit():
age = temp_age
continue
else:
print("Please digits only")
continue
break
我们在这里做的是使用单个连续循环和一些if语句/变量来跟踪仍需要完成的工作。 请注意,根据您希望他们输入数据的方式,您还可以添加逻辑,以便在名称无效时不要求年龄。
只需使用标志来跟踪天气有效输入,如果给出则退出循环。
name_input_required = True
name = ''
while name_input_required:
name = str(raw_input("NAME PLEASE\n"))
if name.isalpha():
name_input_required = False
else:
print("Please chars dude")
age_input_required = True
age = None
while age_input_required:
age = raw_input("Please type your age\n")
if age.isdigit():
age_input_required = False
else:
print("Please digits only")
所以我有以下while语句,我想将它们组合起来。 因为如果你有20个这样的if语句,这会很烦人。
我认为实际的问题是“如何减少烦人的代码?” 而不是“如何将两个循环合并为一个?”。 我认为保持两个循环是个好主意 。
def safe_input(prompt, err_message, validation_fn):
while True:
value = raw_input(prompt)
if validation_fn(value):
return value
print err_message
name = safe_input("NAME PLEASE\n", "Please chars dude", str.isalpha)
age = safe_input("Please type your age\n", "Please digits only", str.isdigit)
如果您始终希望used在单独的行中输入文本,则可能需要在raw_input
之前print prompt
,并且不要为raw_input
提供参数。 这样你就不必在每次调用safe_input
都提供"\\n"
。
是的,你可以在一个循环中组合两个循环!
始终尝试逐行解决问题。
您将更好地学习语言,这也是解决任何问题的最简单方法。
逐行解决方案如下所示:
name = '' # define name outside while loop
while True:
if not name:
name = str(raw_input("NAME PLEASE\n"))
if not name.isalpha(): # validate name
print("Please chars dude")
# reset name
name = ''
else:
age = raw_input("Please type your age\n")
if age.isdigit(): # validate age
"""continue your code here"""
print('name: ' + name + ' and age: ' + age)
print('Ok! Goodbye!')
break # while loop
else:
print("Please digits only")
将打印:
NAME PLEASE
Elis
Please type your age
30
name: Elis and age: 30
Ok! Goodbye!
这将有助于您更好地理解while
循环以及如何在更困难的情况下使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.