맵과 고차함수 활용

Yeeun·2025년 4월 30일

Python

목록 보기
28/31

🧠 파이썬에서 함수도 인자로 전달할 수 있다! (고차 함수)

파이썬은 다른 프로그래밍 언어와 달리 함수도 값처럼 다룰 수 있는 특성을 가지고 있습니다. 즉, 함수를 인자로 넘기거나, 함수 내에서 다른 함수를 반환하는 방식으로 고차 함수를 작성할 수 있습니다. 이를 통해 코드의 유연성을 높이고, 더 효율적으로 문제를 해결할 수 있습니다.


✅ 함수는 객체다!

파이썬에서 함수는 객체입니다. 즉, 변수에 할당하거나 다른 함수의 인자로 전달할 수 있습니다. 이를 통해 함수 자체를 다룰 수 있는 고급 기능을 활용할 수 있게 됩니다.

def add(x, y):
    return x + y

# 함수를 변수에 할당
f = add

# 변수로 호출 가능
print(f(3, 4))  # 결과: 7

🏗️ 고차 함수란?

고차 함수 (Higher-order function)는 함수를 인자로 받거나, 함수를 반환하는 함수입니다. 이는 함수첫 번째 클래스 객체로 다룬다는 특징 덕분에 가능합니다.

1. 함수를 인자로 받는 함수

def apply_function(f, x):
    return f(x)

def square(n):
    return n * n

print(apply_function(square, 5))  # 결과: 25
  • apply_function 함수는 함수 f를 인자로 받습니다. 그리고 이 함수는 x를 입력으로 받아, f(x)를 반환합니다.
  • 여기서 square 함수는 제곱을 구하는 함수이고, apply_function에 인자로 넘겨주어 5의 제곱값인 25가 출력됩니다.

2. 함수를 반환하는 함수

def multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply

double = multiplier(2)  # factor를 2로 설정
triple = multiplier(3)  # factor를 3으로 설정

print(double(5))  # 결과: 10
print(triple(5))  # 결과: 15
  • multiplier 함수는 내부 함수 multiply를 정의하고, 이 함수를 반환합니다.
  • double은 2배, triple은 3배를 반환하는 함수로 변환됩니다.

🔍 고차 함수의 활용 예

1. 리스트에 적용하기

def apply_to_each(lst, func):
    return [func(x) for x in lst]

numbers = [1, 2, 3, 4, 5]
squared_numbers = apply_to_each(numbers, square)

print(squared_numbers)  # 결과: [1, 4, 9, 16, 25]
  • apply_to_each는 리스트 lst의 각 요소에 주어진 함수 func를 적용합니다. 이 경우 square 함수가 리스트의 각 원소에 적용되어, 제곱된 값이 출력됩니다.

2. 필터링하기

def filter_list(lst, func):
    return [x for x in lst if func(x)]

numbers = [1, 2, 3, 4, 5]
even_numbers = filter_list(numbers, lambda x: x % 2 == 0)

print(even_numbers)  # 결과: [2, 4]
  • filter_list는 리스트의 각 원소에 대해 조건을 만족하는 요소만 반환하는 함수입니다. 여기서는 짝수만 필터링하는 람다 함수를 넘겨주었습니다.

🔄 결론

💡 함수도 일급 객체인 파이썬

  • 함수는 변수에 할당하거나 인자로 전달할 수 있습니다.
  • 이를 통해 고차 함수를 작성하고, 더 유연한 코드를 작성할 수 있습니다.
  • 내부 함수를 반환하거나, 외부에서 함수를 적용하는 방식으로 코드를 재사용할 수 있습니다.


🧠 map(int, input().split())를 활용한 효율적인 입력 처리

파이썬에서 데이터를 처리할 때, 입력 받은 값을 처리하고 변환하는 작업은 흔하게 발생합니다. 이때 map(int, input().split())와 같은 구문을 사용하면 입력된 값을 쉽게 변환하고, 효율적으로 처리할 수 있습니다. 이 포스트에서는 그 사용법과 활용법을 소개할게요.


input()split()의 기본

먼저, input()split()이 각각 무엇을 하는지 간단히 알아봅시다.

input()

  • input() 함수는 사용자 입력을 문자열로 받는 함수입니다.
  • 입력을 받으면 그 값은 항상 문자열로 처리되므로, 이를 적절히 변환해줘야 합니다.

split()

  • split() 함수는 문자열을 분리하는 함수로, 기본적으로 공백을 기준으로 문자열을 나눕니다.
  • 예를 들어, "1 2 3"이라는 문자열에 대해 split()을 사용하면 ['1', '2', '3']와 같은 리스트를 반환합니다.

