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,让我重做这个功能。

我在这里做错了什么?

4

6 回答 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:

顺便说一下,None 比较最好用 进行is,因为只有一个None对象。

此外,一种更 Pythonic 的方式是:

if not all((name, loca)):

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

if not (name and loca):

如果您不明白,请阅读一下(Python 教程非常好——请阅读条件部分)。祝你好运!

于 2012-05-16T23:22:22.680 回答
4

试试这个

if not all([name, loca]):
   print "Please enter valid details"
   ask()
于 2012-05-16T23:21:19.890 回答
1

好吧,跑步之后也name不会loca也不会。在最坏的情况下,它们是空字符串:. 您正在做的是询问 if is ,如果它具有.Noneask()''nameTruename''

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

if not (name and loca):
    …

应该没事。

于 2012-05-16T23:23:32.260 回答
1
if name or loca == None:

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

  1. 首先,如果你不输入任何数据,你会得到一个空字符串, not None,所以loca == None永远不会是真的。

  2. 其次,您的if陈述正在检查两件事:是否name为真(包含任何数据),以及是否loca == None. 你可能的意思是if name == None or loca == None

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

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

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

if not (name and loca):
于 2012-05-16T23:24:11.610 回答
0

将此插入您的代码以获得您正在寻找的行为:

if not name or not loca:
    print "Please enter valid details."
    ask()
于 2012-05-16T23:25:29.050 回答
0
if any(field is None for field in (name, loca)):
    print "Please enter valid details."
    ask()

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

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

于 2012-05-16T23:28:12.163 回答