2014-02-11 5 views
11

저는 Python을 처음 사용합니다. 내가 파이썬 3.3.2를 사용하고 있는데 제가 알아내는 힘든 시간을 보내고있어 이유를 다음 코드지도 함수에 의해 반환 된 목록은 한 번 사용하면 사라집니다.

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: min() arg is an empty sequence 

그러나이 코드 :

strList = ['1','2','3'] 
intList = list(map(int,strList)) 
largest = max(intList) 
smallest = min(intList) 

strList = ['1','2','3'] 
intList = map(int,strList) 
largest = max(intList) 
smallest = min(intList) 

날이 오류를 제공합니다

전혀 오류가 없습니다.

제 생각에 intList가 map 함수의 반환 값에 할당되면 the docs에 따라 목록이 아닌 반복자가됩니다. 그리고 아마도 max()을 호출하는 부작용으로서 반복자가 목록의 끝까지 반복되어 파이썬이 목록이 비어 있다고 믿게 만들었습니다 (저는 C 지식에서 그림을 그렸습니다. 반복자가 실제로 어떻게 작동하는지 잘 알지 못합니다.) . 코드의 두 번째 블록 반면

>>> type(intList) 
<class 'map'> 

:

>>> type(intList) 
<class 'list'> 

하는 사람을 확인하거나 거부 할 수 있습니다 파이썬에서) 나는이 기능을 지원해야하는 유일한 증거는 코드의 첫 번째 블록,이다 제발 제발요?

답변

12

정확합니다. Python 3에서 map은 반복자를 반환합니다. 반복자는 한 번만 반복 할 수 있습니다. 반복기를 반복하여 두 번째로 호출하면 마치 비어있는 것처럼 즉시 StopIteration을 발생시킵니다. max은 모든 것을 소비하며, min은 반복자를 비어있는 것으로 간주합니다. 요소를 두 번 이상 사용해야하는 경우 반복자 대신 목록을 가져 오려면 list으로 전화해야합니다. 당신의 map 문서에서

+0

목록보다 더 나은 목적에 맞는 튜플 또는지도 개체를 설정할 수도 있습니다. – fanny

5

:

Return an iterator that applies function to every item of iterable, yielding the results.

Once an iterator’s next() method raises StopIteration, it must continue to do so on subsequent calls.

http://docs.python.org/3/library/stdtypes.html#typeiter 그래서 반복자에 관계없이 기본 데이터 객체의, 한 번만 사용할 수 있습니다에서

. 발전기의 개념을 토대로합니다.

itertools.tee 하나에서 여러 독립 이터레이터를 사용할 수 있습니다.

l1,l2 = itertools.tee(intList,2) 
max(l1) 
min(l2) 
관련 문제