如何解读与展开Python嵌套推导式风格的复杂循环代码?
解读嵌套列表推导式的循环逻辑与展开方法
咱先把这段看起来有点绕的代码摆出来,方便一步步拆解:
for a in [np.transpose(np.array([list(B['v'][x]) + [0,1] for x in (face[0], face[1], face[2])])) for face in B['shape']]: facets.extend([np.do(r) * scale for x in inflate(a)])
一、先拆解核心逻辑
这段代码本质是嵌套列表推导式+for循环的组合,我们从里到外拆:
1. 最内层的列表推导式
先看最里面的[list(B['v'][x]) + [0,1] for x in (face[0], face[1], face[2])]:
- 它会遍历当前
face的前三个元素(也就是三个索引值face[0], face[1], face[2]) - 对每个索引
x,取出B['v'][x]转成列表,再拼接上[0,1],得到一个更长的列表 - 最终把这三个拼接后的列表攒成一个列表
2. 中间的数组处理
接着看包裹它的np.transpose(np.array(...)):
- 把上面得到的列表转成numpy数组,然后对数组做转置操作(行变列、列变行)
3. 外层的列表推导式
再往外的[... for face in B['shape']]:
- 遍历
B['shape']里的每一个face元素,对每个face执行上面两步操作 - 最终把所有转置后的numpy数组攒成一个大列表,这就是外层for循环中
a的迭代来源
4. 最外层的循环操作
最后看循环体里的facets.extend([np.do(r) * scale for x in inflate(a)]):
- 对每个
a,调用inflate(a)得到一个可迭代对象 - 遍历这个对象里的每个元素
x,计算np.do(r) * scale(这里大概率是笔误,应该是np.dot点积操作) - 把所有计算结果一次性添加到
facets列表中
二、展开成常规嵌套循环
为了让逻辑更清晰,我们把它拆成可读性更强的常规循环:
# 第一步:先生成原列表推导式对应的临时列表 temp_list = [] for face in B['shape']: inner_list = [] # 遍历当前face的三个索引 for x in (face[0], face[1], face[2]): # 取出对应值并拼接[0,1] combined_list = list(B['v'][x]) + [0, 1] inner_list.append(combined_list) # 转成数组并转置,加入临时列表 transposed_array = np.transpose(np.array(inner_list)) temp_list.append(transposed_array) # 第二步:遍历临时列表,处理每个a并更新facets for a in temp_list: items_to_add = [] for x in inflate(a): # 这里如果是np.dot的话,要根据实际参数修正,比如np.dot(r, x)之类的 calculated_item = np.do(r) * scale items_to_add.append(calculated_item) facets.extend(items_to_add)
这样拆分后,每一步的逻辑都一目了然,不管是调试还是修改都方便很多。
内容的提问来源于stack exchange,提问作者david z
相关产品推荐
相关产品推荐

