2012-01-06 3 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 귀하의 람다 함수는 (내 대답을 참조) 잘못이 라인 등 길이 –

+0

실례에 대한 우려를 압도? 제 질문은 함수가 그것이하는 일을하는지 여부가 아니라, 당신이 맞다고해도 그것이 틀린 것입니다. 내 질문은 형식화하는 방법에 관한 것이었다. – noio

+0

의견을 요청했습니다. 너 하나있어. 가능한 경우 데이터 구조를 수정하십시오. 올바른 감속기 기능을 작성하십시오. 그런 다음 선 길이에 대해 걱정하십시오. –

답변

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

이것은 프로그래머와 상황에 달려 있다고 생각하지만 일반적으로 짧은 줄을 사용하기 위해 변수를 할당하는 것을 좋아하지 않습니다.

당신이 예를 보면, 나는 1 초 동안 이동하거나 한 것 :

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) 

정말 하나의 문자로 각 인수를 감소 :

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

변수를 할당 할 이유가 있습니까? 나는 긴 줄에 대해 어떤 결과에 좋은 ​​이름을 할당하면 코드가 훨씬 더 분명해진다. 플러스 기능 지역 주민은 꽤 싸다. –

+0

전혀 이유가 없습니다. 긴 줄을 나누는 것과 같은 개인적인 선택입니다. 나는 보통 그것이하는 일 (이름이나 이상의 코멘트에서)을 기술해야하는 좋은 함수 이름을 선호한다. – dresende

0

나는 다음을 제안 공간을 절약 할 수있어서이 모양을 더 깔끔하게 보입니다. 또 다른 옵션은 람다 함수를 별개의 줄 (아마도 def으로조차도)에 정의하여 인수가 처음부터 멀리 떨어져 있지 않도록하는 것입니다.

+0

-1 코드에 SO 가로 스크롤 막대가 표시됩니다. –

+0

@ JohnMachin - 좋은 지적으로, 줄이기 위해 여분의 선을 더했습니다. –

+0

여전히 들쭉날쭉하다. 들여 쓰기는 구문 구조와 아무런 관련이 없다. 그것은 너무 길지 않은 선들에 전적으로 기초를 둔 것처럼 보입니다. –

4

우선 긴 줄은 피하십시오. 당신이 변수를 피하기 위해 원하는 경우이 특정 예제는 또한 아직도 훨씬 더 읽기 원래 코드보다 찾을

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

을 사용할 수,

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 

으로 훨씬 더 판독 가능 기록 될 수 있습니다.

(나는 rects 여러 번 반복 할 수 있습니다 가정합니다.) 당신이 긴 줄을 걱정하는 경우

+1

더 읽기 쉽습니다. 예, 네 번의 반복이 가능합니까? – noio

+0

@ 노이 오 : 네 번의 반복으로 어떤 문제가 있습니까? (가치가있는 부분에 대해서는 내 버전이 내 컴퓨터보다 두 배 빠릅니다.) –

+0

@SvenMarnach 한 가지 문제는 버전에서 더 이상 생성기를 'rects'인수로 전달할 수 없다는 것입니다. – Bolo

1

람다 함수가 잘못되었습니다. 문제를 해결하려면 더 오래 걸리고 중복 계산이 필요합니다. a는 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)