ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 당신의 for문에서 map()이 안되는 이유
    언어/Python 2024. 4. 22. 20:20

    상황 설명
    아래 코드에 대해서 한번 생각해보고 글을 읽기 바랍니다. 

    n = int(input())
    for i in range(n):
        a = map(int,input().split())
    print(a)
    • 저와 같은 초보자라면 아마 아래와 같이 생각할 수도 있을 거 같습니다. 
    • n = in(input()) : 사용자로부터 입력을 받은 후 정수로 변환
    • for i in range(n): : n번 반복 ( 0~n-1까지) 
    • a =  공백을 기준으로 입력을 받은 뒤 정수로 변환
    • a 출력
    5
    1 1 
    2 2
    3 3
    4 4
    5 5
    <map object at 0x0000020837A29750>

    map object at ~이라 오류가 뜹니다. 

    무엇이 문제였을 까요?

    https://stackoverflow.com/questions/37417210/lazy-evaluation-of-map

    입력값을 정수로 변환한 후에 맵 객체를 생성했지만, 그 결과를 적절하게 처리하지 않아서 발생한 문제이다. 

    map 객체는 '지연평가'를 사용한다. 즉, 생성될 때 바로 계산 되지 않고, 필요할 때까지 값을 계산하지 않습니다. 

    하지만 이 경우 값을 실제로 계산하여 결과를 얻어야 된다. 따라서 맵 객체를 리스트로 변환하여 실제 값으로 계산하고 저장해야 된다. 이를 위해 list() 함수를 사용하는 것이다. 

    * 지연평가 

    지연 평가(Lazy Evaluation)는 프로그램에서 실제로 필요한 시점까지 연산을 수행하지 않고, 필요한 값이 사용될 때까지 연산을 미루는 것을 말합니다. 이는 메모리를 효율적으로 사용할 수 있게 해주고, 성능을 향상시킬 수 있는 장점이 있습니다. 맵(map) 객체에서의 지연 평가는 맵 객체가 생성될 때 실제 연산이 수행되지 않고, 대신에 필요한 시점에 연산이 이루어집니다. 예를 들어, map() 함수를 사용하여 리스트의 모든 요소에 함수를 적용하는 경우에는 맵 객체가 반환됩니다. 이 맵 객체는 요소를 하나씩 반복하면서 실제 연산을 수행하지 않고, 요소가 필요한 시점에 함수를 적용하여 값을 반환합니다.

    def square(x):
        print("계산 중:", x)
        return x ** 2
    
    numbers = [1, 2, 3, 4, 5]
    squared_numbers = map(square, numbers)
    
    print("맵 객체 생성 후")
    
    for num in squared_numbers:
        print("반복문 내:", num)
    맵 객체 생성 후
    계산 중: 1
    반복문 내: 1
    계산 중: 2
    반복문 내: 4
    계산 중: 3
    반복문 내: 9
    계산 중: 4
    반복문 내: 16
    계산 중: 5
    반복문 내: 25

    *map() 

    map() 함수는 파이썬의 내장 함수 중 하나로, 주어진 함수를 반복 가능한(iterable) 객체(리스트, 튜플 등)의 각 요소에 적용하여 새로운 맵 객체를 반환합니다. 이 맵 객체는 필요할 때까지 연산을 수행하지 않고, 요소가 필요한 시점에 함수를 적용하여 값을 반환하는 지연 평가의 특성을 가집니다.

    map(function, iterable, ...)
    • function: 각 요소에 적용할 함수입니다.
    • iterable: 함수를 적용할 반복 가능한(iterable) 객체입니다. 여러 개의 iterable을 전달할 수 있으며, 이 경우에는 각 iterable에서 같은 인덱스에 있는 요소들이 함수의 인자로 전달됩니다.

    해답코드

    n = int(input())  # 학생 수 입력
    inputs = []  # 입력을 저장할 리스트 생성
    
    for i in range(n):
        # 입력을 정수로 변환하여 리스트에 추가
        a = list(map(int, input().split()))
        inputs.append(a)
    
    print(inputs)
Designed by Tistory.