🔧 map() 함수의 역할

map() 함수

map() 함수는 함수와 반복 가능한 객체(iterable)를 인자로 받아, 해당 함수를 각 요소에 적용하는 함수입니다. 결과는 각 변환된 값들이 포함된 맵 객체를 반환합니다. 예를 들어, 숫자형 데이터로 변환하고 싶다면 map(int, iterable)과 같이 사용할 수 있습니다.


🧑‍💻 map(int, input().split()) 코드 분석

# 예시 코드
numbers = list(map(int, input().split()))

1. input()

  • 사용자가 입력하는 값은 문자열로 받습니다.

2. split()

  • 입력된 문자열을 공백을 기준으로 나누어 리스트로 만듭니다.
  • 예를 들어, 사용자가 "1 2 3"을 입력하면, split()은 이를 ['1', '2', '3']으로 나눕니다.

3. map(int, ...)

  • map(int, ...)은 각 요소를 int 타입으로 변환하는 역할을 합니다.
  • 따라서 ['1', '2', '3']map(int, ...)을 통해 각 요소를 int로 변환하면, [1, 2, 3]과 같은 정수 리스트가 됩니다.

4. list()

  • map()은 맵 객체를 반환하므로, list()로 리스트로 변환해야 실제로 값에 접근할 수 있습니다.

전체 코드 예시

numbers = list(map(int, input().split()))  # 예: "1 2 3" 입력
print(numbers)  # 👉 결과: [1, 2, 3]

🚀 활용 예시

1. 여러 숫자 입력 받기

# 사용자로부터 여러 숫자 입력 받기
numbers = list(map(int, input("Enter numbers: ").split()))
print(numbers)  # 예: [10, 20, 30, 40]

2. 두 개의 숫자 입력 받아 계산하기

# 두 개의 숫자 입력받고 더하기
x, y = map(int, input("Enter two numbers: ").split())
print(x + y)  # 예: 30

3. 정렬하기

# 여러 숫자를 입력받아 정렬하기
numbers = list(map(int, input("Enter numbers: ").split()))
numbers.sort()
print(numbers)  # 예: [2, 5, 10, 20]

4. 조건에 맞는 숫자 필터링하기

# 입력 받은 숫자들 중에서 10보다 큰 값만 출력하기
numbers = list(map(int, input("Enter numbers: ").split()))
filtered_numbers = [n for n in numbers if n > 10]
print(filtered_numbers)  # 예: [20, 30]

🔍 이 방식의 장점

1. 간결한 코드

map(int, input().split())와 같은 구문은 간결하고 한 줄로 처리할 수 있어 코드가 깔끔해집니다. 이렇게 함으로써 복잡한 변환 과정을 한 줄로 축약할 수 있습니다.

2. 효율적인 처리

map() 함수는 내부적으로 병렬 처리가 가능하기 때문에, 반복문을 통해 하나씩 처리하는 것보다 효율적으로 값을 변환할 수 있습니다.

3. 다양한 데이터 처리 가능

map()은 숫자뿐만 아니라, 다양한 데이터 타입을 처리할 수 있습니다. 예를 들어, str, float, 또는 사용자 정의 함수와 함께 사용할 수 있습니다.


📌 결론

파이썬에서 map(int, input().split())는 매우 유용한 구문으로, 사용자 입력을 쉽게 처리하고 변환하는 데 도움이 됩니다. map() 함수와 split() 메서드를 잘 활용하면, 간결하고 효율적인 코드를 작성할 수 있습니다. 다양한 형태의 데이터를 처리하고 싶을 때 꼭 기억해두세요!


고차 함수와 map() 함수는 서로 잘 결합하여 함수형 프로그래밍 스타일을 더욱 강력하게 활용할 수 있습니다. 두 개념을 연계하여 사용하면, 반복 가능한 객체(리스트, 튜플 등)에 대해 복잡한 연산을 손쉽게 처리할 수 있습니다. 이 포스트에서는 고차 함수와 map()의 결합 사용법을 다루어 보겠습니다.


🧠 고차 함수와 map() 함수의 연계 적용

✅ 고차 함수 (Higher-order Function)

고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수입니다. 고차 함수는 파이썬에서 일급 객체로 취급되는 함수의 특성을 이용하여, 매우 유연하고 강력한 코드를 작성할 수 있게 해줍니다.

고차 함수의 예시:

def apply_function(f, x):
    return f(x)

