- 두 수의 합을 구하는 함수를 정의하고 사용함으로써 코드의 중복을 방지
- 재사용성이 높아지고, 코드의 가독성과 유지보수성 향상파이썬이 기본적으로 제공하는 함수
(별도의 import 없이 바로 사용 가능)
내장 함수를 만드는 예시
# abs 함수 호출의 반환 값을 result에 할당
result = abs(-1)
print(result)
함수 호출(function call)
- 함수를 실행하기 위해 함수의 이름을 사용하여 해당 함수의 코드 블록을 실행하는 것
함수의 정의
함수 body
함수 반환 값
함수 호출
- 함수를 호출하기 위해서는 함수의 이름과 필요한 인자(argument)를 전달해야 함
- 호출 부분에서 전달된 인자는 함수 정의 시 작성한 매개변수에 대입됨
위치인자(Positional Arguments)
함수 호출 시 인자의 위치에 따라 전달되는 인자
위치인자는 함수 호출 시 반드시 값을 전달해야 함
def hi(name, age):
print(f'안녕, {name}야! 너는 {age}살이구나!')
hi('jingi', 25) # 안녕 jingi야! 너는 25살이구나!
기본 인자 값(Default Argument Values)
함수 정의에서 매개변수에 기본 값을 할당하는 것
함수 호출 시 인자를 전달하지 않으면, 기본값이 매개변수에 할당 됨
def hi(name, age = 50):
print(f'안녕, {name}야! 너는 {age}살이구나!')
hi('Ye') # 안녕 Ye야! 너는 50살이구나 !
hi('jingi', 25) # 안녕 jingi야! 너는 25살이구나!
키워드 인자(Keyword Arguments)
함수 호출 시 인자의 이름과 함께 값을 전달하는 인자
매개변수와 인자를 일치시키지 않고, 특정 매개변수에 값을 할당할 수 있음
인자의 순서는 중요하지 않으며, 인자의 이름을 명시하여 전달
단 , 호출 시 키워드 인자는 위치 인자 뒤에 위치해야함
def hi(name, age):
print(f'안녕, {name}야! 너는 {age}살이구나!')
hi(name = 'jingi', age = 25) # 안녕 jingi야! 너는 25살이구나!
hi(age = 25, name = 'jingi') # 안녕 jingi야! 너는 25살이구나!
임의의 인자 목록(Arbitrary Argument Lists)
case 1
정해지지 않은 개수의 인자를 처리하는 인자
함수 정의시 매개변수 앞에 '*'를 붙여 사용하며, 여러 개의 인자를 tuple로 처리
def cal_sum(*args):
print(args)
total = sum(args)
print(f'합계: {total}')
# (1, 2, 3)
# 합계 : 6
cal_sum(1, 2, 3)
case 2
정해지지 않은 개수의 키워드 인자를 처리하는 인자
함수 정의 시 매개변수 앞에 '**' 를 붙여 사용하며, 여러 개의 인자를 dictionary로 묶어 처리
def info(**kargs):
print(kargs)
info(name='jin', age=25) # ('name' : 'jin', 'age' : 25)
함수 인자 권장 작성순서
def func(pos1, pos2, default_arg='default', *args, **kargs):
---Docstring
독스트링은 함수 선언 시, def 바로 다음 줄에서 시작해서 첫 줄에는 함수의 목적을, 다음 단락부터는 세부적인 함수의 동작에 대한 설명이나 인자, 반환 값 그리고 외부에서 처리되어야 하는 예외에 대해서 설명하는 주석을 말한다.
def function(arg1, arg2) :
"""함수 설명 부분
Args:
arg1: 매개변수 1 설명
arg2: 매개변수 2 설명
Returns:
반환값 설명
"""
return True
Python의 범위(Scope)
함수는 코드 내부에 local scope를 생성하며, 그 외의 공간인 global scope로 구분
scope
variable
scope 예시
num은 local scope에 존재하기 떄문에 global에서 사용할 수 없음
이는 변수의 수명주기와 연관이 있음
def func():
num = 20
print('local', num) # local 20
func()
print('global', num) # NameError: name 'num' is not defined
변수 수명 주기(lifecycle)
'global' 키워드
변수의 스코프를 전역 범위로 지정하기 위해 사용
일반적으로 함수 내에서 전역 변수를 수정하려는 경우에 사용
num = 0 # 전역변수
def increment():
gobal num # num을 전역변수로
num += 1
print(num) # 0
increment()
print(num) # 1
주의사항
# Case 1 : global 키워드 선언 전에 접근시
num = 0
def increment():
# SynatxError: name 'num' is used prior to global declaration
print(num)
global num
num += 1
# Case 2 : 매개 변수에 global 사용불가
num = 0
def increment(num):
# "num" is assigned before global declarartion
global num
num += 1
global 키워드는 가급적 사용하지 않는 것을 권장
함수로 값을 바꾸고자 한다면 항상 인자로 넘기고 함수의 반환 값을 사용하는 것을 권장
함수 내부에서 자기 자신을 호출하는 함수
재귀 함수 특징
특정 알고리즘 식을 표현할 때 변수의 사용이 줄어들며, 코드의 가독성이 높아짐
1개 이상의 base case(종료되는 상황)가 존재하고, 수렴하도록 작성
예시
def factorial(n):
# 종료 조건 : n이 0이면 1반환
if n == 0:
return 1
return n * factorial(n - 1)
# 팩토리얼 계산 예시
result = factorial(5)
print(result) # 120
중요
map(function, iterable)
순회 가능한 데이터구조(iterable)의 모든 요소에 함수를 적용하고, 그 결과를 map object로 반환
numbers = [1, 2, 3]
result = map(str, numbers)
print(result)
print(list(result)) ['1', '2', '3']
zip(*iterables)
임의의 iterable을 모아 튜플을 원소로 하는 zip object로 반환
*iterables로 되어있는 것을 통해 여러개의 가변인자를 받을 수 있다는 것을 알 수 있다.
girls = ['jin', 'gi']
boys = ['peter', 'jay']
pair = zip(girls, boys)
print(pair) # <zip object at 0x000001C76DE58700>
print(list(pair)) # [('jin', 'peter'),('gi', 'jay')]
lambda 함수
이름 없이 정의되고 사용되는 익명 함수
함수 구조
lambda 매개변수 : 표현식
lambda 키워드
매개변수
표현식
사용 예시
# Case 1
def addition(x, y):
return x + y
result = addition(3,5)
print(result) # 8
↓
addition = lambda x, y : x +y
result = addition(3, 5)
print(result) # 8
numbers = [1, 2, 3, 4, 5]
# Case 2
def funcx(x):
return x ** 2
result = list(map(funcx, numbers))
print(result) # [1, 4, 9, 16, 25]
result2 = list(map(lambda x : x ** 2, numbers))
print(result2) # [1, 4, 9, 16, 25]
여러 개의 값을 하나의 변수에 묶어서 담는 것
패킹 예시
# 변수에 담긴 값들은 튜플 형태로 묶임
packed_values = 1, 2, 3, 4, 5
print(packed_values) #(1, 2, 3, 4, 5)
'*'을 활용한 패킹
numbers = [1, 2, 3, 4, 5]
a, *b, c = numbers
print(a) # 1
print(b) # [2, 3, 4]
print(c) # 5
# print 함수에서 임의의 가변 인자를 작성할 수 있었던 이유
# 인자의 개수에 상관없이 튜플 하나로 패킹 되어서 내부에서 처리
def my_func(*objects):
print(objects) # (1, 2, 3, 4, 5)
print(type(objects)) # <class 'tuple'>
my_func(1, 2, 3, 4, 5)
# (1, 2, 3, 4, 5)
# <class 'tuple'>
패킹된 변수의 값을 개별적인 변수로 분리하여 할당하는 것
예시
# 튜플이나 리스트 등의 객체의 요소들을 개별 변수에 할당
packed_values = 1, 2, 3, 4, 5
a, b, c, d, e = packed_values
print(a, b, c, d, e) # 1 2 3 4 5
'*'을 활용한 언패킹
names = ['alice', 'jane', 'peter']
print(*names) # alice jane peter
'**'을 활용한 언패킹
# **는 딕셔너리의 키-값 쌍을 함수의 키워드 인자로 언패킹
def my_function(x, y, z):
print(x, y, z)
my_dict = {'x' : 1, 'y' : 2, 'z' : 3}
my_function(**my_dict) # 1 2 3
'*'
'**'