结合多个while语句python

时间:2017-11-26 11:26:02

标签: python python-2.7 while-loop

所以我有以下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")

7 个答案:

答案 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循环以及如何在更困难的情况下使用它。

不要使用冗余语言功能进行过度设计。它会使refactoringdebugging变得困难。