Python:避免此代码的 if 条件?

标签 python if-statement control-flow

以下代码

a =func()
if a != None:
    b.append(a)

a可以赋值为None,有没有办法避免if语句只用一行代码?

原来的问题如下

import xml.etree.ElementTree as etree

r = etree.parse(f).getroot()
b = etree.Element('register',{})

a = r.find('tag_name') # a may get None if did not find it
if a != None:
    b.append(a)

好的,我用了所有的答案,得到了这个,我个人认为这是我迄今为止写过的最复杂的python,lol

NS_MAP = {
    'spirit' : 'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4',
    'app' : 'http://www.app.com/SPIRIT-app'
    }

mp=etree.Element('MemoryProperty', {'version':'alpha'})
mpt=etree.ElementTree(mp)


def copy_tags(tp, op, p, tn, ns='spirit'):
    c =  p.find('{%s}%s'%(NS_MAP[ns],tn))
    if c is not None:
        (op == '<-') and tp.append(c)
        return c    

for reg in regs:
    te = etree.Element('register',{})
    copy_tags(te,'<-',reg,'name')
    copy_tags(te,'<-',reg,'addressOffset')
    copy_tags(te,'<-',reg,'access')
    (lambda e, t: copy_tags(te,'<-',t,'usageConstraints',ns='app') if t is not None else None)(te, copy_tags(te,'|',reg,'vendorExtensions'))

    mp.append(te)

mpt.write('map_gen.xml')

最佳答案

如果您可以预先调用 func(),并且您想将测试和赋值语句组合成一个语句,那么您可以使用 if-else 表达式来执行此操作:

b += [a] if a is not None else []

如果 a 不是 None,那么这会将 [a] 添加到 b -- 本质上与 b.append(a) 的操作相同

如果a None,那么这会将[]添加到b,这将使b保持不变。

除非 b 是一个列表,否则这将不起作用,或者至少支持“+=”就地添加。如果不是 - 也许它是一些自定义对象,那么你应该能够做到这一点:

(b.append(a) if a is not None else None)

这是一个表达式,对其副作用进行评估,然后丢弃。如果 a 为无,则 b.append(a) call 永远不会被执行。在任何一种情况下,表达式的值都是 None,但我们不关心它,所以它被忽略了。

现在,如果你想将 func() 调用与 this 结合起来,那么你必须做一些不同的事情以避免调用 func 两次。如果你可以使用 "+="语法,那么你可以这样做:

b += filter(None, [func()])

filter(None, <list>)返回删除了所有假元素(不包括,但也包括 0 和 [])的列表。那么,这个语句会将 [func()] 或 [] 添加到 b。

[已编辑]

最后,对于最坏的情况:如果你不能多次调用 func(),并且你不能使用 b += <list> ,你需要接受0、""、[]等,只排除None你需要在一行中,这是最丑陋的代码行:

(lambda l, a: l.append(a) if a is not None else None)(b, func())

这本质上是@ekhumoro 的解决方案,压缩成一行。它定义了一个匿名函数,调用它,丢弃值,然后丢弃函数,都是为了副作用。

现在,这是一行代码,但它肯定不会比原始代码更容易阅读或理解。如果我是你,我会坚持原来的,或者遵循 @ekhumoro 的想法,即定义一个辅助函数并使用它。

关于Python:避免此代码的 if 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826521/

相关文章:

java - 不知道为什么这个带有字符串的 if 语句不起作用

python - 在 2 个 elif block 之间执行语句

swift3 - Swift 中的 nil 或 "empty"可数范围是多少?

Python - 使数据框的列与列表元素一致

javascript - 尝试使用按钮切换 bool 变量

javascript - 使用 Javascript 通过 if 语句更改样式表?

ruby - 在 Ruby 中,if/elsif/else 语句的从属 block 是否与作为参数传递的 'block' 相同?

python - 在 DataBrick 平台中为 PySpark API 安装 IsolationForest 的最佳做法是什么?

python - CNN模型预测

python - 获取 key 错误 : 61 while iterating through the rows