programing

Python 3에서 맵이 목록 대신 맵 객체를 반환하는 이유는 무엇입니까?

batch 2023. 5. 6. 14:12
반응형

Python 3에서 맵이 목록 대신 맵 객체를 반환하는 이유는 무엇입니까?

저는 파이썬 3.x의 새로운 언어 디자인에 관심이 있습니다.

2파썬에 2.7서기즐깁 을 .map:

Python 2.7.12
In[2]: map(lambda x: x+1, [1,2,3])
Out[2]: [2, 3, 4]

그러나 Python 3.x에서는 다음과 같이 변경되었습니다.

Python 3.5.1
In[2]: map(lambda x: x+1, [1,2,3])
Out[2]: <map at 0x4218390>

방법은 이해하지만, 그 이유에 대한 언급은 찾을 수 없었습니다.왜 언어 디자이너들은 이런 선택을 했을까요, 제 생각에, 그것은 엄청난 고통을 초래합니다.이것은 이해 목록을 고수하는 개발자들에게 팔씨름을 하기 위한 것이었습니까?

IMO, 목록은 자연스럽게 Functors로 생각될 수 있습니다. 그리고 저는 어떻게든 다음과 같이 생각해 왔습니다.

fmap :: (a -> b) -> f a -> f b

생성자 표현식이 존재할 때 맵이 여전히 존재하는 이유는 모두 루프되어 함수로 전달되는 여러 반복자 인수를 취할 수 있기 때문이라고 생각합니다.

>>> list(map(min, [1,2,3,4], [0,10,0,10]))
[0,2,0,4]

zip을 사용하는 것보다 약간 더 쉽습니다.

>>> list(min(x, y) for x, y in zip([1,2,3,4], [0,10,0,10]))

그렇지 않으면 생성기 식 위에 아무것도 추가하지 않습니다.

반복기를 반환하기 때문에 전체 크기 목록을 메모리에 저장하지 않습니다.앞으로 기억에 지장을 주지 않고 쉽게 반복할 수 있도록 말입니다.아마도 당신은 당신의 상태에 도달할 때까지 전체 목록이 필요하지 않고 일부만 필요할 수도 있습니다.

당신은 이 문서들이 유용하다는 것을 알 수 있습니다, 반복자들은 훌륭합니다.

데이터 스트림을 나타내는 개체입니다.반복에반적호출인에 __next__()메서드(또는 기본 제공 함수로 전달)next() 합니다. 스트림에서 연속된 항목을 반환합니다. 이상 할 수 없는 에는 데이터를 사용할 수 없습니다.StopIteration대신 예외가 발생합니다.에서, 반복기 되고 더 은 그것의 이시에서모소더고이반개호다출니합체를복기상되진두점반개복체기는▁its▁to▁is▁at▁further다▁calls▁the니▁any▁objectator▁iter호합출이▁and▁exhausted,▁this▁point개를체.__next__() raise 방금올 .StopIteration반니다가 합니다. 반복자들은 필요합니다.__iter__()반복기 개체 자체를 반환하여 모든 반복기도 반복할 수 있고 다른 반복기가 허용되는 대부분의 위치에서 사용할 수 있는 메서드입니다.한 가지 주목할 만한 예외는 여러 번의 반복 패스를 시도하는 코드입니다. 개체: 컨예너개체이테예()list됩니다.iter()기능하거나 for 루프에서 사용합니다.반복기를 사용하여 이 작업을 시도하면 이전 반복기 패스에 사용된 것과 동일한 반복기 개체가 반환되므로 빈 컨테이너로 표시됩니다.

Guido는 여기서 이 질문에 답합니다: "목록을 만드는 것은 낭비일 뿐이기 때문입니다."

그는 또한 올바른 변환은 규칙을 사용하는 것이라고 말합니다.for고리.

변환 중map()2에서 3까지는 단순히 a를 붙이는 단순한 경우가 아닐 수 있습니다.list( )주위에Guido는 또한 다음과 같이 말합니다.

입력 시퀀스의 길이가 동일하지 않으면,map()시퀀스 중 가장 짧은 시퀀스의 끝에서 중지됩니다.와의 완벽한 호환성을 위해map()Python 2.x에서, 또한 시퀀스를 랩으로 감습니다.itertools.zip_longest(),예.

map(func, *sequences)

된다

list(map(func, itertools.zip_longest(*sequences)))

Python 3에서는 (단순한 기능이 아닌) 많은 기능들이map그렇지만zip,range전체 목록이 아닌 반복기를 반환합니다.반복기(예: 전체 목록을 메모리에 저장하지 않음) 또는 목록(예: 인덱싱 가능)을 원할 수 있습니다.

하지만 파이썬 3의 변경의 핵심 이유는 다음을 사용하여 반복기를 목록으로 변환하는 것은 사소한 일이지만list(some_iterator)역당량iter(some_list)전체 목록이 이미 작성되어 메모리에 저장되어 있기 때문에 원하는 결과를 얻을 수 없습니다.

예를 들어 Python 3의 경우list(range(n))건물을 짓는 데 드는 비용이 거의 없기 때문에 잘 작동합니다.range개체를 목록으로 변환합니다.그러나 Python 2에서는iter(range(n))전체 목록은 에 의해 생성되므로 메모리를 저장하지 않습니다.range()반복기가 만들어지기 전에.

따라서 파이썬 2에서는 다음과 같은 목록이 아닌 반복기를 만들기 위해 별도의 함수가 필요합니다.imap위해서map(비록 그들이 완전히 동등하지는 않지만)xrange위해서range,izip위해서zip Python 은 "Python 3"과 로 합니다.list()필요한 .call은 다음과 같이 지정합니다.

언급URL : https://stackoverflow.com/questions/40015439/why-does-map-return-a-map-object-instead-of-a-list-in-python-3

반응형