위 코드에서 apply_functionf라는 함수를 인자로 받습니다. 이와 같이 함수를 인자로 넘길 수 있다는 점이 고차 함수의 특징입니다.


map() 함수

map() 함수는 주어진 함수반복 가능한 객체의 각 요소에 적용합니다. map()은 다음과 같은 형식으로 사용됩니다:

map(function, iterable)

function은 각 요소에 적용할 함수이고, iterable은 변환할 대상입니다. map()은 각 요소에 함수를 적용한 결과를 반환합니다.

예를 들어, 숫자 리스트의 각 원소를 제곱하려면 이렇게 사용할 수 있습니다:

numbers = [1, 2, 3, 4]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers)  # 결과: [1, 4, 9, 16]

🧑‍💻 고차 함수와 map() 함수 결합하기

고차 함수와 map()을 결합하면 동적으로 함수주입하거나, 다양한 방식으로 함수 적용을 처리할 수 있습니다.

1. 함수 매핑을 위한 고차 함수 만들기

우리는 고차 함수를 사용하여, 입력값에 따라 변환할 함수를 결정하고, 그 함수를 map()으로 적용할 수 있습니다.

def apply_function(f, data):
    return list(map(f, data))

# 예시로 사용될 함수들
def square(x):
    return x**2

def double(x):
    return x * 2

numbers = [1, 2, 3, 4]

# apply_function을 사용하여 각 함수 적용
squared_numbers = apply_function(square, numbers)
doubled_numbers = apply_function(double, numbers)

print(squared_numbers)  # 결과: [1, 4, 9, 16]
print(doubled_numbers)  # 결과: [2, 4, 6, 8]

위 코드에서 apply_function고차 함수로, 동적으로 squaredouble인자로 넘겨 각 리스트에 처리 결과를 반환합니다.


2. 고차 함수에서 map()을 사용한 다양한 변환 처리

고차 함수 내에서 map()을 사용하여 다양한 변환을 처리하는 방법을 살펴봅시다.

def transform_data(data, transformation_function):
    return list(map(transformation_function, data))

# 예시로 사용될 함수들
def increment(x):
    return x + 1

def square_root(x):
    return x**0.5

data = [4, 9, 16, 25]

# transform_data에 increment 함수를 적용
incremented_data = transform_data(data, increment)
print(incremented_data)  # 결과: [5, 10, 17, 26]

# transform_data에 square_root 함수를 적용
sqrt_data = transform_data(data, square_root)
print(sqrt_data)  # 결과: [2.0, 3.0, 4.0, 5.0]

여기서 transform_data고차 함수로, transformation_function을 인자로 받아서 매핑을 통해 데이터를 변환합니다. 이를 통해 동적인 함수 선택이 가능해지고, 효율적인 데이터 처리가 가능합니다.


3. 조건에 따라 함수 적용하기

고차 함수와 map()을 사용하여, 입력 데이터에 따라 조건적으로 함수를 적용할 수도 있습니다.

def apply_conditionally(data, condition_function, transformation_function):
    return list(map(lambda x: transformation_function(x) if condition_function(x) else x, data))

# 예시 함수들
def is_even(x):
    return x % 2 == 0

def square(x):
    return x ** 2

data = [1, 2, 3, 4, 5, 6]

# 짝수에 대해서만 제곱을 적용
transformed_data = apply_conditionally(data, is_even, square)
print(transformed_data)  # 결과: [1, 4, 3, 16, 5, 36]

여기서 apply_conditionally 함수는 조건을 확인하고, 조건에 맞는 요소들에 대해서만 transformation_function을 적용합니다. 이와 같은 방식으로 데이터를 조건에 따라 다르게 처리할 수 있습니다.


📌 결론

고차 함수와 map()을 결합하여 사용할 때, 동적이고 효율적인 데이터 변환 작업을 손쉽게 처리할 수 있습니다. 고차 함수는 함수를 인자로 받거나 반환하는 특성 덕분에 매우 유연하고 강력한 코드를 작성할 수 있게 해줍니다. map()은 반복 가능한 객체의 각 요소에 변환 작업을 일괄적으로 적용할 수 있게 해줍니다.

  • 고차 함수를 사용하면 다양한 함수동적으로 선택하여 적용할 수 있습니다.
  • map()을 사용하면 반복 가능한 객체에 효율적으로 변환 작업을 처리할 수 있습니다.

이 두 개념을 잘 활용하면 파이썬에서 함수형 프로그래밍 스타일로 더 깔끔하고 효율적인 코드를 작성할 수 있습니다.

0개의 댓글