假设我的列表只有str
和None
,我想检查assign lowered strings into other variable,但是如果它是大写的或没有的,它应该呈现为None。在
检查None
和str.isupper()
的代码起作用:
for i in [None,'foo',None,'FOO',None,'bar']:
x = None if i is None or i.isupper() else i
print x
但否定条件不起作用:
^{pr2}$它返回AttributeError
:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'NoneType' object has no attribute 'isupper'
我喜欢@Brionius'编辑的答案,这里有一个更一般的形式,从列表中返回一个项目的dict,由一个判别函数返回的值(可能返回的不仅仅是True或False)。在
给予:
^{pr2}$Brionius的解决方案可以实现为:
您正在测试
i is not None or i.isupper()
。当i
是None
时,这不起作用:延迟求值;首先计算左边的参数,并且仅当
False
是第二个被求值的参数时。第一个是False
,如果i
是None
,所以右手表达式只计算为None.isupper()
。在{cde>{cde}而不是^ cd9}:
^{pr2}$上面的表达式是
i is None or i.isupper()
的正确逻辑反转。在或者在原始表达式周围使用
not (..)
:因为您使用的是正则的
for
循环,因此不需要在这里使用条件表达式;下面将赋值给现有的循环变量i
,就足够了:在返回
AttributeError
的代码中,这是因为如果i是none,它将继续执行or
语句的第二部分并检查i.isupper()
,但是None
没有isupper()
方法,因此会出现错误。在我可以建议另一种方法吗?在
相关问题 更多 >
编程相关推荐