python 中的分离和成员资格
Disjunction and membership in python
我环顾四周没能找到这个问题的答案,所以我放弃了,做了一个post。
我一直在寻找关于以下执行中发生的事情的解释:
a = ['b']
if 'i' or 'j' in a:
print('Yes!')
else:
print('No!')
输出为'Yes!'。 Flake8 和 python 不会抱怨错误或错误的形式。
执行过程中发生了什么导致 if 语句的值为 True?有没有人可以给我提供一些参考?
此致,
尼尔斯
问题在于语句 i
的计算结果为 True
,这意味着语句为:True or 'j' in a
。这始终是正确的,您的结果将始终是 'Yes!'.
您可以使用类似这样的方法来检查列表中是否有一个值:
a = ['b']
chars_to_check = ['i', 'j']
filtered_list = [i for i in a if i in chars_to_check]
if len(filtered_list)>0:
print('Yes!')
else:
print('No!')
示例来自 this question,人们还发布了针对您的问题的更有效或更短的解决方案。我最喜欢的解决方案是这个:
a = ['b']
if {'i','j'} & set(a):
print('Yes!')
else:
print('No!')
编辑:我想现在我明白了这个问题。
首先,python 发现您的 if 语句中有一个 or
。这意味着首先评估第一个表达式(在您的情况下为 'i'
)。如果第一个表达式是 True
,则整个语句是 True
,甚至不计算第二个表达式。 or
的求值顺序以here为例进行说明。
现在解释为什么第一个表达式总是 True
。 Python 自动评估所有对象,而不仅仅是 boolean
值。为此,对象可以包含一个函数 __bool__()
,返回对象的 boolean
值。您的对象是单个字符 'i'
,计算结果为 True
。原因是定义了字符串的布尔值总是True
,除了空字符串(''
)。在这里你可以看到评估的例子:
print(bool('i')) # True
print(bool('')) # False
显示哪些对象被视为 False
以及哪些被视为 True
的答案,您能找到 .
我环顾四周没能找到这个问题的答案,所以我放弃了,做了一个post。
我一直在寻找关于以下执行中发生的事情的解释:
a = ['b']
if 'i' or 'j' in a:
print('Yes!')
else:
print('No!')
输出为'Yes!'。 Flake8 和 python 不会抱怨错误或错误的形式。
执行过程中发生了什么导致 if 语句的值为 True?有没有人可以给我提供一些参考?
此致, 尼尔斯
问题在于语句 i
的计算结果为 True
,这意味着语句为:True or 'j' in a
。这始终是正确的,您的结果将始终是 'Yes!'.
您可以使用类似这样的方法来检查列表中是否有一个值:
a = ['b']
chars_to_check = ['i', 'j']
filtered_list = [i for i in a if i in chars_to_check]
if len(filtered_list)>0:
print('Yes!')
else:
print('No!')
示例来自 this question,人们还发布了针对您的问题的更有效或更短的解决方案。我最喜欢的解决方案是这个:
a = ['b']
if {'i','j'} & set(a):
print('Yes!')
else:
print('No!')
编辑:我想现在我明白了这个问题。
首先,python 发现您的 if 语句中有一个 or
。这意味着首先评估第一个表达式(在您的情况下为 'i'
)。如果第一个表达式是 True
,则整个语句是 True
,甚至不计算第二个表达式。 or
的求值顺序以here为例进行说明。
现在解释为什么第一个表达式总是 True
。 Python 自动评估所有对象,而不仅仅是 boolean
值。为此,对象可以包含一个函数 __bool__()
,返回对象的 boolean
值。您的对象是单个字符 'i'
,计算结果为 True
。原因是定义了字符串的布尔值总是True
,除了空字符串(''
)。在这里你可以看到评估的例子:
print(bool('i')) # True
print(bool('')) # False
显示哪些对象被视为 False
以及哪些被视为 True
的答案,您能找到