我对此代码的分析是否正确,为什么要用这种方式编写?

时间:2019-06-21 14:46:53

标签: python loops if-statement tuples

我继承了要重写为OOP程序的python程序(更像是大量脚本)。我仍在学习Python,并遇到了我不确定的这一行代码。

不幸的是,我不知道该操作叫什么,所以我的搜索不是很成功。

bands = [int(b) for b in bands] if bands is not None else [10, 11]

我认为这段代码着眼于'bands'变量,如果不是'None',则循环遍历该变量并将列表中的每个条目强制转换为int。如果“ bands”为空,则将“ bands”设置为等于包含10和11的列表。

我对代码的分析正确吗?

虽然代码对我来说看起来很陌生,但有些倒退。有人想要以这种方式而不是普通的if语句来编写代码是否有特定的原因?是更快还是有其他好处?

2 个答案:

答案 0 :(得分:1)

是的。

左侧为list comprehension。你是正确的。它使用可迭代的bands创建一个新列表,其中每个元素是intbands的每个元素返回的值。

但是,如果bandsNone,则将引发异常。因此,仅在bands is not None时进行评估。如果bandsNone,则它将[10, 11]作为默认值。

了解所有理解(列表,字典,集合和生成器)。它们超级有用。

答案 1 :(得分:1)

您的分析是正确的。我会用不同的方式写出来,但是当Python提供了多种更简洁却又清晰易懂的方法时,我不会使用4行代码来仅初始化/清理变量。

以下是一些替代方案:

bands = [int(b) for b in bands] if bands else [10,11] # <-- I would have chosen this one
bands = [int(b) for b in bands or [10,11]]
bands = list(map(int,bands)) if bands else [10,11]
bands = list(map(int,bands or [10,11]))
bands = [*map(int,bands)] if bands or [10,11]
bands = [*map(int,bands or [10,11])]

# this is what I would NOT have done (too verbose and ignores Python's idioms):
if bands:
    bands = [int(b) for b in bands]
else:
    bands = [10,11]