파이썬의“한 가지 방법”에 대한 구체적인 예 maxim [closed]


34

나는 파이썬을 배우고 있으며 PEP 20 The Zen of Python 에서 다음과 같은 점에 흥미가 있습니다 .

그것을하는 명백한 방법이 있어야합니다. 비록 당신이 네덜란드 인이 아니라면 처음에는 그 방법이 분명하지 않을 수도 있습니다.

누구 든지이 최대의 구체적인 예를 제시 할 수 있습니까? 나는 루비와 같은 다른 언어와 대조적으로 특히 관심이 있습니다. Ruby 디자인 철학의 일부 (Perl에서 시작한 것 같아요?)는 여러 가지 방법으로이를 수행하는 것이 좋은 일이라는 것입니다. 누구나 각 접근법의 장단점을 보여주는 몇 가지 예를 제시 할 수 있습니까? 참고로, 나는 대답이 더 나은 (아마도 주관적으로 대답하기에는 너무 주관적인) 대답이 아니라 두 스타일의 편견없는 비교입니다.

답변:


47

Perl과 같은 언어와 비교하여 Python에는 제한된 수의 제어 구문이 있습니다.

  • 단지 if없고 unless,
  • 단지 for그 순서없이 반복 해 foreach또는 C 스타일 for,
  • 단지 while그 모든 루프없이 검사 조건 do-while,
  • 단지 if-elif없고 switch,
  • 주석 구성은 하나 뿐이며 #모든 행에 대해 이전 행을 보지 않고 주석 처리되었는지 여부를 알 수 있습니다.

또한 소스를 들여 쓰는 방법은 거의 한 가지가 있습니다. 창조적 들여 쓰기의 대부분의 경우는 구문 상으로 제외됩니다.

이를 통해 인간은 파이썬 소스를 더 쉽게 파싱 할 수 있습니다.

기본 제공 유형과 표준 라이브러리에서는 최소한의 완성 시도가 있습니다.

  • 가변 목록의 경우 유일한 내장 list유형 을 사용하십시오 . 대부분의 작업에서 O (1)이므로 올바른 구현을 선택할 필요가 없습니다.
  • 불변 목록의 경우 마찬가지로 tuple유형 만 사용하면 됩니다.
  • 지도의 dict경우 대부분의 경우 가장 효율적인 내장 기능 을 사용하므로 사용할 구현을 숙고 할 필요가 없습니다.

파이썬 3은 이것을 정수로 확장합니다 : 정수의 크기에 관계없이 동일한 유형을 사용하고 강제에 신경 쓰지 않습니다.

파이썬은 구문 설탕을 피하려고 시도합니다. 그러나 때로는 명백한 방법을 분명히하기 위해 구문 설탕을 첨가합니다. 'is not'이 특수한 경우가 아니라 if foo is not None대신 쓸 수 있습니다 if not (foo is None). 여전히 foo is not None쉽게 읽을 수 있고, 잘못 해석 될 수 없으며, 생각할 필요가 없습니다. 단지 명백한 것을 쓰면됩니다.

물론 파이썬에서 가장 복잡한 작업은 여러 가지 방법으로 수행 할 수 있습니다. 선언이나 간단한 슬롯 할당으로 클래스에 메소드를 추가 할 수 있으며, 여러 가지 창의적인 방식으로 함수에 인수를 전달할 수 있습니다. 이는 언어의 내부가 대부분 노출되기 때문입니다.

핵심은 항상 최선의 방법이 될 수있는 한 가지 방법이 있다는 것입니다. 다른 방법이있는 경우, 그들은 (같은 동일한 대안으로 추가되지 않은 ifunless)하지만 단지 내부 동작에 노출됩니다. 알려진 최선의 메커니즘을 향상시킴으로써 느리지 만 꾸준히 그러한 대안이 폐기된다 (제거되지 않음).

데코레이터는 AOP 함수 호출을 래핑합니다. 2.6 이전에는 __metaclass__매직 멤버 를 사용 하여 클래스의 메타 클래스를 선언해야했습니다. 이제 동일한 데코레이터 구문을 사용할 수도 있습니다. 3.0 이전에는 바이트 지향 문자열과 유니 코드라는 두 가지 종류의 문자열이 있었지만 실수로 섞을 수있었습니다. 이제 유일한 유니 코드 str와 유일한 바이너리 투명성 bytes이 있습니다. 실수로 혼합 할 수 없습니다.


