자신의 언어로 독특하게 만드는 파이썬의 특징은 무엇입니까? [닫은]


12

자신의 언어로 독특하게 만드는 파이썬의 특징은 무엇입니까? 나는 좋은 것에서 나쁜 것, 유용한 것, 방해에 대한 구문, 실제 사용에 이르기까지 모든 종류의 특성을 찾고 있지만 모호하지 않은 관찰은 일반 개발자에게 가장 유용합니다.

나는 여기에 새로운 사람이므로 직관적 인 것들을 설명해야 할 수도 있습니다 ....


9
파이썬은 독창적이지 않으며 다른 언어에서는 볼 수없는 유일한 독창적 기능을 포함하지 않습니다.
SK-logic

10
내가 아는 유일한 언어는 Monty Python의 이름을 따서 명명되었습니다.
yannis

@ SK-logic 문제는 특성에 관한 것이며, 그 기능 중 일부는 기능 입니다. 파이썬 고유의 특성이 없습니까?
kojiro

@kojiro, 나는 "특성"에 대한 공식적인 정의를 본 적이 없으므로 추측하지 않는 것을 선호합니다.
SK-logic

1
@kojiro, PL 기능은 일반적으로 구문과 의미로 이해됩니다. 그리고 둘 다 공식적으로 정의되어 있습니다.
SK-logic

답변:


22

당신은 절대적으로 독특한 기능을 찾는 데 어려움을 겪을 것 입니다. 존재하는 대부분의 언어 기능은 처음부터 여러 언어로 채택되었습니다. 일부는 새롭고 여전히 불명확하거나 정당한 이유로 사망했기 때문에 드물게 나타날 수 있습니다. 그럼에도 불구하고 기능 조합을 살펴 보는 것이 좋습니다.

즉, Python의 여러 기능은 상대적으로 고유 한 조합을 만들어야합니다. 적어도 나는 대부분 중복되는 기능 세트를 가진 원격 언어가 대중적이며 실용적이라는 것을 알지 못합니다. 주석에서 언급했듯이 Ruby는 매우 가깝지만 그럼에도 불구하고 많은 차이점이 있습니다.

  • 메타 클래스 기반 메타 프로그래밍. 기본적으로 클래스 생성시 임의 코드 실행 있게 아주 좋은 수준의 사용자 정의 아주 조금 잡 끝에 작업 - 객체 관계형 매핑 (ORM)에 대한 예를 들면, 클라이언트 클래스는 같은 몇 가지 추가 라인을 평소와 같이 쓸 수있는 attr = SomeDataType()코드의 톤이 자동으로 생성됩니다. 이것의 예는 Django의 "models" 입니다.
  • 모든 것에 반복자를 사용하는 것이 좋습니다 . 이것은 3.x에서 특히 명백하며, 반복자 기반의 등가물을 가진 대부분의 목록 기반 대안이 후자를 선호하여 폐지되었습니다. 반복자는 컬렉션을위한 가장 보편적 인 인터페이스 역할을합니다 (실제로 메모리에있는 것과 한 번만 필요한 것이므로 아래 기능으로 생성). 수집에 구애받지 O(1)않고 공간 효율적인 ( 중간 결과를위한 공간은 자연스럽게 따라 오는 경우가 많으며 실제로는 한 번에 메모리에 모든 항목이 필요한 작업은 거의 없습니다), 컴포저 블 데이터 크 런칭이 훨씬 쉬워졌습니다.
  • 위와 관련된 생성기 표현식. 많은 사람들이 목록 이해에 대해 들어봤을 것입니다 (다른 반복 가능한 목록에서 목록을 작성하고 프로세스에서 매우 편리한 구문으로 필터링 및 매핑). 그것들을 잊어 버리십시오. 그것들은 구문 설탕이며 특별한 경우입니다. 생성기 표현식은 구문 적으로 매우 유사하고 결과적으로 동일한 항목 시퀀스를 생성하지만 결과는 느리게 생성됩니다 (따라서 O(1)명시 적으로 결과를 유지하지 않으면 공간을 차지함 ).
  • yield주로 이터레이터 (여기서는 제너레이터라고 함)를 작성하는 것이 훨씬 좋습니다. 그들은 모든 종류의 제어 흐름을 지원하는 위의 큰 형제입니다. C #은 동일한 키워드로 비슷한 것을 가지고 있습니다. 그러나 yield어려운 문제를 겪고있는 영리한 사람들에 의해 잘 활용되고있는 제한된 종류의 코 루틴 (예 : 루아는 더 정교한 지원을 제공)을 지원하기 위해 과부하 상태입니다. 내 머리 꼭대기의 두 가지 예 : 백 트레이싱을 사용하고 스택 제한이 없고 비동기 I / O (편리한 구문)가있는 재귀 강하 구문 분석 .
  • 다중 대상 할당 및 반복적 언 패킹. 스테로이드에 할당. 한 번에 여러 값을 할당 할 수있을뿐만 아니라 값을 for key, value in mapping.items()바꾸거나 반복 할 때조차도 알려진 길이 (정직하게는 대부분 튜플)의 반복 가능한 값을 여러 변수에 풀 수 있습니다. 3.x부터는 단일 항목을 사용하는 변수 몇 개와 남아있는 항목을 취하는 변수 몇 개를 지정할 수 있으므로 길이를 알 수없는 컬렉션에도 실용적입니다 first, *everything_in_between, last = values.
  • 설명자 , 아마도 속성 액세스를 사용자 정의하는 다양한 방법 중에서 가장 강력합니다. C #과 같은 속성이 있지만 특수 언어 지원은 없습니다. 정적 메서드, 클래스 메서드 등은 모두 설명 자로 구현됩니다. 그들은 일류 물건이기도합니다. 불과 일주일 전에 속성에서 반복적이고 까다로운 코드에 직면했습니다. 따라서 반복적 인 부분을 생성하고 propery객체로 감싸는 작은 함수를 작성했습니다 .
  • 순수한 오프사이드 규칙 (블록을 ​​구분하기위한 들여 쓰기). 나는 이것을 마지막으로 의도적으로 넣었다. 그것은 파이썬을 구별하지만, 일단 익숙해지면 일상 프로그래밍에서 실제로 눈에 띄지는 않습니다 (또는 적어도 저의 경험입니다).

