Index
사용자 정의 함수는 필요에 따라 만들어서 사용할 수 있는 함수다. 아래와 같이 def 키워드로 시작하여 함수 이름과 괄호 안에 parameter를 지정하고, 함수 내에서 수행할 작업은 콜론(:) 다음에 들여쓰기하여 작성, 결과를 반환하기 위해서는 return 키워드를 사용한다.
#사용자 정의함수 작성방식
Python 에서 사용자 정의함수는 프로그래머가 필요에 따라 임의로 만드는, 재사용 가능한 코드 블록으로 아래와 같은 형식으로 작성한다.
def 함수이름(매개변수1, 매개변수2, ...):
실행할 문장1
실행할 문장2
...
return 반환값
def func(a,b):
print(a,b)
return a+b
func(3,4) # 3 4
print(func(3,4)) # 3 4 7
print(func(a=5,b=3)) # 5 3 8
#지역변수와 전역변수
a = 1
b = 2
c = 3
def f1() :
global b # b라는 변수가 global 변수임을 정의
b = 20 # 그렇기 때문에 global b 값이 20 으로 변함
c = 30
print('[1]',a,b,c)
def f2() :
b = 300 # 지역변수기 때문에 global b 값은 20으로 유지
c = 400
print('[2]',a,b,c)
print('[3]',a,b,c) # 1,2,3
f1() # 1,20,30
f2() # 1, 300, 400
print('[4]',a,b,c) #1, 20, 3
#Container 의 Unpack 활용 및 가변인자(*args, **Kwargs)
사용자 정의함수에서 매개변수가 여러개일때, *을 활용하여 아래와 같이 container 의 unpack값으로 전달할 수 있다
def func(a,b):
print(a,b)
t = (3,4)
l = ['abc',400]
s = {'abc',400}
d = {'b':10, 'a':20}
func(t) # error 발생 : 입력 매개변수가 1개 뿐이라
func(*t) # 3 4
func(*l) # abc 400
func(*s) # 400 abc : 순서 랜덤
다만 container 가 dict 타입일땐, 아래와 같이 * , ** 에 따라 출력값이 달라진다.
아래 예시에서, *d는 딕셔너리 d의 key 값을 인자로 b,a 를 순선대로 전달하고 , **d는 key = value 형식으로 전달한다. 즉 func(a,b) 에서 a 에 해당하는 20 , b에 해당하는 10 값이 전달된다.
func(*d) # b a
func(**d) # 20 10
거꾸로, 아래 예시와 같이 매개변수 자리에 *args 써서 여러개 변수를 받게 하고 실제 def 안에서는 unpack 되기전의 contatiner 상태를 활용할 수 도 있다. (*args 를 가변인자라고 부르고, ※임의 개수의 매개변수를 받기위해 사용한다 )
def args_func(*args):
for i, v in enumerate(args):
print('결과:{}'.format(i),v)
print('----')
args_func("Lee") # 결과:0 Lee
args_func('Lee', 'Park')
args_func('Lee', 'Park', 'Kim') # 결과:0 Lee 결과:1 Park 결과:2 Kim
그렇다면 dict 에서는 어떻게 쓸까? **kwargs : 가변키워드인자 를 사용한다. **kwargs 를 통해서 임의 개수의 키워드 인자를 입력받을 수 있고, kwargs 라는 dictionary 객체가 함수내에 생성된다.
def kwargs_func(**kwargs):
for v in kwargs.keys():
print("{}".format(v), kwargs[v])
print('-----')
kwargs_func(name1='Lee')
kwargs_func(name1='Lee',name2='Park',name3='Cho')
정리하면 def의 매개변수의 개수와 형태가 어떻게 들어올지 모르는 상황에서, 아래와 같이 종합적으로 사용할 수 있다.
def func(arg_1,args_2,*args,**kwargs):
print(arg_1,args_2,args,kwargs)
func(10,"abc",1,2,3,4,'kim','park',age1=20,age2=20,age3=30)
#Annotation 활용법
Annotation은 함수의 인자와 반환값의 데이터 타입, 혹은 추가적인 설명을 주석 형태로 작성하는 것으로, 코드의 가독성을 높일 수 있다.
def add(a: int, b: 'b설명') -> int:
"""두 정수를 더한 결과를 반환합니다."""
return a + b
print(add.__annotations__)
위 예시와 같이, 인자의 annotation은 인자 이름 다음에 : 을 붙인 뒤 데이터 타입이나 설명을 작성합니다. 반환값의 annotation은 함수의 인자들 다음에 -> 연산자를 사용하여 작성하며, 반환값의 데이터 타입이나 설명을 작성합니다.
#Lambda 식
람다식은 이름없는 함수를 만드는 표현식으로, 함수명이 namespace 에 등록되지 않는 방식이다. 아래 예시와 같이 간단한 함수를 정의할때 주로 사용한다.
def add(x,y):
return x+y
add = lambda x,y:x+y
# add(x,y) 에 대한 결과값 같음
이름없이 함수를 만들기 때문에, 아래와 같이 변수에 직접 할당되어 사용하는게 가능하다.
numbers = [1, 2, 3, 4, 5]
square = list(map(lambda x:x**2, numbers))
print(square)
'Study > Python' 카테고리의 다른 글
[기초문법] 파일의 읽고 쓰기 (1) | 2023.03.06 |
---|---|
[기초문법] 모듈(Module)과 패키지(Package) (1) | 2023.03.05 |
[기초문법] Class, Object(Instance), Method 이해 (1) | 2023.02.27 |
[기초문법] Python 주요 내장함수(Built-in 함수) (1) | 2023.02.25 |
[기초문법] Iterable 과 Conatainer(리스트,튜블,집합,딕셔너리) (1) | 2023.02.23 |
댓글