저는 Python을 사용한 지 거의 반년 정도 됐습니다. 작년 여름 방학 때 처음 접하기 시작해서 몇 가지 작은 크롤러를 작성하고 마침내 시작하게 되었어요. Python을 사용하여 많은 할당을 수행할 수 있습니다. 기본적으로 Python이 사용됩니다. 하지만 아직은 너무 조급해서 짧은 코드를 작성할 수 있지만 Python의 많은 기능을 모르거나 잊어버렸습니다. Liao Da의 튜토리얼로 돌아가서 검토하고 생각나는 것을 기록하겠습니다. 더 중요합니다.
이 글은 주로 Liao Da 튜토리얼의 고급 기능 섹션 내용을 기록하고 제가 이해한 내용을 일부 기록합니다. 내 생각엔 이 기능들이 아주 파이썬적이고, 코드에서 사용하면 아주 크다~
슬라이싱과 반복에 대해서는 이야기하지 않겠습니다. 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 < 'C' for n in 'XYZ' if n < 'Z'] ['AX', 'AY', 'BX', 'BY'] >>> [m + n for m in 'ABC' for n in 'XYZ' if n < 'Z' and m < 'C'] ['AX', 'AY', 'BX', 'BY']
또한 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의 튜토리얼에서 이에 대해 자세히 설명하고 간략하게 요약하면 다음과 같습니다.
목록의 내용은 메모리에 저장되고 메모리 제한이 적용되므로 목록의 용량이 제한됩니다. .
극소수의 요소에만 액세스하면 엄청난 공간 낭비가 발생합니다.
생성기는 반복하는 동안 다음 값을 계산할 수 있습니다. 이론적으로 프로세스는 무한정 계속될 수 있으며 많은 메모리를 차지하지 않습니다.
간략한 소개입니다. 자세한 내용은 구글에서 확인해주세요~
생성기는 어떻게 생성하나요? 첫 번째 방법은 앞서 언급한 목록 생성과 유사합니다. []를 ()로 변경하면 됩니다.
>>> 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
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'
함수는 순차적으로 실행되며 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
>>> 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
>>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False
>>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
其实,Iterator 对象表示的是一个数据流,我们可以把这个数据流看做是一个有序序列,但却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,但 list,tuple 什么的是不可能这样的。
更多关于 python 的一些高级特性相关文章请关注PHP中文网!