파이썬 고급 기능 : 조각, 반복, 목록 생성 유형, 발전기

슬라이스 (일부 새로운 액션을 발견)

  참고 링크 : 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오류를 반환 값에 포함되어 중간 :StopIterationvalue

>>> 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, strIterable이 될 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을 조우 루프 종료 
        휴식을

  

  

  

 

추천

출처www.cnblogs.com/Gaoqiking/p/11482870.html