나는 여전히 루비에서 조금 새로운 사람이지만 마지막 지점을 제외하고는 모두 맞았다 고 생각합니까? 내가 "고유 한"이라고 동의하는 어느 쪽이든 파이썬에서는 발견되지 않지만 "다른 최상위 언어에서는 일반적이지 않을 수 있습니다".
Rig

@Rig : Ruby 전문가는 아니지만 메타 클래스도 보지 못했습니다 (Ruby는 메타 프로그래밍과 관련하여 강력하지만 비슷한 목적으로 사용할 수 있지만 인상은 다르게 달성 된 것입니다). (코 루틴이있는 것처럼 보이지만) 반복 가능한 압축 풀기 (다중 대상 할당이 있음) 또는 Ruby의 디스크립터. 예, 루비와 파이썬은 겹칩니다. 그러나 차이점이 있습니다.

좋아요, +1 나에게, "스테로이드에 할당" "가난한 사람의 패턴 매칭"사실이지만, 그럼에도 불구하고 매우 유용하다 : I 좋겠 또한 통지 방법 유연한 기능을 전달 매개 변수 : *args**kwargs, 매개 변수 튜플 및 dicts을지도하는 고통 방법 등 .
9000

CLOS의 일반적인 lisp가 레이아웃 기반 구문의 사용을 제외한 모든 포인트에 도달한다고 생각합니다. Haskell은 객체 지향적이지 않지만 (OO 확장명이 있지만) 메타 클래스 포인트 이외는 모든 기능과 일치한다고 생각합니다.
Jules

3

파이썬을 독특하게 만드는 유일한 것은 그것이 노출하는 기능의 특정 조합이라고 생각합니다. 이것은 대부분의 프로그래밍 언어에 해당됩니다.

또는 하나의 작은 일이있을 수 있습니다 : 파이썬이 self다른 언어로 수행되는 객체 멤버 함수에 공식 매개 변수로 명시 적으로 전달하는 방식을 보지 못했습니다 . 그것은 작은 일이며, 이것이 이것이 실제로 어떻게 바뀌는지는 알 수 없습니다.

그러나 나는 파이썬에 유창하지 않기 때문에 내가 놓친 것들이있을 수 있습니다!


@delnan : 아, 나는 "명시 적으로 통과 놓친 자신을 ) .. 내가 새벽 2시 읽기 무엇을 얻을이의 추측 형식 매개 변수로"
데미안 브레히트

4
명시 적 자기 FWIW, 오베론도 발생
grrussel

명시 적 자체 매개 변수는 공통 lisp 오브젝트 시스템에서도 사용됩니다. 그러나 CLOS는 다중 메소드를 제공합니다. 즉, 자체 매개 변수는 파이썬에서와 같이 특별한 방식이 아닙니다.
Jules

1

docstring을 자동으로 처리하여 소유자의 속성이됩니다. 일반적으로 파이썬의 훌륭한 내부 검사 기능은 help () 사용부터 __doc__객체의 일류 속성으로 사용하는 기능에 이르기까지 매우 독특한 언어 입니다. 예를 들면 다음과 같습니다.

>>> class DocStringException(Exception):
...     """Error message is the same as docstring"""
...     def __str__(self):
...         return repr(self.__doc__)
... 
>>> class ExampleException(DocStringException):
...     """An example happened"""
... 
>>> raise ExampleException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.ExampleException: 'An example happened'

