2012-01-06 38 views
1

什麼是一種漂亮的方式來縮進/格式化下面的函數中的行?還是我不應該試圖把它寫成一個班輪呢?格式化長蟒行

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

-1你的lambda函數是錯誤的(見我的回答)...這勝過關於線路長度等 – 2012-01-06 20:37:56

+0

請問什麼顧慮?我的問題不在於功能是否按照它所說的去做,儘管你說得對,它是錯誤的。我的問題是關於如何很好地格式化。 – noio 2012-01-06 21:51:30

+0

您徵求意見。你有一個。如果可以的話,修復你的數據結構。編寫正確的減速器功能。然後擔心行長。 – 2012-01-06 22:51:04

回答

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) 
2

我認爲這取決於程序員和情況,但我通常不喜歡分配變量只是爲了縮短行數。在你的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

是否有任何理由不分配變量?我發現,對於長長的行,給某個結果分配一個好名字會使代碼更加明顯。 Plus功能當地人很便宜。 – 2012-01-06 18:30:50

+0

沒有理由。這是一種個人選擇,就像分裂長隊一樣。我通常更喜歡有一個好的函數名稱,它應該描述它的作用(在名稱或上面的註釋中)。 – dresende 2012-01-12 15:27:44

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),以便參數不會在第一時間結束。

+0

-1您的代碼顯示了SO水平滾動條。 – 2012-01-06 18:58:00

+0

@JohnMachin - 好點,增加了一條額外的線,以減少它。 – 2012-01-06 19:04:09

+0

它仍然很難看:縮進與語法結構無關;它似乎完全基於這些線不太長。 – 2012-01-06 19:35:57

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

它更具可讀性,是的,但有四次迭代? – noio 2012-01-06 22:05:18

+0

@Noio:你有四個迭代的問題? (對於它的價值,我的版本比我的機器快兩倍。) – 2012-01-06 23:32:03

+0

@SvenMarnach一個問題是,在你的版本中,不能再傳遞一個生成器作爲'rects'參數。 – Bolo 2012-08-01 16:23:42

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)