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

5
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,使我重新执行该函数。
我在这里做错了什么?

你能更清楚地说明终止条件吗?也就是说,你想如何指示程序应该结束?还是只需要询问一次?(另外,你是否打算在这里使用递归?) - Levon
如果两个变量都有值,它应该打印最后一行。如果一个或多个变量没有值,则会要求用户重新输入这两个变量。 - Markum
6个回答

14

你已经很好地分离了问题:

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 会更好,因为只有一个 None 对象。

此外,更符合Python风格的做法是:

if not all((name, loca)):

或者,既然“全部”只是2个变量:

if not (name and loca):

如果你不理解,可以多看一些相关内容(Python教程非常好 - 可以先看条件语句部分)。祝好运!


4

试试这个

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

请注意,如果其中任何一个是空字符串(或任何假值),这也将无法通过测试。 - Casey Kuball

1

在运行ask()之后,nameloca都不可能是None。最坏的情况是它们是空字符串:''。你正在询问name是否为True,如果name具有任何值其他'',则为True

你想要做的是检查这些名称是否具有非空值:

if not (name and loca):
    …

应该没问题。


1
if name or loca == None:

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

  1. 首先,如果您没有输入任何数据,您将得到一个空字符串,而不是 None,所以 loca == None 将永远不会成立。

  2. 其次,您的 if 语句正在检查两件事情:是否 name 是真值(包含任何数据),以及是否 loca == None。您可能想要写成 if name == None or loca == None

结合这两点,您可以写成:

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

或者,简化并利用字符串包含数据时的“真实性”:
if not (name and loca):

0
将以下代码插入您的程序中,以获得您所需的行为:
if not name or not loca:
    print "Please enter valid details."
    ask()

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

这个版本专门允许空字符串,但防止None,并且比andor更容易扩展。虽然这意味着需要输入更多字符。

一个不错的好处是,这几乎读起来像正常的英语:如果任何字段为None...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接