etc./StackOverFlow

Python의 숨겨진 기능

청렴결백한 만능 재주꾼 2022. 7. 9. 02:49
반응형

질문자 :Community Wiki


Python 프로그래밍 언어의 덜 알려져 있지만 유용한 기능은 무엇입니까?

  • Python 코어에 대한 답변을 제한하십시오.
  • 답변당 하나의 기능.
  • 문서에 대한 링크뿐만 아니라 기능에 대한 예와 간단한 설명을 제공하십시오.
  • 제목을 첫 번째 줄로 사용하여 지형지물에 레이블을 지정합니다.

답변에 대한 빠른 링크:



비교 연산자 연결:

 >>> x = 5 >>> 1 < x < 10 True >>> 10 < x < 20 False >>> x < 10 < x*10 < 100 True >>> 10 > x <= 9 True >>> 5 == x > 4 True

경우에 당신은 뭐하는거야 생각하고 1 < x 로 나오고있는 True 비교 다음과 True < 10 도없는, True (마지막 예제를 참조하십시오.) 정말로 번역있어 정말로 무슨 일이야 그 다음에는, 1 < x and x < 10 , 그리고 x < 10 and 10 < x * 10 and x*10 < 100 하지만 입력 횟수가 적고 각 용어는 한 번만 평가됩니다.


Community Wiki

python regex 구문 분석 트리를 가져와 정규식을 디버그합니다.

정규식은 파이썬의 훌륭한 기능이지만 디버깅은 고통스러울 수 있으며 정규식이 잘못되기가 너무 쉽습니다.

re.DEBUG (실제로는 128)를 re.compile 에 전달하여 정규식 구문 분석 트리를 인쇄할 수 있습니다.

 >>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]", re.DEBUG) at at_beginning literal 91 literal 102 literal 111 literal 110 literal 116 max_repeat 0 1 subpattern None literal 61 subpattern 1 in literal 45 literal 43 max_repeat 1 2 in range (48, 57) literal 93 subpattern 2 min_repeat 0 65535 any None in literal 47 literal 102 literal 111 literal 110 literal 116

구문을 이해하면 오류를 찾을 수 있습니다. 거기에서 [/font] [] 이스케이프를 잊어버린 것을 볼 수 있습니다.

물론 주석 처리된 정규식과 같이 원하는 플래그와 결합할 수 있습니다.

 >>> re.compile(""" ^ # start of a line \[font # the font tag (?:=(?P<size> # optional [font=+size] [-+][0-9]{1,2} # size specification ))? \] # end of tag (.*?) # text between the tags \[/font\] # end of the tag """, re.DEBUG|re.VERBOSE|re.DOTALL)

Community Wiki

세다

iterable을 enumerate로 감싸면 인덱스와 함께 항목이 생성됩니다.

예를 들어:

 >>> a = ['a', 'b', 'c', 'd', 'e'] >>> for index, item in enumerate(a): print index, item ... 0 a 1 b 2 c 3 d 4 e >>>

참조:


Community Wiki

제너레이터 객체 생성

당신이 쓰는 경우

 x=(n for n in foo if bar(n))

생성기를 꺼내 x에 할당할 수 있습니다. 이제 당신이 할 수 있다는 것을 의미합니다

 for n in x:

이것의 장점은 중간 저장소가 필요하지 않다는 것입니다.

 x = [n for n in foo if bar(n)]

어떤 경우에는 상당한 속도 향상으로 이어질 수 있습니다.

기본적으로 중첩 for 루프를 복제하여 생성기 끝에 많은 if 문을 추가할 수 있습니다.

 >>> n = ((a,b) for a in range(0,2) for b in range(4,6)) >>> for i in n: ... print i (0, 4) (0, 5) (1, 4) (1, 5)

Community Wiki

iter()는 호출 가능한 인수를 취할 수 있습니다.

예를 들어:

 def seek_next_line(f): for c in iter(lambda: f.read(1),'\n'): pass

iter(callable, until_value) 함수는 callable until_value 가 반환될 때까지 그 결과를 산출합니다.


Community Wiki

변경 가능한 기본 인수에 주의

 >>> def foo(x=[]): ... x.append(1) ... print x ... >>> foo() [1] >>> foo() [1, 1] >>> foo() [1, 1, 1]

대신 "not given"을 나타내는 센티넬 값을 사용하고 기본값으로 원하는 변경 가능한 값으로 대체해야 합니다.

 >>> def foo(x=None): ... if x is None: ... x = [] ... x.append(1) ... print x >>> foo() [1] >>> foo() [1]

