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
,让我重做该功能。
我在这里做错了什么?
答案 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
后,loca
和None
都不能ask()
。在最坏的情况下,他们是空字符串:''
。您正在做的是询问name
True
是name
,如果''
的值其他而不是if not (name and loca):
…
。< / p>
您要做的是检查名称是否具有非空值:
{{1}}
应该没问题。
答案 3 :(得分:1)
if name or loca == None:
这绝不会触发,原因有两个:
首先,如果您没有输入任何数据,则会得到一个空字符串,而不是None
,因此loca == None
永远不会为真。
其次,您的if
语句正在检查两件事:name
是否真实(包含任何数据)以及是否loca == None
。你可能意味着if name == None or loca == None
。
结合这两件事,你可以写:
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
,并允许您比and
或or
更容易扩展它。但这确实意味着要输入更多字符。
一个很好的特权是,这几乎就像正确的英语:如果任何字段是无...