2017-04-20 11 views
1

는이 같은 필기구 고민하고있다 : 나는 목록에 그것들을 소비하도록 강요하고 있기 때문에발전기를 반대로받지 않은 이유는 무엇입니까?

list(reversed(list(el.iterancestors()))) + [1,2,3] 

발전기, 빨아 곳.

이것을 단순화하는 방법이 있습니까? 나는 reversed()이 반복자를 받아 들여야한다고 생각하는데, 틀린가?

답변

9

발전기는 마지막 항목을 보유 할 수 없으므로 되돌릴 수 없습니다. 다음의 결과는 무엇입니까? reversed()의 포인트가메모리 효율적이다

from itertools import permutations 
reversed(permutations('abcdefghijklmnopqrstuvwxyz', 10)) # 19,275,223,968,000 tuples 

참고 :

from itertools import cycle 

reversed(cycle('abc')) 

실수로 모든 메모리를 먹는의 위험이있다. 시퀀스의 경우 색인 (목록, 문자열, 튜플, 범위)이있는 객체 인 reversed()은 내부 색인을 사용하는 반복자를 생성합니다. 내부 색인은 len(inputobject) - 1에서 시작하고 반복 할 때 0으로 진행됩니다. 그런 식으로 입력 시퀀스의 복사본을 만들 필요는 없지만이 트릭은 이미 길이가 있고 무작위 액세스를 지원하는 무언가에서만 작동 할 수 있습니다.

귀하의 경우를 들어 어쨌든 reversed() 사용하지 것입니다. 당신은 출력되지 발전기 등의 목록을 원하는, 그래서 대신 목록을 반대로 슬라이스를 사용 : 새 목록 개체를 구축으로

list(el.iterancestors())[::-1] + [1, 2, 3] 

메모리 효율이 여기에 문제가되지 않습니다.