Community Wiki

값을 생성기 함수로 보내기 . 예를 들어 다음 기능이 있습니다.

 def mygen(): """Yield 5 until something else is passed back via send()""" a = 5 while True: f = (yield a) #yield a and possibly get f in return if f is not None: a = f #store the new value

다음을 수행할 수 있습니다.

 >>> g = mygen() >>> g.next() 5 >>> g.next() 5 >>> g.send(7) #we send this back to the generator 7 >>> g.next() #now it will yield 7 until we send something else 7

Community Wiki

공백을 사용하여 범위를 표시하는 것을 원하지 않는 경우 다음을 실행하여 C 스타일 {}를 사용할 수 있습니다.

 from __future__ import braces

Community Wiki

슬라이스 연산자의 단계 인수입니다. 예를 들어:

 a = [1,2,3,4,5] >>> a[::2] # iterate over the whole list in 2-increments [1,3,5]

특별한 경우 x[::-1] 은 'x reversed'에 대한 유용한 관용구입니다.

 >>> a[::-1] [5,4,3,2,1]

Community Wiki

데코레이터

데코레이터를 사용하면 기능을 추가하고 인수 또는 결과를 수정할 수 있는 다른 함수로 함수 또는 메서드를 래핑할 수 있습니다. "at" 기호(@)로 시작하여 함수 정의 위에 한 줄에 데코레이터를 작성합니다.

예제는 호출하기 전에 데코레이팅된 함수의 인수를 인쇄 print_args

 >>> def print_args(function): >>> def wrapper(*args, **kwargs): >>> print 'Arguments:', args, kwargs >>> return function(*args, **kwargs) >>> return wrapper >>> @print_args >>> def write(text): >>> print text >>> write('foo') Arguments: ('foo',) {} foo

Community Wiki

