파이썬에서 함수 정의하기에 대해 알아보자.
# 파이썬에서 함수 정의하기
def 함수명(파라미터1,파라미터2=기본값):
로직1
로직2
return 리턴값
파이썬에서 함수를 정의할 때는 def
키워드로 시작하며 나머지는 다른 언어와 비슷~하다.
파이썬 함수가 갖는 특징은 아래와 같다
*
,**
) 를 통해 list, tuple, Dictionary unpacking 가능def addNumber(num1,num2=3) :
return num1 + num2
addNumber(3) # 6 출력
addNumber()
에게 인자 1개만 넘겼지만 값이 출력되었다. 함수를 정의할때 기본값을 주어줬기 때문이다.
기본값이 지정된 파라미터의 경우 값을 지정할 경우 지정값으로 변경되에 결과를 리턴하게 된다.
위치인수는 인자순서에 따라 파라미터에게 값이 전달된다. tuple, list의 경우 asterisk(*)
를 통해 언팩킹 하여 사용할 수 있다.
asterisk(*)
와 리스트 언팩킹python에서 함수는 위치 인수에 tuple, list 언팩킹을 할 수 있다.
def print_args(*args) :
print(args)
print(type(args))
for arg in args :
print(arg)
print_args(1,2,3,['a','b','c'],5,6)
# (1, 2, 3, 4, 5, 6)
# <class 'tuple'>
# 1
# 2
# 3
# ['a', 'b', 'c']
# 5
# 6
가변인자(여러개의 인자)를 *
를 사용해 언팩킹하였다. 전달된 값은 tuple
형으로 전달되었고, 각 값을 반복문을 통해 출력하였다.
함수에게 인자를 넘길때 키워드를 사용하여 넘겨보자. 파라미터위치가 정확하지 않아도 키워드로 지정하기 때문에 내가 원하는 결과 값을 얻을 수 있다.
# 키워드 인수 사용하기
# 함수의 인자를 키워드를 함께 쓸수 있게 하여 위치 상관없이 전달 할 수 있다.
def keyword(name,age,country):
print('이름:',name)
print('나이:',age)
print('국적:',country)
keyword(name='베르베르', age=22, country='한국')
# 이름: 베르베르
# 나이: 22
# 국적: 한국
keyword(country='한국', name='베르베르', age=22)
# 이름: 베르베르
# 나이: 22
# 국적: 한국
위 예제코드를 보자. 키워드 인수를 사용해 순서를 달리하여 같은 함수를 2번 호출 하였지만, 출력된 모습은 같다.
asterisk(**)
와 딕셔너리 언팩킹asterisk(**)
가 2개인 이유*
하나당 1번 압축해제를 생각하면 쉽다.*
는 튜플과 리스트, 즉 인덱스 하나만 압축이 풀린다.*
딕셔너리에서는 키만 언패킹 되어버리고, 값은 묶인 상태, 쓸 수가 없다.**
는 키와 값 2가지를 언패킹 한다 생각하면 된다.def my_id(name, age, country) :
print('이름:',name)
print('나이:',age)
print('국가:',country)
my_dict = { 'name' : '봉봉', 'age' : '22', 'country' : 'korea'}
my_id(**my_dict)
# 이름: 봉봉
# 나이: 22
# 국가: korea
키워드 인자를 전해주듯 딕셔너리의 키를 이용해 파라미터에 인자를 전달 하였다.
# 함수정의
def u_id(**kwargs):
for kw,arg in kwargs.items() :
print(kw,arg, sep='-')
# 딕셔너리 정의
kwargs = {
'name' : '다람쥐',
'age' : '30',
'country' : 'korea'}
# 함수호출 > 인자는 언팩킹 딕셔너리
u_id(**kwargs)
# name-다람쥐
# age-30
# country-korea
for in
반복문이 포함되어 있으며 딕셔너리의 key
, value
를 출력한다.default value parameter를 non-default value parameter 앞에 정의 하면 안되는 이유?
키워드 인수와 위치 인수를 섞어 함수호출 하였다. 결과를 보자.
keyword(country='한국','베르베르', age=22)
# SyntaxError: positional argument follows keyword argument
위치인수가 키워드 인수를 따르고 있단 SyntaxError
가 발생하였다. 2번째 인자로 들어간 베르메르
는 순서가 중요한 위치인자인데 순서에 맞지 않게 2번 인자로 넣어주었기 때문에 2번째 인자인 age자리는 키워드 인자로 자리를 찾아주었고, 베르메르는 갈곳이 없어 애러가 났을..까아? 몇개의 키워드를 안다고 해도 섞어 쓰기는 하는가...?
keyword('베르베르',33, age=22)
# Traceback (most recent call last):
# File "<pyshell#9>", line 1, in <module>
# keyword('베르베르',33, age=22)
# TypeError: keyword() got multiple values for argument 'age'
위치인수로 1,2 파라미터를 넘겼다. 키워드 인자로 age(2번째위치하는)의 값을 넘겼더니 중복됬다는 타입에러가 발생되었다.
keyword('베르베르',country='한국', age=22)
# 이름: 베르베르
# 나이: 22
# 국적: 한국
위와 같이 첫번째 위치인자로, 나머지 2개의 인자는 키워드로 넘겼다. 키워드의 순서는 서로 바뀌었을때 잘나왔다. 앞에 놓이는 인자는 무조건 위치인자가 있어야 하며, 지정되지 않은 나머지 인자들은 키워드로 지정 가능하다.