>백엔드 개발 >파이썬 튜토리얼 >파이썬의 일부 고급 기능

파이썬의 일부 고급 기능

高洛峰
高洛峰원래의
2017-02-15 14:45:291006검색

서문

저는 Python을 사용한 지 거의 반년 정도 됐습니다. 작년 여름 방학 때 처음 접하기 시작해서 몇 가지 작은 크롤러를 작성하고 마침내 시작하게 되었어요. Python을 사용하여 많은 할당을 수행할 수 있습니다. 기본적으로 Python이 사용됩니다. 하지만 아직은 너무 조급해서 짧은 코드를 작성할 수 있지만 Python의 많은 기능을 모르거나 잊어버렸습니다. Liao Da의 튜토리얼로 돌아가서 검토하고 생각나는 것을 기록하겠습니다. 더 중요합니다.

시작

이 글은 주로 Liao Da 튜토리얼의 고급 기능 섹션 내용을 기록하고 제가 이해한 내용을 일부 기록합니다. 내 생각엔 이 기능들이 아주 파이썬적이고, 코드에서 사용하면 아주 크다~

리스트 컴프리헨션(List Comprehensions)

슬라이싱과 반복에 대해서는 이야기하지 않겠습니다. will go direct 먼저 목록 생성을 살펴보겠습니다. 이름을 보면 대략 다음과 같은 목록 생성 방법이 있음을 짐작할 수 있습니다. [1*1, 2*2, ... ,10*10] 생성 방법? 루프를 사용하여 목록 끝에 요소를 연속적으로 추가할 수 있습니다. Python 방식, 즉 목록 생성 공식을 사용하면

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

가 되며 뒤에도 if가 올 수 있습니다. 판단 예를 들면

>>> [x * x for x in range(1, 11) if x%2==0]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

이렇게 하면 원래 4~5줄의 코드를 작성하려면 루프를 사용해야 했는데, 한 줄로 해결되어 직관적이고 명확합니다.

두 개의 for 루프를 사용하여 전체 순열을 생성할 수도 있습니다.

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

이런 방식으로 if 판단을 추가하는 방법은 무엇입니까? 각 for 문 뒤에 추가하거나 끝에 추가할 수 있습니다.

>>> [m + n for m in 'ABC' if m < &#39;C&#39; for n in &#39;XYZ&#39; if n < &#39;Z&#39;]
[&#39;AX&#39;, &#39;AY&#39;, &#39;BX&#39;, &#39;BY&#39;]
>>> [m + n for m in 'ABC' for n in 'XYZ' if n < &#39;Z&#39; and m < &#39;C&#39;]
[&#39;AX&#39;, &#39;AY&#39;, &#39;BX&#39;, &#39;BY&#39;]

또한 for 문에서 여러 변수를 동시에 반복할 수도 있습니다. 예를 들어 dict의 items()는 키와 값을 반복할 수 있습니다. at the same time:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

거의 다 됐네요~

근데 예전에는 항상 C++를 썼는데 이런 사고 방식은 바꾸기가 어렵네요. 이 구문에 천천히 익숙해질 수 밖에 없어요. 사용 중. 익숙해지면 무의식적으로 쓸 수 있습니다.

발전기

왜 발전기를 사용하나요? Liao Da의 튜토리얼에서 이에 대해 자세히 설명하고 간략하게 요약하면 다음과 같습니다.

  1. 목록의 내용은 메모리에 저장되고 메모리 제한이 적용되므로 목록의 용량이 제한됩니다. .

  2. 극소수의 요소에만 액세스하면 엄청난 공간 낭비가 발생합니다.

  3. 생성기는 반복하는 동안 다음 값을 계산할 수 있습니다. 이론적으로 프로세스는 무한정 계속될 수 있으며 많은 메모리를 차지하지 않습니다.

간략한 소개입니다. 자세한 내용은 구글에서 확인해주세요~

생성기는 어떻게 생성하나요? 첫 번째 방법은 앞서 언급한 목록 생성과 유사합니다. []를 ()로 변경하면 됩니다.

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

보시다시피, 방법은 거의 동일합니다. 모든 값 목록()은 for 루프를 사용하여 반복할 수 있는 생성기를 가져오지만 생성기는 아래 첨자를 사용하여 액세스할 수 없으며 다시 반복하면 StopIteration 예외가 발생합니다. 🎜 >

>>> for i in g:
...     print(i)
...
0
1
4
9
16
25
36
49
64
81
>>> for i in g:
...     print(i)
...
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
그러나 생성기를 만들 때 next()는 기본적으로 호출되지 않지만 for 루프를 통해 반복되므로 StopIteration 오류에 대해 신경 쓸 필요가 없습니다.

계산 알고리즘이 더 복잡하고 목록 생성과 유사한 for 루프를 사용하여 구현할 수 없는 경우 함수를 사용하여 구현할 수도 있습니다. 예를 들어 유명한 피보나치 수열:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return &#39;done&#39;

Yield 키워드에 관해서는 제가 Python을 처음 배울 때 오랫동안 헤매었습니다. 제너레이터를 보기 전까지는 이해가 되지 않았습니다. 검색해 보면 대략적으로 알 수 있을 것 같습니다. 그래서 나는 틀린 문장을 말하는 것이 두렵습니다. Liao Da의 튜토리얼에서는 다음과 같이 설명합니다.

함수는 순차적으로 실행되며 return 문이나 함수 문의 마지막 줄을 만나면 반환됩니다. 제너레이터가 되는 함수는 next()가 호출될 때마다 실행되고, Yield 문을 만나면 반환되며, 다시 실행되면 지난 번 반환된 Yield 문부터 계속해서 실행됩니다.

조금 이해하기 어려울 수도 있지만 이해하고 나면 설명하기 쉽습니다.

물론, 함수에 return을 추가할 수도 있습니다. return이 없으면 기본적으로 함수가 완료될 때까지 실행됩니다. 실행 중에 return하면 StopIteration이 발생합니다. 직접 반복을 종료합니다.

예를 들어 위의 예에서는 반환 값이 예외 값으로 처리되었기 때문에 'done'이라는 문자열이 반복 중에 표시되지 않는 것을 발견했습니다. 이렇게 하세요:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done
Iterator(Iterator)

for 루프에서 직접 사용할 수 있는 객체를 반복 가능한 객체라고 합니다. isinstance() 함수를 사용하여 반복 가능한 객체인지 확인할 수 있습니다. :

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
next() 함수에 의해 호출되어 계속해서 다음 값을 반환하는 객체를 반복자(iterator)라고 합니다. 물론 isinstance()를 사용하여 객체가 Iterator 객체인지 확인할 수 있습니다.

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
위의 두 예를 통해 생성기와 목록, 튜플, 문자열 등의 방식으로 이해할 수 있습니다. .은 모두 Iterable 객체이고 동시에 생성기는 여전히 Iterator 객체이지만 목록 등은 그렇지 않습니다. 그렇다면 Iterable 객체에서 Iterator 객체로 직접 변환할 수 있습니까?

iter() 함수를 사용할 수 있습니다:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

其实,Iterator 对象表示的是一个数据流,我们可以把这个数据流看做是一个有序序列,但却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,但 list,tuple 什么的是不可能这样的。

更多关于 python 的一些高级特性相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.