슬라이스 (일부 새로운 액션을 발견)
참고 링크 : https://www.liaoxuefeng.com/wiki/1016959663602400/1017269965565856
스페이서를 갖는 소자
>>> L = [I 난에 대한 범위 (20)] 의 모든 숫자를 각각 두 취할 >>> LL은 L = [:: 2] >>> LL [0, 2 ,. 4 ,. ,. 6 8 10 , 12, 14, 16, 18] 수 (10) 이전에, 각각 두 취
복제를위한 모든 요소를 가지고하는 데 사용할 수 있습니다
>>> L의 [:] [0, 1, 2, 3, ..., 99]
되풀이
참고 링크 : https://www.liaoxuefeng.com/wiki/1016959663602400/1017316949097888
어떻게 객체가 반복 가능한 것입니다 결정하기 위해? 이는 유형의 Iterable 수집 모듈에 의해 결정된다 :
Iterable을 가져 >>>의 컬렉션 >>> isinstance ( 'ABC'는의 Iterable) 여부 반복 # 1 STR 트루 isinstance >>> ([1,2,3] 상기의 Iterable) #리스트 여부 반복 트루 isinstance >>> ( (123)의 Iterable) # 정수 여부를 반복 거짓
인덱스주기의 목록을 원하는 경우, 열거 () 함수가 목록에 파이썬 인덱스에 의해 제공 될 수있다 - 인덱스가 동시에하고 요소를 반복 할 수 있도록 요소 쌍
>>> I, 열거 ([ 'A', 'B', 'C'])의 값 : ... 잉크 (I, 값) ... 0 A 1 B 2 C
공식 목록
참고 링크 : https://www.liaoxuefeng.com/wiki/1016959663602400/1017317609699776
2 사이클 전체 어레이를 생성하는데 이용 될 수도있다
>>> m = [X + Y에 대한 "XYZ"에 대한 Y 'ABC'의 X] # 2 사이클 사이에 별도의 공간으로 사용되는 다음 X 상상하려고 Y 어떻게 외부 루프 다시 사용하여, 또한 변경 >>> m [ 'AY', 'AZ' ', BY'BX ','는 BZ ''는 CX '', CY ','는 CZ ','AX '] >>>
발전기
참고 링크 : https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
발전기 측 절차 메커니즘을 생성하는 동안, 예를 들어, 우리는 컬렉션에 액세스 (수학적인 의미가 아니라 데이터 구조의 일종)에 많은 수의 요소를 포함해야 산출되지만, 각 시간은 그 일부를 방문 당신은 저장 목록을 사용하는 경우 데이터는 단지 많은 저장 공간을 차지하지 않습니다 있지만, 각 시간은 큰 낭비의 원인이됩니다 그들 중 몇 가지를 방문
이러한 요소는 어떤 알고리즘에 따라 추정 될 수 있는지 그래서,이기구는 발전기 뒤에 요소를 연속적으로 계산 재순환 될 수있다 ( 발전기)
여러 가지 방법이 있습니다, 발전기를 만들려면 가장 쉬운 방법은 () [], 대체 유형의 목록을 생성하는 것입니다
>>> g = (I의 I 내지 (10)) >>> g <발생기 객체 <genexpr> 0x000001A1CD703518에서> >>>
발전기 요소를 가져옵니다
요소가 빌더 인수가 될 경우, 우리가 다음 수 () 메소드
>>> 다음 (g) 0 >>> 다음 (g) 1 패스 >>> 다음 (g) 9 >>> 다음 (g) 역 추적 (가장 최근에 호출 마지막) : 파일 "<표준 입력>", 라인 1, <모듈>에 대하여 StopIteration
저장 발생기, 우리는 소자의 값을 계산하는 알고리즘) (다음 각 호출되면, 마지막 요소, 더 이상의 요소를 산출 할 때까지의 시간은, StopIteration을 에러 발생
물론,이 상수 호출은 위의 next(g)
올바른 방법은 사용하기에 너무 아픈입니다 for
발전기가 반복 가능하기 때문에 루프를 :
다음 >>> (g) 역 추적 (가장 최근의 마지막 호출) : 파일 "<표준 입력>", 줄 1, <Module1의>이다. 대하여 StopIteration >>> I에 대한 g에 : 발전기 (G)의 전면에 걸쳐 반복 때문에 것을 #주의 따라서 임의의 출력값 재현 없을 것 ... 출력 (I) ... #의 재생성 >>> I에 대한 G : ... 출력 (I) ... 0 . 1 2 . 3 . 4 . 5 . 6 7 8 9 >>>
그래서, 우리는 기본적으로 호출되지 발전기, 이후에 만들어진 next()
,하지만 통해 for
반복 루프 그것과 상관없는 StopIteration
오류.
발전기는 매우 강력하다. 투영 알고리즘리스트 생성 비슷한 형태와 복잡한 경우 for
달성 될 수없는 시간주기, 또한 함수로서 구현 될 수있다.
예를 들어, 제 1 및 제 2 번호를 제외한 Feibolaqi (피보나치)을 공지의 열 수는, 임의의 수의 서로 처음 두 숫자에 의해 얻을 수있다 :
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
쓰기 열 수에 의해 Feibolaqi 공식 목록은, 그러나, 함수를 인쇄 할 매우 간단합니다 :
: DEF (최대) FIB N, A, B = 0, 0, 1 개 동안 N <최대 : 인쇄 (b, 종료 = '') , B = B, A + B를 N = N + 1 창 'OK'!
A, B = B는, A + BB 할당 A + B와 끝까지, 또는 할 더하기 B를 미리 할당 여기 가치에 대해 생각해보십시오, 여기에 할당 문에 해당합니다
t = (B, A + B )의 # t는 튜플 번호가 할당 그러므로 전에 A = T [0] B T = [. 1]
상기 함수는 피보나치 시리즈 피보나치 수가 N 전에 출력 될 수있다 :
>>> FIB (6) 1 1 2 3 5 8 '완료'
주의 깊은 관찰, 그것을 알 수있다 fib
함수 실제로 열 Feibolaqi 예상 횟수가 제 소자로부터 시작될 수있다 규칙을 정의하고, 후속 선택적 요소를 계산 로직이 실제로 발생과 매우 유사하다.
즉, 위의 함수 발생기와 돌을 던져. 해야하는 fib
기능은 필요, 발전기된다 print(b)
읽기 yield b
를 :
DEF FIB (최대) N-, A, B = 0, 0 ,. 1 그동안 N- <최대 : 이상마다 필요한 항복 B 번호 프린트 (즉, 사용) 여기서, A, B는 = B, A + B . N- = N- + 1 리턴 '완료'
이것은 다른 방법 발생기의 정의이다. 함수 정의가 포함되어있는 경우 yield
키워드를,이 함수는 더 이상 일반적인 기능을하지만, 발전기입니다 :
>>> F = FIB (6) >>> F <0x104feaaa0에서 발생 오브젝트 FIB>
및 실행 플로우 생성 기능이 동일하지
그것으로부터 때 기능) return 문 복귀에 직면했을 때, 순차적으로 실행하지만, 함수 발생기하게하고 다음 호출 () 회 수율 문 발생 실행될 때마다 다음 다음번 (반환 마지막 수율 return 문은 계속된다
차례 반환에 다음은 간단한 예를 들어, 발전기의 정의이며, 숫자 1,3,5 : # 참고 다시 세 가지 기능) (다음 반드시 모든 기능을 다시 한 번 문을 수행하지 않는 것을, 문을 얻을 수있다
DEF 홀수 () : 인쇄 ( '단계 1') 1 얻었다 인쇄 ( '단계 2') 의 수율 (3) 인쇄 ( '단계 3') 의 수율 (5)
발전기를 호출 할 때, 제 발전기 객체를 생성 한 다음 next()
함수 반환 값을 구하는 계속 :
>>> O = 홀수 () >>> 다음 (O) 1 단계 1 >>> 다음 (O) 2 단계 3 >>> 다음 (O) 3 단계 5 >>> 다음 (O) 트레이스 백 (최근 통화 마지막) : <모듈>에 파일 "<표준 입력>"줄 1, StopIteration을
당신은 볼 수 odd
는 보통의 기능이 아니라, 발전기, 구현 과정에서, 만남은 yield
계속 다음에, 중단됩니다. 실행 세 번 yield
, 그룹은하지 않은 yield
구현, 그래서 4 호출 할 next(o)
오류에.
위로에 fib
예를 들어, 우리는주기에 전화를 계속 yield
, 그것은 중단 될 것입니다. 물론, 사이클, 그렇지 않으면 목록에 무한한 수를 생성, 루프를 종료 할 수있는 조건을 제공하도록 설정되어 있습니다.
마찬가지로, 발전기로 기능 한 후, 우리는 기본적으로 사용되지 않습니다 next()
다음 반환 값하지만 직접 사용 얻을 for
루프 반복을 :
>>> FIB (6)에 대한 N : ... 출력 (N) ... (1) 1 2 3 5 8
그러나에 의해 for
순환이 발생 호출 될 때, 발전기는하지 발견 된 return
반환 값의 문을. 당신이 반환 값을 얻고 싶은 경우에, 당신은 캡처해야 StopIteration
오류를 반환 값에 포함되어 중간 :StopIteration
value
>>> g = FIB (6) >>> 참 상태 : ... 시도 : ... X = 다음의 (g) ... 인쇄 ( 'g', X) ... StopIteration을 제외한 예로서 : . .. 인쇄 ( '생성기 리턴 값 :'e.value) ... 브레이크 ... g 1 g 1 g : 2 g : 3 g 5 g : 8 생성기 리턴 값 : 완료
반복자
생성기는 다음 ()는 다음의 데이터를 얻기 위해, ()는 다음의 플래그 생성기는 지 여부를 사용할 수 통해 다음 () 다음의 값을 얻기 위해 표준 반복기 (반복자) A는 생성 블로그 이 처리 중에 사이드 루프 메커니즘이다.
반복 가능 객체 (반복 가능)
오브젝트에 작용을 포함하는 개체에 대한 반복적 인 루프로 언급 될 수있다 :
클래스는 데이터 유형의 모음입니다 : 목록, tuble, DICT, 설정, 같은 STR;
하나의 수율로 생성하고, 생성 함수를 포함하는 발전기 인
당신은 객체가 객체인지 여부를 확인하기 위해 isinstance ()를 사용할 수의 Iterable
반복자 (반복자)
반복자라는 개체의 다음 값으로 돌아가 계속 전화) (다음 될 수있다 반복자
또한 객체는 객체의 반복자 여부를 확인하기 위해 isinstance ()를 사용할 수 있습니다
>>> 컬렉션 Iterator를 가져올에서 >>> isinstance (A, 반복자) 진정한 >>>
빌더는 Iterator
객체 만 list
, dict
, str
하지만 Iterable
,하지 않습니다 Iterator
.
list
, dict
, str
등 Iterable
이 될 Iterator
사용 할 수 있습니다 iter()
기능 :
>>> isinstance (ITER ([]), 반복자) 트루 >>> isinstance (ITER ( "ABC"), 반복자) 트루
왜 list
, dict
, str
및 기타 데이터 유형은 아니다 Iterator
?
파이썬이 때문이다 Iterator
데이터 스트림의 객체 표현이 될 수 반복자 객체 next()
호출이 계속 작동하고 던져 자료가없는 경우까지 다음 데이터를 반환 StopIteration
오류가 발생했습니다. 이 데이터 스트림이 정렬 된 순서로 볼 수있다, 하지만 우리는 사전에 순서의 길이를 알 수 없습니다 만 지속될 수, next()
데이터 함수를 계산 다음-수요의 실현, 그래서 Iterator
계산은 불활성 만 다음 데이터를 반환해야 그것은 계산됩니다.
Iterator
심지어 모든 자연 번호와 같은 데이터의 무한 스트림을 나타냅니다. 이 목록은 모든 자연수를 사용하여 저장되지 않습니다.
에 누가 역할을 할 수 for
오브젝트가 순환 Iterable
형;
누가 행동 할 next()
오브젝트가 함수 Iterator
지연 평가 순서를 나타내고 유형;
같은 데이터 타입의 세트 list
, dict
, str
등은 Iterable
있지만 Iterator
, 그러나, 수 iter()
함수 구하는 Iterator
개체.
파이썬은 for
자연의주기가 호출 확장하는 것입니다 next()
달성하기 위해 기능을 예를 들어 :
[1, 2, 3, 4, 5] X에 대한 패스
사실 완전히 동등 :
# 반복자 객체 먼저 얻어진다 IT는 ITER = ([1, 2 ,. 3 ,. 4 ,. 5.]) # 사이클 : 참 동안 : 은 try : # 다음의 값이 얻어진다 : X = 다음 (IT)는 StopIteration을 제외 : # 1 StopIteration을 조우 루프 종료 휴식을