파이썬 학습 진도 9 (목록 세대 유형, 발전기 및 반복자)

공식 목록


공식 목록 함축의 목록, 파이썬은 매우 간단하지만 강력한 내장 식의 목록을 만들 수 있습니다.

예를 들어, 목록을 생성하는  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]사용할 수 있습니다 list(range(1, 11)):

>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

하지만 당신은 생성 할 경우 [1x1, 2x2, 3x3, ..., 10x10]어떻게 할 수 있나요? 첫 번째 루프 방법 :

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

그러나 너무 복잡주기 및 공식 목록 문 위에 생성 된 순환 라인 목록으로 대체 할 수있다 :

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

식의 목록을 작성할 때, 요소가 생성 될 x * x전면에 다음 for재활용, 당신은 목록에 넣어 만들 수 있습니다, 몇 번을 작성하는 데 유용합니다, 당신은 곧이 구문을 잘 알고있을 것입니다.

또한 우리는 짝수 광장 필터링 할 수 있습니다 그래서, 경우 결정 루프를 다시 추가 할 수 있습니다 :

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

또한 2주기를 사용할 수 있습니다, 전체 배열은 생성 할 수 있습니다 :

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

이상 세와 트리플 루프는 거의 사용되지 않습니다.

공식 목록을 사용하여, 당신은 매우 간단한 코드를 작성할 수 있습니다. 예를 들어, 현재 디렉토리에있는 모든 파일과 디렉토리를 나열하는 코드의 라인을 통해 달성 될 수있다 :

>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录 ['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode'] 

for사실, 재활용은 동시에 같은 두개 이상의 변수를 사용할 수 동시에 가능한 반복 키 값 :dictitems()

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

따라서,리스트 화학식 두 변수리스트를 생성하는데 사용될 수있다 :

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

소문자 문자열 모두의 마지막 목록 :

>>> L = ['Hello', 'World', 'IBM', 'Apple'] >>> [s.lower() for s in L] ['hello', 'world', 'ibm', 'apple']


 

 

발전기


공식리스트, 우리는 직접 목록을 만들 수 있습니다. 그러나, 메모리 제한 대상이 목록은 확실히 용량을 제한한다. 우리는 점유 공간의 대부분이 낭비되는 요소 뒤에 처음 몇 요소에 액세스해야하는 경우 또한, 백만 요소를 포함하는 목록을 만들뿐만 아니라, 많은 저장 공간을 차지합니다.

목록 요소가 알고리즘에 따라서 계산 될 수 있다면 그래서, 우리는 후속 요소의 공정 사이클에서 계산을 계속 할 수있는 경우에 있다고? 이 때문에 공간을 많이 절약, 전체 목록을 생성 할 필요가 없습니다. 이 계산기구를 순환하면서 파이썬, 발전기로서 공지 : 발전기.

발전기를 만들려면 여러 가지 방법이 있습니다. 첫 번째 방법은 긴 목록 생성 타입과 같이 매우 간단 []변화 ()발전기가 생성 :

>>> 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> 

생성 L하고 g만 최 외층 상이 []하고 (), L리스트, 및 g발전기.

우리는 직접리스트의 각 요소를 인쇄 할 수 있습니다,하지만 어떻게 우리는 발전기 그것의 각 요소를 인쇄?

당신은 하나 하나를 인쇄 할 경우에 의해 next()반환 값을 얻는 발전기의 기능은 다음과 같습니다

>>> next(g)
0
>>> next(g)
1
>>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25 >>> next(g) 36 >>> next(g) 49 >>> next(g) 64 >>> next(g) 81 >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration 

우리는 생성 알고리즘은 각 호출에 저장되어, 이야기 next(g)계산합니다, g아니오 이상의 요소가 발생하지 않는 경우, 마지막 요소에 계산 될 때까지 다음 요소의 값을 StopIteration오류.

물론,이 상수 호출은 위의 next(g)올바른 방법은 사용하기에 너무 아픈입니다 for발전기가 반복 가능하기 때문에 루프를 :

>>> g = (x * x for x in range(10))
>>> for n in g: ... print(n) ... 0 1 4 9 16 25 36 49 64 81 

그래서, 우리는 기본적으로 호출되지 발전기, 이후에 만들어진 next(),하지만 통해 for반복 루프 그것과 상관없는 StopIteration오류.

발전기는 매우 강력하다. 투영 알고리즘리스트 생성 비슷한 형태와 복잡한 경우 for달성 될 수없는 시간주기, 또한 함수로서 구현 될 수있다.

예를 들어, Feibolaqi (피보나치) 공지의 열 수는, 임의의 개수가 함께 처음 두 숫자에 의해 얻을 수 있고, 제 1 및 제 2 번호를 제외한 :

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

쓰기로 열 수에 의해 Feibolaqi 공식 목록은, 그러나, 함수를 인쇄 할 매우 간단합니다 :

def fib(max):
    n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done' 

입문합니다 :

a, b = b, a + b

그것은 동일합니다 :

t = (b, a + b) # t是一个tuple
a = t[0] b = t[1] 

하지만 당신은 명시 적으로 임시 변수 t를 할당 할 수 있습니다 작성할 필요가 없습니다.

 

 

 

추천

출처www.cnblogs.com/2205254761qq/p/12297508.html