以更优雅和简洁的方式重写双重循环
我在想,下面的代码是否可以写得更好一些。基本上,我想要计算 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社区的一个优点就是我们在这方面犯的错误比其他社区要少得多。