以更优雅和简洁的方式重写双重循环

12 投票
7 回答
35974 浏览
提问于 2025-04-16 08:41

我在想,下面的代码是否可以写得更好一些。基本上,我想要计算 z = f(x, y),这里的 (x, y) 是一个网格。

a = linspace(0, xr, 100)                                                                  
b = linspace(0, yr, 100)                                                                  

for i in xrange(100):
   for j in xrange(100):
      z[i][j] = f(a[i],b[j])

7 个回答

4

你可以使用 itertools 中的 product 函数:

[f(i,j) for i,j in product( a, b )]

如果你真的想把那5行代码缩减成1行的话,可以这样做:

[f(i,j) for i,j in product( linspace(0,xr,100), linspace(0,yr,100)]

如果你想更进一步,创建一个可以设置范围的函数,比如把0到100的范围改成其他值,可以这样做:

def ranged_linspace( _start, _end, _function ):
    def output_z( xr, yr ):
        return [_function( i, j ) for i,j in product( linspace( _start, xr, _end ), linspace( _start, yr, _end ) )]
    return output_z
8

你可以这样做

z = [[f(item_a, item_b) for item_b in b] for item_a in a]
30

是的,你在问题中展示的代码写得不错。

不要觉得代码行数少就“好”或“酷”。真正重要的是代码的清晰度、可读性和可维护性。其他人应该能理解你的代码(而且在12个月后,当你需要找出一个错误时,你自己也应该能理解它)。

很多程序员,尤其是年轻的程序员,认为“聪明”的解决方案是好的。其实并不是。Python社区的一个优点就是我们在这方面犯的错误比其他社区要少得多。

撰写回答