2012-09-03 4 views
0

이것은 아주 초록색 질문 일지 모르지만, 나는 당신이 이해하기를 바랍니다. 단지 비단뱀에 착수하여 개선하려고합니다. 어쨌든, 직교 좌표계에서 다각형의 영역을 찾는 "Shoelace Method"를 수행하는 작은 함수를 작성했습니다 (this 참조).이 기능을 개선하기위한 팁?

나는 어떻게하면 내 방법을 향상시킬 수 있는지 알고 싶다. 그래서 나는 똑같은 옛 일을하는 새로운 방법을 시도해 볼 수있다.

def shoelace(list): 
     r_p  = 0   # Positive Values 
     r_n  = 0   # Negative Values 

     x, y = [i[0] for i in list], [i[1] for i in list] 
     x.append(x[0]), y.append(y[0]) 

     print(x, y) 

     for i in range(len(x)): 
      if (i+1) < len(x): 
       r_p += (x[i] * y[i+1]) 
       r_n += (x[i+1] * y[i]) 
      else: 
       break 

     return ((abs(r_p - r_n))/2) 
+2

당신은 코드 검토 SE 사이트에 게시해야한다. – Usagi

+0

업데이트 해 주셔서 감사합니다. –

+4

팁 :'list'는 변수의 이름이 빌트인의 이름이기 때문에 나쁜 이름입니다. –

답변

0

기능적으로 프로그램은 상당히 좋습니다. 작은 언급은 range(len(x))xrange(len(x))으로 대체하는 것입니다. 프로그램을 약간 더 효율적으로 만듭니다. 일반적으로 실제로 생성 된 값의 전체 목록이 필요한 경우에만 range을 사용해야합니다. 이 값들을 루프하는 것이 필요한 경우 xrange을 사용하십시오.

또한 return 문이나 r_p +=r_n += 문에는 괄호가 필요하지 않습니다. 당신이했던 것처럼 변수 할당이 오히려 = 심볼의 각 측면에 하나의 공간,해서는 안 파이썬 스타일에 관한

:

r_p = 0 
r_n = 0 
+0

제안 해 주셔서 감사합니다. :) –

+0

반갑습니다. 내가 놓친 Burhan의 제안을 놓치지 마라. (월요일 아침) :'list'는 변수의 끔찍한 이름이다. – HerrKaputt

2
  • 짧은 변수를 사용하지 마십시오 주석이 필요한 이름; 함수를 나타내는 이름을 사용하십시오.

  • list은 내장 목록 유형의 이름이므로 Python이 해당 이름을 바꿀 수는 있지만 스타일이 좋지 않습니다.

  • ,은 진술로 간주되는 내용을 분리하는 데 사용하면 안됩니다. ;을 사용할 수 있지만 일반적으로 항목을 별도의 줄에 넣는 것이 좋습니다. 귀하의 경우에, 당신은 부작용에 .append을 사용하고 있기 때문에 일이 생기지 만, 기본적으로 당신이하고있는 것은 2-tuple (None, None) (반환 값은 .append)을 생성하고 버리는 것입니다.

  • 가능한 경우 표준 목록 변환에 기본 제공 함수를 사용하십시오. 예를 들어 zip에 대한 설명서를 참조하십시오. 당신이 정말로이 변환을 수행 할 필요는 없다는 것을 제외하고는; 인접한 점의 쌍을 고려해보고 싶으므로 루프 내부에서 좌표를 분리하십시오.

  • 그러나 쌍-인접 포인트의 당신이 훨씬 청소기 루프를 작성할 수 있습니다 :)의 목록에 포인트의 목록을 변환 zip를 사용할 수 있습니다. 아이디어는 간단합니다 : 먼저 원본과 관련된 모든 "다음"점의 목록을 만든 다음 zip 두 개의 점 목록을 함께 만듭니다.

  • return은 함수가 아니므로, return에 들어가는 것은 괄호를 둘러 쌀 필요가 없습니다.

  • 양수 값과 음수 값을 별도로 계산하는 대신 단일 값에 대해 부호있는 산술 연산을 수행하십시오.


def shoelace(points): 
    signed_double_area = 0 

    next_points = points[1:] + points[:1] 

    for begin, end in zip(points, next_points): 
     begin_x, begin_y = begin 
     end_x, end_y = end 
     signed_double_area += begin_x * end_y 
     signed_double_area -= end_x * begin_y 

    return abs(signed_double_area)/2 
관련 문제