python Function & unpacking(*)

eunji hwang·2020년 4월 2일
1

BACKEND-PYTHON-DJANGO

목록 보기
1/28

파이썬에서 함수 정의하기에 대해 알아보자.

함수 정의

# 파이썬에서 함수 정의하기
def 함수명(파라미터1,파라미터2=기본값):
    로직1
    로직2
    return 리턴값

파이썬에서 함수를 정의할 때는 def 키워드로 시작하며 나머지는 다른 언어와 비슷~하다.
파이썬 함수가 갖는 특징은 아래와 같다

  • Default Value Parameter : 파라미터에 기본값 지정 가능
  • Keyword arguments : 키워드 인수로 인자값지정 가능
  • Asterisk(*,**) 를 통해 list, tuple, Dictionary unpacking 가능

Default Value Parameter

def addNumber(num1,num2=3) :
    return num1 + num2

addNumber(3) # 6 출력

addNumber()에게 인자 1개만 넘겼지만 값이 출력되었다. 함수를 정의할때 기본값을 주어줬기 때문이다.
기본값이 지정된 파라미터의 경우 값을 지정할 경우 지정값으로 변경되에 결과를 리턴하게 된다.


위치 인수 (Positional arguments)

위치인수는 인자순서에 따라 파라미터에게 값이 전달된다. 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형으로 전달되었고, 각 값을 반복문을 통해 출력하였다.


키워드 인수 (Keyword arguments)

함수에게 인자를 넘길때 키워드를 사용하여 넘겨보자. 파라미터위치가 정확하지 않아도 키워드로 지정하기 때문에 내가 원하는 결과 값을 얻을 수 있다.

# 키워드 인수 사용하기
# 함수의 인자를 키워드를 함께 쓸수 있게 하여 위치 상관없이 전달 할 수 있다.
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(**)와 딕셔너리 언팩킹

딕셔너리 언패킹

  • 매개변수와, 딕셔너리 키가 같은 문자열이어야 함 > 다르면 에러 typeError
  • 매개변수 갯수와, 딕셔너리 키의 수가 같아야 한다 > 다르면 에러 typeError
  • 언패킹할 딕셔너리의 키는 항상 문자열이여야 한다.

asterisk(**) 가 2개인 이유

  • * 하나당 1번 압축해제를 생각하면 쉽다.
  • * 는 튜플과 리스트, 즉 인덱스 하나만 압축이 풀린다.
  • * 딕셔너리에서는 키만 언패킹 되어버리고, 값은 묶인 상태, 쓸 수가 없다.
  • **키와 값 2가지를 언패킹 한다 생각하면 된다.

예제코드 A

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

키워드 인자를 전해주듯 딕셔너리의 키를 이용해 파라미터에 인자를 전달 하였다.

예제코드 B : 가변인수 활용

# 함수정의
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 앞에 정의 하면 안되는 이유?
키워드 인수와 위치 인수를 섞어 함수호출 하였다. 결과를 보자.

SyntaxError

keyword(country='한국','베르베르', age=22)
# SyntaxError: positional argument follows keyword argument

위치인수가 키워드 인수를 따르고 있단 SyntaxError가 발생하였다. 2번째 인자로 들어간 베르메르는 순서가 중요한 위치인자인데 순서에 맞지 않게 2번 인자로 넣어주었기 때문에 2번째 인자인 age자리는 키워드 인자로 자리를 찾아주었고, 베르메르는 갈곳이 없어 애러가 났을..까아? 몇개의 키워드를 안다고 해도 섞어 쓰기는 하는가...?

TypeError

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개의 인자는 키워드로 넘겼다. 키워드의 순서는 서로 바뀌었을때 잘나왔다. 앞에 놓이는 인자는 무조건 위치인자가 있어야 하며, 지정되지 않은 나머지 인자들은 키워드로 지정 가능하다.

profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

0개의 댓글