문제

map()은 "for"처럼 목록을 반복합니까?map과 for를 사용하는 데 가치가 있나요?

그렇다면 지금 내 코드는 다음과 같습니다.

for item in items:
    item.my_func()

의미가 있다면 map()으로 만들고 싶습니다.그게 가능합니까?예는 어떤가요?

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 map 대신에 for 루프를 표시했지만 결과를 사용하지 않는 것 같으므로 item.my_func(), 이것은 권장하지 않음. map 목록의 모든 요소에 부작용 없이 함수를 적용하려면 사용해야 합니다.다른 모든 상황에서는 명시적인 for 루프를 사용하세요.

또한 Python 3.0부터 map 생성기를 반환하므로 이 경우 map (생성기가 반환한 모든 요소를 ​​명시적으로 평가하지 않는 한, 동일하게 동작하지 않습니다.전화로 list 그 위에).


편집하다: 키비부 이유에 대한 설명을 댓글로 요청합니다. map의 첫 번째 인수는 부작용이 있는 함수가 아니어야 합니다.그 질문에 답해 보겠습니다.

map 함수를 전달해야 함 f 수학적 의미에서.이런 상황에서는 순서가 중요하지 않습니다. f 두 번째 인수의 요소에 적용됩니다. 반환 물론 원래 순서대로).더 중요한 것은 그러한 상황에서 map(g, map(f, l)) 의미상으로 동일합니다. map(lambda x: g(f(x)), l), 순서와 상관없이 f 그리고 g 각각의 입력에 적용됩니다..

예를 들어, 여부는 중요하지 않습니다. map 반환과 반복자 또는 전체 목록을 한 번에.그러나 만일 f 및/또는 g 부작용이 발생하면 이 동등성은 다음의 의미가 보장되는 경우에만 보장됩니다. map(g, map(f, l)) 어떤 단계에서든 g 첫 번째에 적용됩니다. N 반환된 요소 map(f, l) ~ 전에 map(f, l) 적용됩니다 f ~로 (n + 1)의 첫 번째 요소 l.(그 의미는 map 가능한 가장 게으른 반복을 수행해야 합니다. Python 3에서는 수행되지만 Python 2에서는 수행되지 않습니다!)

한 단계 더 나아가서:Python 3 구현을 가정하더라도 map, 의미론적 동등성은 다음의 출력이 다음과 같은 경우 쉽게 무너질 수 있습니다. map(f, l) 예를 들어지나가 다 itertools.tee 외부로 공급되기 전에 map 부르다.

위의 논의는 이론적 성격으로 보일 수 있지만 프로그램이 더욱 복잡해짐에 따라 추론하기가 더 어려워지고 따라서 디버깅도 더 어려워집니다.일부 사항이 변하지 않도록 하면 해당 문제가 어느 정도 완화되고 실제로 전체 버그 클래스를 예방할 수 있습니다.

마지막으로, map 많은 사람들에게 다양한 (순수한) 기능적 언어의 진정한 기능적 대응을 상기시킵니다.부작용이 있는 "함수"를 전달하면 사람들이 혼란스러워질 것입니다.따라서 대안으로 보는 것(예: 명시적 루프 사용)은 다음을 호출하는 것보다 구현하기 어렵지 않습니다. map, 사용을 제한하는 것이 좋습니다. map 적용하려는 기능이 부작용을 일으키지 않는 경우.

다른 팁

다음과 같이 맵을 사용 하여이 글을 쓸 수 있습니다.

map(cls.my_func, items)

CLS를 반복하는 항목의 클래스로 교체합니다.

Stephan202에서 언급했듯이 이것은입니다 권장되지 않습니다 이 경우.

일반적으로 목록의 각 항목에 일부 기능을 적용하여 새 목록을 작성하려면 맵을 사용하십시오. 이것은 함수가 부작용이 없다는 의미를 지니고 있으므로 (잠재적으로) 맵을 병렬로 실행할 수 있습니다.

새 목록을 만들고 싶지 않거나 함수에 부작용이있는 경우 a for loop을 사용하십시오. 이것은 당신의 예에서입니다.

약간의 의미 적 차이가 있으며, 아마도 파이썬 언어 사양에서 닫힐 수 있습니다. 그만큼 지도 명시 적으로 병렬화 가능합니다 ~을 위한 특별한 상황에서만. 코드는 할 수 있습니다 부서지다 밖으로 ~을 위한, 그러나 예외만으로 탈출합니다 지도.

제 생각에는 지도 또한 기능 순서 응용 프로그램을 보장해서는 안됩니다 ~을 위한 해야 하다. AFAIK NO PYTHON 구현은 현재이 자동 평면화를 수행 할 수 없습니다.

당신은 당신의 전환 할 수 있습니다 map 필요한 경우 멋진 나사산 또는 멀티 프로이트 또는 분산 컴퓨팅 프레임 워크에. 디스코 분산의 예이며, 실패에 대한 저항력이 있습니다. 나는 8 코어 2 상자에 그것을 구성했으며 이제는 디스코 클러스터 덕분에 프로그램이 16 배 더 빠르게 실행되었지만 프로그램을 목록 포괄적으로 다시 작성하고 루프를 맵핑/축소해야했습니다.

루프를 사용하여 프로그램을 사용하여 프로그램을 작성하는 것도 마찬가지로, 이해력과지도/축소를 목록에 포함 시키지만, 클러스터에서 실행 해야하는 경우 Map/Reduce를 사용하면 거의 무료로 수행 할 수 있습니다. 당신이하지 않았다면, 당신은 다시 작성해야 할 것입니다.

조심하십시오 : 내가 아는 한, Python 2.X는 MAP에서 반복자 대신 목록을 반환합니다. 나는 이것이 사용하여 우회 할 수 있다고 들었습니다 iter.imap() (그래도 사용하지 않았습니다).

결과 목록이 필요하지 않을 때는 명시 적으로 루프를 사용하십시오 (예 : 부작용 기능).

결과 목록이 필요할 때 목록 이해력을 사용하십시오 (예 : 입력에 따라 직접 값을 반환하는 함수).

LISP 사용자에게 Python이 사용할 가치가 있다고 확신하려고 할 때 Map ()를 사용하십시오. ;)

의 주요 장점 map 목록의 모든 요소에 대한 계산 결과를 얻으려면입니다. 예를 들어,이 스 니펫은 목록의 모든 값을 두 배로 늘립니다.

map(lambda x: x * 2, [1,2,3,4])  #=> [2, 4, 6, 8]

그것을 주목하는 것이 중요합니다 map 결과와 함께 새 목록을 반환합니다. 원래 목록을 제자리에 수정하지 않습니다.

똑같은 일을합니다 for, 빈 목록을 만들고 추가 라인을 추가해야합니다. for 본문은 각 계산 결과를 새 목록에 추가합니다. 그만큼 map 버전은 더 간결하고 기능적입니다.

루프 용으로 수동으로 코딩하는 것보다 내장 함수의 경우 맵이 때로는 더 빠를 수 있습니다. 타이밍 맵 (str, range (100000)) vs. 루프와 유사한 것을 시도하십시오.

map(lambda item: item.my_func(), items)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top