我继承了要重写为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语句来编写代码是否有特定的原因?是更快还是有其他好处?
答案 0 :(得分:1)
是的。
左侧为list comprehension
。你是正确的。它使用可迭代的bands
创建一个新列表,其中每个元素是int
为bands
的每个元素返回的值。
但是,如果bands
为None
,则将引发异常。因此,仅在bands is not None
时进行评估。如果bands
为None
,则它将[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]