繁体   English   中英

结合多个while语句python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM