파이썬의 숨겨진 기능

파이썬 프로그래밍 언어의 덜 알려졌지만 유용한 기능은 무엇입니까?

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

답변에 대한 빠른 링크 :



답변

체이닝 비교 연산자 :

>>> 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, 미만 입력하고 각각 용어는 한 번만 평가됩니다.


답변

파이썬 정규식 구문 분석 트리를 가져 와서 정규식을 디버깅하십시오.

정규 표현식은 파이썬의 훌륭한 기능이지만, 디버깅은 어려울 수 있으며 정규 표현식을 잘못 사용하는 것은 너무 쉽습니다.

다행히도 파이썬은 문서화되지 않은 실험적인 숨겨진 플래그 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)

답변

낱낱이 세다

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

예를 들면 다음과 같습니다.


>>> 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
>>>

참고 문헌 :


답변

생성기 객체 생성

당신이 쓰는 경우

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

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

for n in x:

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

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

경우에 따라 속도가 크게 향상 될 수 있습니다.

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

>>> 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)

답변

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

예를 들어 :

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

iter(callable, until_value)함수 는 반환 callable될 때까지 반복적으로 호출 하고 결과를 산출합니다 until_value.


답변

변경 가능한 기본 인수에주의하십시오

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

대신 “제공되지 않음”을 나타내는 센티넬 값을 사용하고 기본값으로 변경하려는 변수로 대체해야합니다.

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

답변

생성기 함수로 값 보내기 . 예를 들어이 기능이있는 경우 :

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