3
참고로 """주석 (docstring)을 잊지 마십시오 . 이들은 여러 줄에 걸쳐 있습니다.
asthasr

8
삼중 인용 리터럴은 작은 따옴표와 동일한 문자열이지만 줄 끝을 벗어나지 않고 여러 줄에 걸쳐있을 수 있습니다. 선언 직후의 문자열 리터럴은 doc 문자열로 간주되며 주석이 아니며 일반적으로 __doc__속성 으로 액세스 할 수 있습니다 . 그러나 문자열은 파이썬이 분명히 많은 '올바른 방법'을 제공하는 영역입니다. 작은 따옴표, 큰 따옴표 또는 삼중 따옴표를 사용하거나 암시 적으로 인접한 리터럴을 결합하거나 r원시 리터럴을 사용 하는 등
9000

1
@syrion의 의견은 "줄을보고만으로 주석을 달 것인지 여부를 항상 결정할 수 있습니다"라고 생각합니다. "" "문자열 때문에 사실이 아닙니다.
blubb

2
"이것은 사람이 파이썬 소스를 더 쉽게 파싱 할 수있게 해줍니다." <-주관적입니다
jiggy

2.7에서 메타 클래스 선언은 어떻게 바뀌 었습니까? 메타 클래스의 2.7 개 문서에서 데코레이터 패턴을 찾을 수 없습니다.
Nick T

10

또 다른 두 가지 예는 다음과 같습니다.
len()모든 시퀀스에 존재하는 방법 대신 함수입니다. 자바와 비교한다면, 당신은 .length, .size(), .getSize()시퀀스의 요소 수를 찾기 위해, 그리고 다른 방법을.

또 다른 예는 사실 .join()A는 string방법이 아닌 각 시퀀스에서 본 방법. join 매개 변수가 목록, 집합, 이해 등 어떤 것이 든 작동하는지 알 필요가 없습니다.


8

C에는 변수의 값을 하나씩 증가시키는 여러 가지 방법이 있습니다.

i++     // Post-increment, returns the number before the increment
++i     // Pre-increment, returns the number after the increment
i += 1 

각각에 i의해 의 값이 증가 1하지만 각각 약간 다릅니다.

파이썬에는 실제로 한 가지 방법이 있습니다. 하나만 추가하십시오.

i += 1

이 작업을 수행 할 수있는 구문 상 유효한 방법이 두 가지 이상 있지만 (예 :) i = i + 1동일한 부작용으로 동일한 작업을 수행하고 있습니다.


1
나는 전문가는 아니지만, 그 예는 "단 하나의 방법"이라는 생각을 정확하게 위반 한 것 같습니다. 두 가지 방법이 있지만 더 확실한 방법은 무엇입니까? 내 눈에는 첫 번째 예가 더 분명하지만 두 번째 예는 약간 더 간결하지만 기본을 넘어서는 프로그래머에게는 읽기 어렵거나 명확하지 않습니다. 답변 주셔서 감사합니다-생각하기에 좋은 음식입니다.
찰스 로퍼

@Peter (및 @Charles) : 실제로 i = i + 1는 증분이 아니라 할당입니다. 파이썬에서 증분은 i += 1입니다. C 스타일 언어 i++에서는 ++i, 및을 쓸 수 있습니다 i += 1.
Josh K

2
"혼란의 많은"의견에 대해 잘 모르는 경우, 세 가지 C 예제 ( i += 1BTW 를 놓친 )는 모두 정확히 동일한 결과를 생성합니다. 사람들이 혼란스러워하는 것을 볼 수있는 유일한 시간은 더 큰 표현식의 일부로 변수를 사전 또는 사후 증가시킬 때 뿐이며, 일반적으로 언어 참조의 적절한 섹션을 읽음으로써 신속하게 수정됩니다. 개인적으로, 나는 당신이 모두 문자열의 다섯 번째 문자를 참조 할 수 있다는 사실을 포착 한 것 str[4]또는 *(str+4)... 너무 쉬웠다 아마도,하지만
TMN

2
@TMN : 일부 사례 max(i++, ++i)는 빠르게 수정할 수 없습니다. C에는 많은 "정의되지 않은"및 "구현에 따른"행동 사례가 있지만 모두 좋은 이유가 있지만 각각 함정을 만들 수 있습니다.
9000

@TMN : 4 [str]는 말할 것도 없습니다 (C에서는 유효하고 C ++에서는 유효하지 않을 수 있음).
Vagin

6

또 다른 가능성은 목록 이해력 일 수 있습니다. 파이썬에서는 다음과 같이 할 수 있습니다 .

new_list = []
    for item in list_of_items:
       if item < 10:
           new_list.append(item)

그러나 이것을하는 "명백한"방법 (네덜란드 인이거나 파이썬에 더 익숙한 경우)은 목록 이해와 같습니다.

new_list = [item for item in list_of_items if item < 10]

더 짧아지고, new_list는 한 단계로 생성되고, 더 빨리 믿으며, 우아합니다. 단점은 덜 명시 적이라고 생각할 수 있지만 일단 익숙해지면 명시 적이라고 생각합니다.


들여 쓰기와 코드의 경우 : 4 개의 공백을 앞에두고 들여 쓰기를 존중합니다.
잉카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.