Python3 교체기 및 생성기
1. 교체와 교체 가능한 대상
반복 (Iteration): 반복은 반복이고, 반복은 서열을 순서대로 출력하는 것이다
교체 가능 객체(Iterable): 교체 가능한 객체가 교체 가능 객체입니다.또는
for
순환에 작용할 수 있는 대상이 바로 교체 가능한 대상이다2. 교체기
1. 왜 교체기를 사용합니까?
목록 생성식을 통해 우리는 직접 목록을 만들 수 있다.그러나 메모리 제한을 받으면 목록 용량은 한계가 있을 것이다.그리고 100만 개의 요소를 포함하는 목록을 만들면 많은 저장 공간을 차지할 뿐만 아니라 우리가 앞의 몇 개의 요소만 방문해야 한다면 뒤의 절대 다수의 요소가 차지하는 공간은 헛되이 낭비된다.
그래서 만약에 목록 요소가 어떤 알고리즘에 따라 추산할 수 있다면 우리는 순환하는 과정에서 후속 요소를 끊임없이 추산할 수 있을까?이렇게 하면 완전한list를 만들 필요가 없어서 대량의 공간을 절약할 수 있다.파이톤에서 순환하면서 계산하는 이런 메커니즘을 교체기(Iterator)라고 부른다.
교체기의 값을 얻으려면next() 함수를 통해next(g)를 호출할 때마다 g의 다음 원소의 값을 계산하고 마지막 원소가 더 이상 계산되지 않을 때까지 StopIteration의 이상을 던져야 한다.
간단히 말하면list는 데이터를 저장하고, 교체기는 알고리즘을 저장한다
2. 교체기(Iterator):
다음은 교체기에 대한 다음 정의입니다.
next()
함수에 작용할 수 있는 교체 대상은 교체기이다교체 가능한 대상은
for
순환 위에 작용할 수 있기 때문에 교체는 for
와 next()
위에 작용할 수 있다3. 교체기를 만드는 방법
Python은 일반적인 교체 가능한 대상을 교체기로 바꾸는 함수iter () 를 제공합니다. 그 반환 값은 교체기입니다.
4. 사용자가 교체기를 사용자 정의하는 방법
그렇다면 언어 자체의 서열을 제외하고는 교체기로 바꿀 수 있는데 사용자는 어떻게 교체기를 사용자 정의합니까?
사용자가 교체기를 사용자 정의할 경우 사용자가 정의한 클래스에
__iter__()
와 __next__()
방법을 추가해야 합니다3. 생성기generator
1. 생성기 만들기
지금까지 파이톤의 강력한 교체기를 배웠습니다. 메모리를 조금만 차지하고 대량의 서열을 저장할 수 있습니다.
그러나 한 가지 우호적이지 않은 것은 사용자가 정의한 교체기가 매우 번거로우므로 두 가지 방법을 정의해야 한다는 것이다.때때로 나는 아주 작은 기능만 실현할 수 있고, 클래스를 쓰지 않아도 되고, 간단한 함수 하나로 해결할 수 있다.그렇다면 실현할 수 있는 방법은 없을까?
있다!!!
일반 함수에 yield를 더하면 교체기가 됩니다.
사실 생성기의 본질도 교체기이다. 단지 특수한 교체기에 불과하다.그러나 일반 교체기와 구별하기 위해서는 높은 이름, 생성기를 만들어야 한다!이후에 함수에 yield 방법을 추가하는 교체기를 만나면 생성기generator라고 부르고 유형을 조회할 때 type ()
yield는 프로그램을 일시 정지할 수 있으며, 다음에 함수를 호출할 때 yield 아래에서부터 실행합니다
2. 생성기 유도식
생성기의 장점은 사용자가 직접 교체기를 정의할 때 클래스를 쓸 필요가 없다는 것이다. 그러나 일부 사람들은 함수를 쓰는 것을 귀찮아한다. 그러면 함수를 쓸 필요가 없는 교체기가 있습니까?유형 함수 중 익명 함수가 있으니 한 줄로 끝냅니다!
어...없어요?NO, 당연히 있지!!!세계의 진보는 바로 사람의 게으름 때문에 추진되는 것이다.
함수에 yield를 첨가하는 것 외에 실현할 수 있는 방법이 하나 더 있다. 실현하기 전에 우리는 몇 가지 유도식을 먼저 본다
####(1) 목록 유도식
[i for i in [1, 2, 3, 4, 5]]
(2) 사전 유도식
{i: j for i in [1, 2, 3, 4, 5] for j in 'abcde'}
(3) 집합 유도식
{i for i in [1, 2, 3, 4, 5]}
집합 유도식과 사전 유도식은 {}에 몇 개의 값이 있는지 없는지를 보는 것이다.
(4) 문자열 유도식
그럼 문자열 유도식이 있습니까?문자열 유도식은 인용부호로 시작하는 것이니, 우리는 시험해 볼 수 있다
"i for i in 'abcde'"
출력 발견인지 문자열인지, 문자열의 첫 번째 철칙은 인용부호에 포함된 문자열이기 때문이다
(5) 디지털 유도식
물론 숫자 유도식도 없다. 숫자를 정의하는 것은 아무것도 덧붙이지 않는다. 아래에 이렇게 쓰면 문법 오류가 발생할 수 있다.
i for i in 12345
그리고 변하지 않는 유형의 데이터 유형에 대한 유도식은 무의미하다. 왜냐하면 변하지 않는 유형의 값이 바뀌면 그의 바늘도 바뀌고 그 대상도 바뀌었기 때문이다.
(6) 모듈 유도식
마지막으로 원조 유도식을 보면 원조는 당연히 괄호로 표시한다
(i for i in [1, 2, 3, 4, 5])
whit?mounty fuck!어떻게 된 거야?왜 원조에는 유도식이 있습니까?
자세히 보면 그 유형은generator입니다. 이렇게 익숙한데, 이것이 바로 우리가 방금 배운 생성기 아닙니까?
맞다!이것은 생성기를 만드는 또 다른 방법입니다. 익명 함수와 비슷하지 않습니까?우리는 그것의 이름을 지을 수 있다: 생성기 유도식
확장
물론 생성기의 이렇게 높은 이름도 단순히 교체기를 간소화하기 위한 것이 아니다. 바로 생성기의 존재 때문에 우리는 협동 프로그램을 쓸 수 있다. 무엇이 협동 프로그램입니까?다음 회의 설명을 들으시오!
다섯째, 총결산
반복
교체 가능 대상: for에 작용할 수 있는
교체기: 저장 알고리즘,next () 위에 작용할 수 있는
교체기 만들기: 두 가지 방법입니다.1.iter() 2.클래스에
__iter__()
및 __next__()
포함생성기: 특수한 교체기
생성기 만들기: 두 가지 방식입니다.1. 함수에 yield 2.생성기 유도식
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.