在检查变量是真还是假之后,我在打印邮件时遇到问题。我想要做的是打印变量选择中的变量。必须有一个比下面更简单的方法,但这是我能想到的。我需要一个更好的解决方案或下面的修改才能使它发挥作用。
这是我的代码:
if (quirk) and not (minor, creator, nature):
print (quirk, item)
elif (minor) and not (quirk, creator, nature):
print (minor, item)
elif (creator) and not (minor, quirk, nature):
print (creator, item)
elif (nature) and not (minor, quirk, creator):
print (item, nature)
else:
print ("Something went wrong! Properties out of range! Nature =",nature,"Quirk =",quirk,"Minor =",minor,"Creator =",creator)
在这种情况下,我总是得到错误,而不是任何打印。该错误始终显示其中一个变量为真。
提前谢谢!
答案 0 :(得分:10)
你正在检查非空元组是否是伪造的 - 这是不正确的。请改用any
。
if quirk and not any([minor, creator, nature]):
print (quirk, item)
# and so on
如果集合中的任何元素为any([minor, creator, nature])
,则{p> True
会返回True
,否则会返回False
。
答案 1 :(得分:5)
(minor, creator, nature)
是一个元组。并且它始终在布尔上下文中评估为True
,而不管minor
,creator
和nature
的值。
这是documentation for Truth Value Testing所说的:
可以测试任何对象的真值,以便在if或while中使用 条件或下面的布尔运算的操作数。下列 值被视为错误:
- 无
- 假
- 任何数字类型的零,例如,0,0.0,0j。
- 任何空序列,例如'',(),[]。
- 任何空映射,例如{}。
- 用户定义类的实例,如果类定义 bool ()或 len ()方法,则该方法返回整数零或bool值False。
所有其他值都被认为是真的 - 所以很多类型的对象都是 总是如此。
您的非空序列属于“所有其他值”类别,因此被认为是真的。
要使用纯Python逻辑表达您的条件,您需要编写:
if quirk and not minor and not creator and not nature:
正如@Volatility指出的那样,any()
效用函数可用于简化代码并使其更清晰地读取。
答案 2 :(得分:1)
any
在这里感觉有些过分:
if quirk and not (minor or creator or nature):
print (quirk, item)
elif minor and not (quirk or creator or nature):
print (minor, item)
elif creator and not (minor or quirk or nature):
print (creator, item)
elif nature and not (minor or quirk or creator):
print (item, nature)
else:
print ("Something went wrong! Properties out of range! Nature =",nature,"Quirk =",quirk,"Minor =",minor,"Creator =",creator)