检查所有变量之一是否为空

时间:2012-05-16 23:16:13

标签: python variables

def ask():
    global name, loca

    print "What's your name?"
    name = raw_input('> ')
    print "Where are you from?"
    loca = raw_input('> ')

    if name or loca == None:
        print "Please enter valid details."
        ask()

ask()
print "Alright, so you're " + name + ", from " + loca + "."

使用此脚本,如果我的两个变量都为空,它将只打印最后一行。如果我填写其中一个或两个,它会触发if,让我重做该功能。

我在这里做错了什么?

6 个答案:

答案 0 :(得分:11)

你已经很好地孤立了这个问题:

if name or loca == None:

在这里你认为它说:

"If either name or loca equal none:"

但相反它说:

"if (name) is true or (loca equals None) is true:"

它应该说:

"if (name equals none) is true or (loca equals none) is true:"

这是:

if name is None or loca is None:

顺便说一句,请参阅使用is更好地执行无比较,因为只有一个None对象。

此外,更加抒情的做法是:

if not all((name, loca)):

或者,视为“全部”,它只是2个变量:

if not (name and loca):

如果您不理解,请仔细阅读(Python教程非常好 - 请参阅条件部分)。祝你好运!

答案 1 :(得分:4)

试试这个

if not all([name, loca]):
   print "Please enter valid details"
   ask()

答案 2 :(得分:1)

运行name后,locaNone都不能ask()。在最坏的情况下,他们是空字符串:''。您正在做的是询问name Truename,如果''的值其他而不是if not (name and loca): … 。< / p>

您要做的是检查名称是否具有非空值:

{{1}}

应该没问题。

答案 3 :(得分:1)

if name or loca == None:

这绝不会触发,原因有两个:

  1. 首先,如果您没有输入任何数据,则会得到一个空字符串,而不是None,因此loca == None 永远不会为真。

  2. 其次,您的if语句正在检查两件事:name是否真实(包含任何数据)以及是否loca == None。你可能意味着if name == None or loca == None

  3. 结合这两件事,你可以写:

    if name == "" or loca == "":
    

    或者,如果字符串包含数据,则简化并利用字符串“真实”的事实:

    if not (name and loca):
    

答案 4 :(得分:0)

将其插入到您的代码中以获取您正在寻找的行为:

if not name or not loca:
    print "Please enter valid details."
    ask()

答案 5 :(得分:0)

if any(field is None for field in (name, loca)):
    print "Please enter valid details."
    ask()

此版本专门用于允许空字符串,但阻止None,并允许您比andor更容易扩展它。但这确实意味着要输入更多字符。

一个很好的特权是,这几乎就像正确的英语:如果任何字段是无...