>>> 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 >>>
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" 기호(@)로 시작하여 함수 정의 위에 한 줄에 데코레이터를 작성합니다.
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에서 속성, 바인딩된 메서드, 정적 메서드, 클래스 메서드 및 슬롯을 구현하는 데 사용됩니다. 그것들을 이해하면 이전에 파이썬 '특이한 것들'처럼 보였던 많은 것들이 왜 그런 것인지 쉽게 알 수 있습니다.
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 절에 추가 코드를 추가하는 것보다 낫습니다.
아름다운 것이 못생긴 것보다 낫습니다. 명시적인 것이 암시적인 것보다 낫습니다. 단순한 것이 복잡한 것보다 낫다. 복잡한 것보다 복잡한 것이 낫다. 플랫은 중첩보다 낫습니다. 희소가 조밀보다 좋습니다. 가독성이 중요합니다. 특별한 경우는 규칙을 어길 만큼 특별하지 않습니다. 실용성이 순수함을 능가하지만. 오류는 자동으로 전달되어서는 안 됩니다. 명시적으로 침묵하지 않는 한. 모호함에 직면하여 추측하려는 유혹을 거부하십시오. 그것을 할 수 있는 확실한 방법이 하나 있어야 하고 가급적이면 하나만 있어야 합니다. 당신이 네덜란드 사람이 아닌 한 처음에는 그 방법이 분명하지 않을 수 있습니다. 지금은 결코 없는 것보다 낫다. 결코 있지만 종종 더 나은 지금보다. 구현을 설명하기 어렵다면 나쁜 생각입니다. 구현이 설명하기 쉽다면 좋은 아이디어가 될 수 있습니다. 네임 스페이스는 경적을 울리는 훌륭한 아이디어 중 하나입니다. 더 많이 해 봅시다!
[(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}