在下面的函数中缩进/格式化该行的方法是什么?或者我不应该试着把它写成一个班轮吗?
def rects_bound(rects):
""" Returns a rectangle that bounds all given rectangles
"""
return reduce(lambda (ax,ay,aw,ah), (bx,by,bw,bh): (min(ax,bx),
min(ay,by),
max(ax+aw, bx+bw),
max(ay+ah, by+bh)), rects)
或者
def rects_bound(rects):
""" Returns a rectangle that bounds all given rectangles
"""
return reduce(lambda (ax,ay,aw,ah),
(bx,by,bw,bh): (min(ax,bx), min(ay,by),
max(ax+aw, bx+bw), max(ay+ah, by+bh)),
rects)
在这些情况下,我通常只是“有创意”,而且我知道可能没有“正确”的方式,我只是对你的意见和习惯感兴趣。
答案 0 :(得分:4)
首先,尽可能避免长线。
可以更容易地编写这个特殊的例子def rects_bound(rects):
x0 = min(x for x, y, w, h in rects)
y0 = min(y for x, y, w, h in rects)
x1 = max(x + w for x, y, w, h in rects)
y1 = max(y + h for x, y, w, h in rects)
return x0, y0, x1, y1
如果您想避免使用变量,也可以使用
def rects_bound(rects):
return (min(x for x, y, w, h in rects),
min(y for x, y, w, h in rects),
max(x + w for x, y, w, h in rects),
max(y + h for x, y, w, h in rects))
我发现它仍然比原始代码更具可读性。
(请注意,我假设rects
允许多次迭代。)
答案 1 :(得分:2)
我认为这取决于程序员和情况,但我通常不喜欢分配变量只是为了有更短的行。
看看你的两个例子,我会选择第二个,或者这个:
def rects_bound(rects):
""" Returns a rectangle that bounds all given rectangles
"""
return reduce(
lambda (ax,ay,aw,ah), (bx,by,bw,bh):
(min(ax,bx), min(ay,by), max(ax+aw, bx+bw), max(ay+ah, by+bh)
),
rects
)
答案 2 :(得分:2)
如果您担心排长队,请不要使用lambda
。改为使用常规命名函数。
def rects_bound(rects):
""" Returns a rectangle that bounds all given rectangles
"""
def bounding_rect_reducer((ax, ay, aw, ah), (bx, by, bw, bh)):
return (min(ax,bx),
min(ay,by),
max(ax+aw, bx+bw),
max(ay+ah, by+bh))
return reduce(bounding_rect_reducer, rects)
答案 3 :(得分:1)
你的lambda函数是错误的。要修复它会使它更长并涉及冗余计算。改为使用def:
def rects_bound(rects):
""" Returns a rectangle that bounds all given rectangles
"""
def bound_2_rects((ax, ay, aw, ah), (bx, by, bw, bh)):
x = min(ax, bx)
y = min(ay, by)
return x, y, max(ax+aw, bx+bw) - x, max(ay+ah, by+bh) - y
return reduce(bound_2_rects, rects)
答案 4 :(得分:0)
我建议如下:
def rects_bound(rects):
""" Returns a rectangle that bounds all given rectangles
"""
return reduce(lambda (X,Y,W,H), (x,y,w,h): (min(X,x), min(Y,y),
max(X+W, x+w),
max(Y+H, y+h)), rects)
将每个参数减少为单个字符确实可以节省空间,这有助于使其看起来更干净。另一种选择是在一个单独的行上定义lambda函数(甚至可能使用def
),这样参数就不会那么远了。