for...else 구문( http://docs.python.org/ref/for.html 참조 )

 for i in foo: if i == 0: break else: print("i was never 0")

"else" 블록은 break가 호출되지 않는 한 일반적으로 for 루프의 끝에서 실행됩니다.

위의 코드는 다음과 같이 에뮬레이트될 수 있습니다.

 found = False for i in foo: if i == 0: found = True break if not found: print("i was never 0")

Community Wiki

2.5부터 dicts에는 누락된 항목에 대해 호출 __missing__

 >>> class MyDict(dict): ... def __missing__(self, key): ... self[key] = rv = [] ... return rv ... >>> m = MyDict() >>> m["foo"].append(1) >>> m["foo"].append(2) >>> dict(m) {'foo': [1, 2]}

defaultdict 라는 collections dict 하위 클래스가 있습니다. 이 하위 클래스는 거의 동일하지만 존재하지 않는 항목에 대한 인수 없이 함수를 호출합니다.

 >>> from collections import defaultdict >>> m = defaultdict(list) >>> m["foo"].append(1) >>> m["foo"].append(2) >>> dict(m) {'foo': [1, 2]}

나는 그러한 딕셔너리를 그러한 서브클래스를 기대하지 않는 함수에 전달하기 전에 일반 딕셔너리로 변환하는 것이 좋습니다. 많은 코드가 d[a_key] 하고 KeyErrors를 포착하여 dict에 새 항목을 추가할 항목이 있는지 확인합니다.


Community Wiki

인플레이스 값 스와핑

 >>> a = 10 >>> b = 5 >>> a, b (10, 5) >>> a, b = b, a >>> a, b (5, 10)

할당의 오른쪽은 새 튜플을 생성하는 표현식입니다. 할당의 왼쪽은 해당 (참조되지 않은) 튜플을 ab 이름으로 즉시 압축을 풉니다.

할당 후, 새로운 튜플 참조되지 않은되며 가비지 컬렉션을위한 표시와 결합 값 와 a b 교환하고있다.

데이터 구조에 대한 Python 튜토리얼 섹션에서 언급했듯이,

다중 할당은 실제로 튜플 패킹과 시퀀스 언패킹의 조합일 뿐입니다.


Community Wiki

읽을 수 있는 정규식

Python에서는 정규식을 여러 줄로 분할하고 일치 항목의 이름을 지정하고 주석을 삽입할 수 있습니다.

자세한 구문의 예( Dive into Python ):

 >>> pattern = """ ... ^ # beginning of string ... M{0,4} # thousands - 0 to 4 M's ... (CM|CD|D?C{0,3}) # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's), ... # or 500-800 (D, followed by 0 to 3 C's) ... (XC|XL|L?X{0,3}) # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's), ... # or 50-80 (L, followed by 0 to 3 X's) ... (IX|IV|V?I{0,3}) # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's), ... # or 5-8 (V, followed by 0 to 3 I's) ... $ # end of string ... """ >>> re.search(pattern, 'M', re.VERBOSE)

이름 지정 일치의 예( 정규 표현식 HOWTO에서 )

 >>> p = re.compile(r'(?P<word>\b\w+\b)') >>> m = p.search( '(((( Lots of punctuation )))' ) >>> m.group('word') 'Lots'

문자열 리터럴 연결 덕분에 re.VERBOSE 를 사용하지 않고 정규식을 장황하게 작성할 수도 있습니다.

 >>> pattern = ( ... "^" # beginning of string ... "M{0,4}" # thousands - 0 to 4 M's ... "(CM|CD|D?C{0,3})" # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's), ... # or 500-800 (D, followed by 0 to 3 C's) ... "(XC|XL|L?X{0,3})" # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's), ... # or 50-80 (L, followed by 0 to 3 X's) ... "(IX|IV|V?I{0,3})" # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's), ... # or 5-8 (V, followed by 0 to 3 I's) ... "$" # end of string ... ) >>> print pattern "^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$"

Community Wiki

함수 인수 풀기

*** 사용하여 목록 또는 사전을 함수 인수로 압축을 풀 수 있습니다.

예를 들어:

 def draw_point(x, y): # do some magic point_foo = (3, 4) point_bar = {'y': 3, 'x': 2} draw_point(*point_foo) draw_point(**point_bar)

목록, 튜플 및 사전이 컨테이너로 널리 사용되기 때문에 매우 유용한 단축키입니다.


Community Wiki

ROT13은 코드 파일 상단에서 올바른 코딩 선언을 사용할 때 소스 코드에 대한 유효한 인코딩입니다.

 #!/usr/bin/env python # -*- coding: rot13 -*- cevag "Uryyb fgnpxbiresybj!".rapbqr("rot13")

Community Wiki

완전히 동적인 방식으로 새 유형 만들기

 >>> NewType = type("NewType", (object,), {"x": "hello"}) >>> n = NewType() >>> nx "hello"

정확히 같은 것

 >>> class NewType(object): >>> x = "hello" >>> n = NewType() >>> nx "hello"

아마도 가장 유용한 것은 아니지만 알아두면 좋을 것입니다.

편집 : 새 유형의 고정된 이름은 NewType class 문과 정확히 동일해야 합니다.

편집 : 기능을 보다 정확하게 설명하기 위해 제목을 조정했습니다.


Community Wiki

컨텍스트 관리자 및 " with " 문

PEP 343에 도입된 컨텍스트 관리자 는 일련의 명령문에 대한 런타임 컨텍스트 역할을 하는 개체입니다.

이 기능은 새 키워드를 사용하기 때문에 점진적으로 도입됩니다. Python 2.5에서 __future__ 지시문을 통해 사용할 수 있습니다. Python 2.6 이상(Python 3 포함)에서는 기본적으로 사용할 수 있습니다.

나는 그것이 매우 유용한 구조라고 생각하기 때문에 "with" 문 을 많이 사용했습니다. 여기에 빠른 데모가 있습니다.

 from __future__ import with_statement with open('foo.txt', 'w') as f: f.write('hello!')

무대 뒤에서 일어나는 일은 "with" 문 이 파일 객체에 대해 __enter____exit__ 메소드를 호출한다는 것입니다. with 문 본문에서 예외가 발생한 경우 예외 세부 정보도 __exit__

이 특별한 경우에 이것이 당신에게 하는 일은 그것이 정상적으로 발생하는지 또는 예외가 던져졌는지 여부에 관계없이 with 제품군의 범위를 벗어날 때 파일이 닫히도록 보장한다는 것입니다. 기본적으로 일반적인 예외 처리 코드를 추상화하는 방법입니다.

이에 대한 다른 일반적인 사용 사례에는 스레드 및 데이터베이스 트랜잭션을 사용한 잠금이 포함됩니다.


Community Wiki

사전에는 get() 메서드가 있습니다.

사전에는 'get()' 메서드가 있습니다. d['key'] 하고 키가 없으면 예외가 발생합니다. d.get('key')를 수행하면 'key'가 없으면 None을 반환합니다. None 대신 두 번째 인수를 추가하여 해당 항목을 다시 가져올 수 있습니다(예: d.get('key', 0)).

숫자를 더하는 것과 같은 작업에 유용합니다.

sum[value] = sum.get(value, 0) + 1


Community Wiki

설명자

그것들은 핵심적인 파이썬 기능의 이면에 있는 마법입니다.

점으로 구분된 액세스를 사용하여 멤버(예: xy)를 조회하면 Python은 먼저 인스턴스 사전에서 멤버를 찾습니다. 찾지 못하면 클래스 사전에서 찾습니다. 클래스 사전에서 찾고 객체가 디스크립터 프로토콜을 구현하면 단순히 반환하는 대신 Python이 이를 실행합니다. __get__ , __set__ 또는 __delete__ 메서드를 구현하는 모든 클래스입니다.

설명자를 사용하여 고유한(읽기 전용) 속성 버전을 구현하는 방법은 다음과 같습니다.

 class Property(object): def __init__(self, fget): self.fget = fget def __get__(self, obj, type): if obj is None: return self return self.fget(obj)

내장 property()처럼 사용할 수 있습니다.

 class MyClass(object): @Property def foo(self): return "Foo!"

설명자는 Python에서 속성, 바인딩된 메서드, 정적 메서드, 클래스 메서드 및 슬롯을 구현하는 데 사용됩니다. 그것들을 이해하면 이전에 파이썬 '특이한 것들'처럼 보였던 많은 것들이 왜 그런 것인지 쉽게 알 수 있습니다.

Raymond Hettinger는 나보다 훨씬 더 잘 설명 하는 훌륭한 튜토리얼을 가지고 있습니다.


Community Wiki

조건부 할당

 x = 3 if (y == 1) else 2

"y가 1이면 x에 3을 할당하고, 그렇지 않으면 x에 2를 할당"과 같은 소리를 냅니다. 괄호는 필요하지 않지만 가독성을 위해 괄호를 좋아합니다. 더 복잡한 것이 있는 경우 연결할 수도 있습니다.

 x = 3 if (y == 1) else 2 if (y == -1) else 1

어느 시점에서, 그것은 조금 너무 멀리 간다.

모든 표현식에서 if ... else를 사용할 수 있습니다. 예를 들어:

 (func1 if y == 1 else func2)(arg1, arg2)

여기서 func1은 y가 1이면 호출되고, 그렇지 않으면 func2가 호출됩니다. 두 경우 모두 해당 함수는 인수 arg1 및 arg2와 함께 호출됩니다.

유사하게 다음도 유효합니다.

 x = (class1 if y == 1 else class2)(arg1, arg2)

여기서 class1과 class2는 두 개의 클래스입니다.


Community Wiki

Doctest : 문서화와 단위 테스트를 동시에 수행합니다.

Python 문서에서 추출한 예:

 def factorial(n): """Return the factorial of n, an exact integer >= 0. If the result is small enough to fit in an int, return an int. Else return a long. >>> [factorial(n) for n in range(6)] [1, 1, 2, 6, 24, 120] >>> factorial(-1) Traceback (most recent call last): ... ValueError: n must be >= 0 Factorials of floats are OK, but the float must be an exact integer: """ import math if not n >= 0: raise ValueError("n must be >= 0") if math.floor(n) != n: raise ValueError("n must be exact integer") if n+1 == n: # catch a value like 1e300 raise OverflowError("n too large") result = 1 factor = 2 while factor <= n: result *= factor factor += 1 return result def _test(): import doctest doctest.testmod() if __name__ == "__main__": _test()

Community Wiki

명명된 서식

% -formatting은 사전을 사용합니다(%i/%s 등의 유효성 검사도 적용).

 >>> print "The %(foo)s is %(bar)i." % {'foo': 'answer', 'bar':42} The answer is 42. >>> foo, bar = 'question', 123 >>> print "The %(foo)s is %(bar)i." % locals() The question is 123.

그리고 locals()는 또한 사전이기 때문에 그것을 사전으로 전달하고 로컬 변수에서 % -substitions를 가질 수 있습니다. 나는 이것이 눈살을 찌푸리지만 일을 단순화한다고 생각합니다.

새로운 스타일 서식

 >>> print("The {foo} is {bar}".format(foo='answer', bar=42))

Community Wiki

더 많은 파이썬 모듈(특히 타사 모듈)을 추가하기 위해 대부분의 사람들은 PYTHONPATH 환경 변수를 사용하거나 사이트 패키지 디렉토리에 심볼릭 링크 또는 디렉토리를 추가하는 것 같습니다. 다른 방법은 *.pth 파일을 사용하는 것입니다. 다음은 공식 python 문서의 설명입니다.

"[python의 검색 경로를 수정하는] 가장 편리한 방법은 이미 Python의 경로에 있는 디렉토리, 일반적으로 .../site-packages/ 디렉토리에 경로 구성 파일을 추가하는 것입니다. 경로 구성 파일의 확장자는 .pth , 그리고 각 줄은 sys.path에 추가될 단일 경로를 포함해야 합니다.(새 경로가 sys.path에 추가되기 때문에 추가된 디렉토리의 모듈은 표준 모듈을 무시하지 않습니다. 즉, 이 메커니즘을 사용할 수 없습니다. 고정 버전의 표준 모듈 설치용)"


Community Wiki

예외 else 절:

 try: put_4000000000_volts_through_it(parrot) except Voom: print "'E's pining!" else: print "This parrot is no more!" finally: end_sketch()

else 절을 사용하는 것은 try ... except 문으로 보호되는 코드에 의해 발생하지 않은 예외를 실수로 잡는 것을 방지하기 때문에 try 절에 추가 코드를 추가하는 것보다 낫습니다.

http://docs.python.org/tut/node10.html 참조


Community Wiki

예외 재발생 :

 # Python 2 syntax try: some_operation() except SomeError, e: if is_fatal(e): raise handle_nonfatal(e) # Python 3 syntax try: some_operation() except SomeError as e: if is_fatal(e): raise handle_nonfatal(e)

오류 처리기 내부에 인수가 없는 'raise' 문은 Python 이 원래 역추적을 그대로 유지 하여 예외를 다시 발생시키도록 지시하여 "오, 죄송합니다, 죄송합니다. 잡을 의도는 없었습니다, 죄송합니다, 죄송합니다. "

원본 역추적을 인쇄, 저장 또는 조작하려면 sys.exc_info()를 사용하여 가져올 수 있으며 Python에서 하는 것처럼 인쇄는 'traceback' 모듈을 사용하여 수행됩니다.


Community Wiki

주요 메시지 :)

 import this # btw look at this module's source :)

암호 해독 :

Zen of Python, Tim Peters 저

아름다운 것이 못생긴 것보다 낫습니다.
명시적인 것이 암시적인 것보다 낫습니다.
단순한 것이 복잡한 것보다 낫다.
복잡한 것보다 복잡한 것이 낫다.
플랫은 중첩보다 낫습니다.
희소가 조밀보다 좋습니다.
가독성이 중요합니다.
특별한 경우는 규칙을 어길 만큼 특별하지 않습니다.
실용성이 순수함을 능가하지만.
오류는 자동으로 전달되어서는 안 됩니다.
명시적으로 침묵하지 않는 한.
모호함에 직면하여 추측하려는 유혹을 거부하십시오. 그것을 할 수 있는 확실한 방법이 하나 있어야 하고 가급적이면 하나만 있어야 합니다.
당신이 네덜란드 사람이 아닌 한 처음에는 그 방법이 분명하지 않을 수 있습니다.
지금은 결코 없는 것보다 낫다.
결코 있지만 종종 더 나은 지금보다.
구현을 설명하기 어렵다면 나쁜 생각입니다.
구현이 설명하기 쉽다면 좋은 아이디어가 될 수 있습니다.
네임 스페이스는 경적을 울리는 훌륭한 아이디어 중 하나입니다. 더 많이 해 봅시다!


Community Wiki

인터랙티브 인터프리터 탭 완성

 try: import readline except ImportError: print "Unable to load readline module." else: import rlcompleter readline.parse_and_bind("tab: complete") >>> class myclass: ... def function(self): ... print "my function" ... >>> class_instance = myclass() >>> class_instance.<TAB> class_instance.__class__ class_instance.__module__ class_instance.__doc__ class_instance.function >>> class_instance.f<TAB>unction()

또한 PYTHONSTARTUP 환경 변수를 설정해야 합니다.


Community Wiki

중첩 목록 이해 및 생성기 표현식:

 [(i,j) for i in range(3) for j in range(i) ] ((i,j) for i in range(4) for j in range(i) )

이것들은 거대한 중첩 루프 코드 덩어리를 대체할 수 있습니다.


Community Wiki

set 내장에 대한 연산자 오버로딩:

 >>> a = set([1,2,3,4]) >>> b = set([3,4,5,6]) >>> a | b # Union {1, 2, 3, 4, 5, 6} >>> a & b # Intersection {3, 4} >>> a < b # Subset False >>> a - b # Difference {1, 2} >>> a ^ b # Symmetric Difference {1, 2, 5, 6}

표준 라이브러리 참조의 자세한 내용: 유형 설정


Community Wiki

출처 : http:www.stackoverflow.com/questions/101268/hidden-features-of-python

반응형