2

在检查变量是真还是假后,我无法打印消息。我想要做的是从一组变量中打印出真实的变量。必须有比下面更简单的方法,但这就是我能想到的。我需要更好的解决方案或对以下内容进行修改以使其正常工作。

这是我的代码:

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)

在这种情况下,我总是得到错误,而从来没有任何打印。该错误始终表明其中一个变量为真。

先感谢您!

4

3 回答 3

10

您正在检查一个非空元组是否是假的——这绝不是真的。改为使用any

if quirk and not any([minor, creator, nature]):
    print (quirk, item)
# and so on

any([minor, creator, nature])True如果集合中的任何元素是 则返回TrueFalse否则返回。

于 2013-04-28T11:49:53.520 回答
5
(minor, creator, nature)

是一个元组。并且它总是True在布尔上下文中求值,而与 和 的minorcreator无关nature

这就是真值测试的文档所说的:

可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。以下值被认为是错误的:

  • 没有任何
  • 错误的
  • 任何数字类型的零,例如 0、0.0、0j。
  • 任何空序列,例如,''、()、[]。
  • 任何空映射,例如 {}。
  • 用户定义类的实例,如果该类定义了bool () 或len () 方法,则当该方法返回整数零或 bool 值 False。

所有其他值都被认为是真的——所以许多类型的对象总是真的。

您的非空序列属于“所有其他值”类别,因此被视为正确。


要使用简单的 Python 逻辑来表达您的条件,您需要编写:

if quirk and not minor and not creator and not nature:

正如@Volatility 指出的那样,any()实用程序功能可用于简化您的代码并使其阅读更清晰。

于 2013-04-28T11:50:45.350 回答
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)
于 2013-04-28T12:53:29.280 回答