다른 유용한 내부 검사 기능 :

  • help / help ()-인터프리터 / 객체 도움말
  • 키워드-파이썬 키워드
  • locals ()-로컬 이름을 얻습니다
  • globals ()-전역 이름을 얻습니다
  • dir ()-객체의 속성과 메소드를 얻는다
  • .mro 방법. , issubclass-상속 이해
  • id ()-객체의 메모리 주소를 얻는다

Ruby는 Common Lisp, Clojure 및 기타 많은 동적 언어와 마찬가지로 동일한 기능을 가지고 있습니다.
Torbjørn

@ Torbjørn 어떤 힘? 자동 문서 또는 검사 기능?
kojiro

나는 둘 다에 대해 생각하고 있었다. 정확히 말한 것이 아니라 정신입니다. 루비가 동일한 문서 기능을 가지고 있다고는 생각하지 않지만 확실하게 내성적입니다. CL과 Clojure는 두 가지 기능을 모두 가지고 있습니다. 그리고 내성 (introspection)은 파이썬에서 찾을 수있는 것보다 훨씬 뛰어납니다 . 왜냐하면 그것은 homoiconic 이기 때문 입니다.
Torbjørn

1
  1. Generator Expressions
  2. input()설명해 드리겠습니다. 언제나 지금까지 언어를 보지 못했습니다. 여기서 무언가를 인쇄하는 명령문에 값을 할당 할 수 있습니다. 루비와 비슷 print/gets하지만 인쇄에 값이 할당 된 대신 다음과 같습니다.print "Foo" bar = gets
  3. yield
  4. 여러 유형의 데이터 세트 : ordereddict, namedtuple, array, list, tuple, dictionary

생성기 표현식은리스트 이해를 사용하여 Haskell에서 구현 될 수 있습니다 (파이썬리스트와 달리 Haskell리스트는 게 으르므로 이에 대한 특정 구문이 필요하지 않습니다). "입력"에 의해 나는 그 이름의 파이썬 3 기능을 의미한다고 가정합니다 (파이썬 2 기능은 위험하므로 사용해서는 안됩니다). 이것은 (비록 파이썬에서 빌린 것으로 추측되는 javascript-window.prompt-및 BASIC에 있지만) 행동의 특이한 조합이지만 사실 프로그래머가 사소하게 구현할 수 있습니다 ( "입력 = putStrLn s >> getStrLn "은 haskell에 대해 수행합니다).
Jules

Haskell과 같은 게으른 언어는 실제로 수확량을 필요로하지 않습니다. 일반적인 방법을 사용하여 작성된 목록을 반환 할 수 있으며 요청시 항목이 생성됩니다. 그럼에도 불구하고, 라이브러리에는 코 루틴의 명시적인 구현이 포함됩니다. Haskell 표준 라이브러리에는 언급 된 모든 데이터 구조 등이 포함되어 있습니다.
Jules

-2

문제는, 파이썬은 구문 적 오버 헤드가 극히 적은 언어로 극소수의 표현력을 제공합니다 :리스트 / 세트 / dict 이해력, 수율, 데코레이터, 평가, 메타 클래스 프로그래밍, 내성, 최적화 된 내장 데이터 구조 (리스트, dicts, sets), 그 모든 것들이 당신에게 (개발자) 생각할 수있는 한 간결하고 우아한 코드로 생각을 표현할 수있는 힘을주는 아주 좋은 방법으로 공모합니다. 이 킬러 기능 세트가 결합 된 다른 언어는 생각할 수 없습니다.


1
당신이 생각하는 경우 파이썬 (AN 음란 복잡한 문법과 구문 설탕 상대적으로 많은 양에도 불구하고) 낮은 구문 오버 헤드를 가지고, 당신은 계획에 대해 어떻게 생각하십니까?
Tikhon Jelvis

Eval은 실제로 어떤 프로덕션 프로그램에도 사용해서는 안됩니다 (빠른 해킹에 유용 할 수는 있지만). 다른 질문에 대한 의견에서 볼 수 있듯이, 파이썬은 이러한 기능을 갖는 데 결코 고유하지 않습니다. 예를 들어 clojure에는 목록에있는 모든 기능이 있으며 대부분 일반적인 lisp로 수행 할 수 있습니다.
Jules

-4

if 문과 루프를 묶는 데 들여 쓰기를 사용한다고 말하고 싶습니다. 다른 언어로는 보지 못했습니다.

파이썬 코드를 난독 화하기가 훨씬 어렵 기 때문에 매우 편리하다고 생각합니다!

또한 함수를 제외하고는 깔끔하게 한 줄씩 실행하는 것처럼 보이며, 또한 그렇게 해석 될 수 있습니다.


2
Wikipedia는 그 기능을 수행하는 언어로 가득 찬 화면을 알고 있습니다. 이를 오프사이드 규칙 이라고합니다 .

3
나는 이해하지 못한다. 함수를 제외하고는 깔끔하게 한 줄씩 실행하는 것처럼 보이며, 좋은 것으로 해석 될 수있다. 무슨 뜻인가요?
kojiro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.