함수는 반복되는 코드의 낭비를 없애기 위해 "반복적으로 사용되는 가치 있는 부분"을 한 뭉치로 묶어서 정의하고 사용하는 것입니다.
def 함수이름(매개변수):
수행할 문장
return 결과값
함수이름(인자)
def say_hello(name, age):
print(f"이름: {name}, 나이: {age}")
say_hello('토르', 100) # 위치 인자 방식
say_hello(age=15, name='토끼') # 키워드 인자 방식
# 디폴트 매개변수 방식
def say_myself(name, age, gender='M'):
print(f"이름: {name}, 성별: {gender}")
say_myself('최현진', 25) # gender 생략 시 'M' 적용
def sum_and_mul(a, b):
return a + b, a * b # 튜플 리턴
result = sum_and_mul(3, 4) # (7, 12)
aaa, bbb = sum_and_mul(3, 4)
def func_args(*args):
print(f"타입: {type(args)}, 값: {args}")
func_args(10, 20, 30) # (10, 20, 30) 튜플로 패킹
# 출력 결과 : 타입: <class 'tuple'>, 값: (10, 20, 30)
key=value 형태의 인자들이def func_kwargs(**kwargs):
print(f"타입: {type(kwargs)}")
print(f"전체 값: {kwargs}")
# 내부의 값을 꺼내 쓸 때
if 'name' in kwargs:
print(f"이름은 {kwargs['name']}입니다.")
# 함수 호출 (이름=값 형태로 전달)
func_kwargs(name='john', age=32, city='Seoul')
**[실행 결과]**
타입: <class 'dict'>
전체 값: {'name': 'john', 'age': 32, 'city': 'Seoul'}
이름은 john입니다.
데이터 타입의 변화:
유연한 인자 처리:
딕셔너리 메서드 활용:
kwargs.keys(), kwargs.values(), kwargs.items() 등을 사용하여 전달받은 데이터를 자유롭게 다룰 수 있습니다.| 구분 | 기호 | 결과물 타입 | 주요 용도 |
|---|---|---|---|
| args | * | Tuple | 순서가 있는 여러 인자를 받을 때 |
| kwargs | ** | Dict | 이름이 지정된 여러 인자를 받을 때 |
Tip: *args와 **kwargs를 동시에 사용할 때는 반드시 *args를 먼저 써야 합니다.
예: def func(*args, **kwargs):
def print_val(kor, eng, math):
print(f"총점: {kor + eng + math}")
score = [10, 20, 30]
print_val(*score) # 리스트 언패킹 전달
'이름이 없는' 익명 inline 함수입니다.
구문: lambda [매개변수]: 표현식
sqr = lambda x: x ** 2
print(sqr(10)) # 100
# 두번째 매개변수로 함수를 받는 함수 정의
def apply_func(numbers, func):
return [func(number) for number in numbers]
apply_func([3, -2, 7], lambda x: x ** 2) # 결과: [9, 4, 49]
apply_func([3, -2, 7], lambda x: x * 2) # 결과: [6, -4, 14]
파이썬에서 함수를 인자로 받아 데이터를 효율적으로 처리하는 고차 함수(Higher-order Functions)의 개념과 사용법입니다.
| 함수 | 변환 관계 | 설명 |
|---|---|---|
| map() | N → N | 모든 요소에 함수를 적용하여 동일한 개수의 결과 생성 |
| filter() | N → N' (N' ≤ N) | 조건을 만족하는(True) 요소만 남기고 나머지는 제거 |
| reduce() | N → 1 | 모든 요소를 누적 연산하여 하나의 결과로 압축 |
집합 데이터의 각 원소에 특정 연산을 일괄 적용할 때 사용합니다. 결과는 map 객체로 반환되므로 list()로 형변환이 필요합니다.
구문: map(함수, iterable)
전달 함수: 1개의 매개변수와 1개의 리턴값이 있는 형태
예시: 리스트의 모든 요소를 제곱 처리
list(map(lambda x: x ** 2, [10, 20, 30]))
# 결과: [100, 400, 900]
각 요소에 대해 참(True)/거짓(False)을 판별하여, 참인 요소만 남깁니다.
구문: filter(함수, iterable)
전달 함수: 참/거짓을 반환하는 조건식 형태
예시: 3의 배수만 골라내기
list(filter(lambda x: x % 3 == 0, [3, 7, 9]))
# 결과: [3, 9]
**[내부 동작 과정]**
입력: [3, 7, 9]
판별: [3%3==0(T), 7%3==0(F), 9%3==0(T)]
결과: [3, 9]
데이터를 왼쪽에서 오른쪽으로 순차적으로 누적 연산합니다. functools 모듈에서 가져와야 합니다.
from functools import reduce
# 예시: 리스트의 모든 합계 구하기
reduce(lambda x, y: x + y, [1, 2, 3, 4])
# 결과: 10 ((1+2)+3)+4
별도 import 없이 바로 사용: abs(), min(), max(), sum(), len(), type(), range(), int(), str() ,sorted()등.
파이썬 설치 시 기본적으로 제공되는 모듈들로, import를 통해 사용 가능합니다.
random.random() : 0.0 이상 1.0 미만의 난수 리턴
random.seed(K) : 랜덤 결과값 고정
random.seed(42) # 시드 고정
print(random.random()) # 몇 번을 다시 실행해도 같은 값이 나옴
data = ['dog', 'cat', 'bird', 'fish']
random.shuffle(data)
print(data) # 원본의 순서가 무작위로 바뀜
결과: 1769773595.123456 (실행 시점마다 다름)
설명: 1970년 1월 1일 00:00:00(UTC) 이후 현재까지 경과한 시간을 '초' 단위로 반환합니다.
이를 타임스탬프(Unix Timestamp)라고 부릅니다.
결과: time.struct_time(tm_year=2026, tm_mon=1, tm_mday=30, tm_hour=20, tm_min=46, tm_sec=35, tm_wday=4, tm_yday=30, tm_isdst=0)
설명: 타임스탬프 값을 시스템의 현지 시간대(Local time) 기준으로 변환하여 연, 월, 일, 시, 분, 초 등의 속성을 가진 객체로 반환합니다.
결과: '2026-01-30 20:46:35'
설명: 현재 시간을 지정한 포맷 문자열 형식으로 변환합니다.
%Y: 4자리 연도 / %m: 월 / %d: 일%H: 시간(24시간제) / %M: 분 / %S: 초결과: datetime.datetime(2025, 1, 23, 0, 0)
설명: 사용자가 지정한 특정 날짜(2025년 1월 23일)를 가진 datetime 객체를 생성합니다. 시/분/초를 지정하지 않으면 0으로 설정됩니다.
결과: 2026-01-30 20:46:35.654321
설명: 현재 시스템의 로컬 날짜와 시간을 마이크로초 단위까지 정밀하게 반환합니다.
결과: 2026-01-30 20:46:35.654321+09:00
설명: 특정 시간대(서울)를 기준으로 현재 시간을 가져옵니다. 끝의 +09:00은 UTC 표준시보다 9시간 빠르다는 의미입니다.
Tip: 함수 본체 수행 중 return을 만나면 즉시 함수가 종료됩니다. return 뒤에 값이 없으면 None을 반환합니다.