2014-09-22 1 views
2

내가 자리를 비운 동안 Python (3.4) 내장 함수에 이상한 일이 발생했습니다. mapzip과 같은 함수는 객체 (목록 또는 튜플이 아님)를 반환합니다. Python 3.x 내장 함수 이제 유형 반환

In [34]: map(lambda x:1, [1,2,3]) 
Out[34]: <map at 0x7fe27a15dac8> 
  1. 다음은 파이썬에 추가되었습니다?
  2. 왜 추가 되었습니까?
  3. 가장 중요한 것은 내 코드가 깨지겠습니까?
+2

3.x 라인이 시작된 이래로 2008 년으로 돌아 왔습니다. 잠시 동안 빠져 있어야합니다. – user2357112

+0

관련 항목 : http://stackoverflow.com/questions/22147757/iterators-in-python-3 – user2357112

+0

주로 대화 형으로 사용하기위한 문제입니다. 대부분의 2.x 코드는 원활하게 작동하며 대화식 인터프리터에서만 알 수 있습니다. – dawg

답변

3

짧은 답변 :이 요소의 제한된 번호가 필요한 경우 전체 목록을 할당 방지하기 위해 사용 반복 가능 객체가 있습니다. 이후 3.0

나는 게으른 함수 호출 (또는 coroutines) 같아요.

lazy 함수 호출은 필요한 경우에만 개체를 ​​계산하는 개체를 반환합니다.

예를 들어 1M 항목의 목록이 있지만지도의 첫 번째 3 만 있으면됩니다. 그런 다음 이터레이터는 처음 세 개만 계산할 것입니다.

무한한 목록에 대한 작업을 수행하는데도 사용할 수 있습니다. 모든 소수의 목록이 있다고 가정 해보십시오. 이것은 반복자입니다. 물론 모두 소수를 저장할 수 없습니다. 그것이 정말로 필요한 경우에만 다음 계산을 수행합니다.

documentation을 기반으로 할 때, 3.0에서 말하겠습니까?

>>> list(map(lambda x:1, [1,2,3])) 
[1, 1, 1] 

무한 목록 : 하기 위해

당신의 반복자에 모든 항목을 내고 목록으로 변환, 당신은 list 기능을 사용할 수 있습니다.

예를 들어 이전 목록 [1,2,3]을 사용한다고 가정 해보십시오. 이제 모든 계산을 직접하는 대신 전체 길이가 k이되도록 주어진 목록을 반복하는 목록이 필요합니다. 예를 들어 마지막 요소가 무엇인지 결정할 수 있습니다.) :

>>> from itertools import * 
>>> list(islice(cycle([1,2,3]),20)) 
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2] 

즉, 무한 반복기 [1,2,3,1,2,3, ...]를 통해 작업을 수행 할 수 있습니다. 이러한 반복기에서 list을 수행하지 않으면 메모리 부족 예외가 발생합니다.documentation에 도시 된 바와 같이

, 또한 n 번째 요소 취할 수

def nth(iterable, n, default=None): 
    "Returns the nth item or a default value" 
    return next(islice(iterable, n, None), default) 

하고 따라서 예를 들어 무한 피보나치 시퀀스의 요소 1337조차인지 확인 :

def fibbonacci(): 
    i = 0 
    j = 1 
    while True : 
     yield j 
     k = j 
     j = i+j 
     i = k 

nth(fibbonacci(),1337) 
1887894200332450578485872635131438888682034332759626203734370221207918536632734791920258721345445695603925109666619483005485820744328669636758022665585261815175601673908370933079008727762461226800205778071936133115682958306317629552911384353679816770236462076654822205794785629944 

즉, 각 요소를 계산할 수있는 시퀀스를 정의 할 수 있으며 첫 번째 n, k 번째, ... 목록에 명시 적으로 모든 값을 명시 적으로 저장하지 않아도됩니다.

+1

'map'은 함수가 아닙니다. 사실,'type (map) == map'은'builtin_function_or_method'가 아닙니다. – PythonNut

+1

@PythonNut : 그렇다면 파이썬 내장 함수에 왜 나열되어 있습니까? https://docs.python.org/3.2/library/functions.html#map –

+0

이것이 파이썬 3.2의 문서일까요? 나는 모른다. [3.4 docs] (https://docs.python.org/3.4/library/functions.html#map)에 함수로 나열되어 있습니다. 하지만 분명히 기능이 아닙니다 ... 내가 바보가 아니고 유형이 지금 기능이 아니라면 말입니다. – PythonNut