람다 표현식과 익명 함수의 본질
전통적인 함수 정의 방식인 def를 사용하지 않고도 실행 가능한 함수 객체를 생성할 수 있는 문법이 람다식입니다. 이름이 지정되지 않아 메모리에 상주하지 않고 필요할 때만 생성되어 사용 후 폐기되는 특성이 있습니다.
# 기존 함수 정의 방식
def calculate_sum(x, y):
return x + y
# 람다식을 통한 단순 대체
add_operation = lambda x, y: x + y
print(add_operation(5, 10)) # 출력: 15
이러한 형태의 코드는 주로 매개변수로 다른 함수를 인자로 전달해야 하는 고차 함수(High-order Function) 환경에서 빈번하게 활용됩니다. 복잡한 로직보다는 단일 표현식으로 반환 값이 결정되는 단순 작업에 적합합니다.
고급 데이터 처리 함수 군
파이썬의 함수형 프로그래밍 요소와 밀접한 내장 함수들은 반복 가능한 객체 (Iterable) 를 효율적으로 변환하거나 필터링하는 데 사용됩니다.
map: 데이터 매핑
반복 가능한 객체의 모든 원소에 특정 연산을 적용하여 새로운 결과를 생성합니다.
data_nums = [1, 2, 3, 4, 5]
# 각 항목을 제곱하여 새 리스트로 변환
squared_data = list(map(lambda n: n * n, data_nums))
print(squared_data) # 결과: [1, 4, 9, 16, 25]
filter: 조건부 걸러내기
주어진 조건식을 만족하는 원소들만을 선별하여 추출합니다.
raw_list = [10, 25, 30, 45, 55]
# 짝수만 남기는 예제
even_only = list(filter(lambda x: x % 2 == 0, raw_list))
print(even_only) # 결과: [10, 30]
reduce: 누적 연산 (모듈 별도)
리스트의 요소를 순차적으로 두 개씩 묶어 하나의 값으로 축소합니다. 최근 버전에서는 표준 라이브러리 밖으로 나가므로 임포트가 필요합니다.
from functools import reduce
sequence = [2, 3, 4]
# 모든 값을 곱셈하여 최종 합계 도출
total_product = reduce(lambda acc, val: acc * val, sequence)
print(total_product) # 결과: 24
zip: 다중 시퀀스 결합
여러 개의 iterable 을 같은 위치의 원소끼리 묶어 튜플 형태로 조합합니다.
names = ['Alice', 'Bob']
scores = [95, 88]
paired_data = list(zip(names, scores))
print(paired_data) # 결과: [('Alice', 95), ('Bob', 88)]
sorted: 정렬 도구
데이터를 정렬하여 새로운 리스트를 반환하며, key 파라미터를 이용해 복잡한 기준 정렬이 가능합니다.
users = [{'name': 'Tom', 'age': 30}, {'name': 'Jenny', 'age': 25}]
# 나이가 어릴수록 앞에 오도록 정렬
ordered_users = sorted(users, key=lambda u: u['age'])
print(ordered_users)
최대·최소값 찾기 (max/min)
기본 비교 외에 키(Key) 함수를 지정해 간접적인 값을 기준으로 최대/최소를 찾을 수 있습니다.
prices = {
'item_A': 5000,
'item_B': 12000,
'item_C': 3000
}
# 가격을 기준으로 가장 비싼 상품의 이름 (키) 을 찾음
most_expensive = max(prices, key=lambda k: prices[k])
print(most_expensive) # 결과: item_B
유용한 유틸리티 함수 모음
개발 과정에서 자주 접하는 기본 타입 조작이나 논리 판단에 쓰이는 함수들을 정리했습니다.
- abs(): 숫자의 절대값 계산. (
abs(-10) → 10) - round(): 반올림하여 소숫점 자릿수를 조절하거나 정수로 변경. (
round(3.14159, 2) → 3.14) - pow(a, b): 지수 연산 수행. (
pow(2, 3) → 8,2**3와 동일) - sum(): 숫자 시퀀스의 총합 계산. (
sum([1, 2, 3]) → 6) - divmod(a, b): 나눗셈 결과 (몫, 나머지) 를 튜플로 반환. (
divmod(10, 3) → (3, 1))
데이터 형식 전환 및 인코딩
# 문자열을 바이트로 인코딩
text_str = "Hello"
byte_data = bytes(text_str, encoding='utf-8')
# ASCII 코드 상호 변환
char_a = chr(65) # 'A'
code_z = ord('Z') # 90
논리적 단축 평가
시퀀스 내부의 모든 값이 참인지, 혹은 하나라도 참인지를 빠르게 판단합니다.
values = [True, True, False]
all_true = all(values) # False (하나라도 거짓이면 F)
any_true = any(values) # True (하나라도 참이면 T)
객체 속성 및 실행 가능성 확인
동적으로 객체의 종류나 호출 가능 여부를 검증할 때 유용합니다.
check_var = 100
func_ref = len
print(isinstance(check_var, int)) # True: 타입 검사
print(callable(func_ref)) # True: 호출 가능한지 검사
print(callable("string")) # False: 일반 변수는 호출 불가
디버깅 및 동적 실행
dir() 는 객체가 가진 멤버 변수나 메서드 목록을 조회하는 데 사용합니다. eval() 와 exec() 는 문자열 형태의 코드를 실제로 실행하는 강력한 도구이나 보안 위험이 따르니 주의해야 합니다.
s_code = "x = 10; y = 20; print(x+y)"
eval("print(2 * 3)") # 문자열 코드의 실행 결과 리턴
hash() 함수는 객체를 고정된 크기의 정수로 변환하여 해시맵 등에 활용되며, 동일한 객체는 세션 내에서 동일한 값을 가집니다.
enumerate() 는 반복 가능한 데이터에 자동으로 인덱스를 부여하여 함께 처리할 수 있게 해줍니다.
items = ['Apple', 'Banana', 'Cherry']
indexed_items = list(enumerate(items, start=1))
# 결과: [(1, 'Apple'), (2, 'Banana'), (3, 'Cherry')]