所以我有以下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")
如果我将它们组合在一起,则有人会在“年龄”字样中输入A-Z字符。然后代码重新开始,而没有保存名称'声明。我希望它能保存' name'如果它是正确的,只能从错误的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")
答案 0 :(得分:4)
使用函数封装查询信息。您可以传递验证测试功能:
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")
这比任何数量的测试都要可读得多,以确定用户是否已输入正确的名称,而您现在只需询问年龄。
答案 1 :(得分:3)
为什么不使用功能并减少过程中的一些重复?
s = df.groupby('paper id')['year'].max()
print (s)
paper id
3 1999
6 1997
Name: year, dtype: int64
print (s[3])
1999
在这种情况下,向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())
函数提供提示(询问用户的内容),错误消息(无效输入时提供的内容)和验证功能。这隐藏了函数调用后面的while循环,并为您提供了更有意义的代码读取。
lambda函数只是帮助进行验证的一种简单方法。你可以这样做:
ask_input()
答案 2 :(得分:1)
您可以先将变量设置为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 实际上会停止并退出循环代码。
答案 3 :(得分:0)
试试这个:
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语句/变量来跟踪仍需要完成的工作。请注意,根据您希望他们输入数据的方式,您还可以添加逻辑,以便在名称无效时不要求年龄。
答案 4 :(得分:0)
只需使用标记来跟踪天气有效输入,如果给出则退出循环。
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")
答案 5 :(得分:0)
所以我有以下while语句,我想将它们组合起来。因为如果你有20个具有所有不同的if语句,这会很烦人。
我认为actual problem是“如何减少烦人的代码?”而不是“如何将两个循环合并为一个?”。我认为保持两个循环是good idea。
print prompt
如果您始终希望用户在单独的行中输入文字,则可能需要在raw_input
之前raw_input
并且不要向"\n"
提供参数。这样,您无需在safe_input
的每次通话中提供{{1}}。
答案 6 :(得分:0)
是的,你可以在一个循环中组合两个循环!
始终尝试逐行解决问题 您将更好地学习语言,这也是解决任何问题的最简单方法。
逐行解决方案如下所示:
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
循环以及如何在更困难的情况下使用它。
不要使用冗余语言功能进行过度设计。它会使refactoring和debugging变得困难。