본문 바로가기

⏳ 알고리즘/python 알고리즘 개념

함수 인자 & 패킹, 언패킹

책 <파이썬 자료구조와 알고리즘>을 기본으로 배운 자료구조 내용입니다.

 

목차

  • 함수인수(위치, 키워드)

  • 시퀀스 타입의 패킹과, 언패킹

  • 위치 인수를 사용하는 1. 리스트 언패킹, 2. 가변인수 함수만들기

  • 키워드 인수를 사용하는 1. 딕셔너리 언패킹, 2. 가변인수 함수만들기

 

<함수 인자와 패킹, 언패킹>

함수 인수(Argument) : 함수를 호출 할 때, 우리는 인수를 매개변수에 전달해야한다. 

인수에는 위치 인수, 키워드 인수, 가변 인수, 고정 인수가 있다.

위치 인수(positional argument)

: 위치인수를 전달할 때는 호출할 함수 헤더에 있는 각각의 매개변수 순서,개수,타입과 동일하게 전달하여야 한다.

def nprintln(message, n):
	for i in range(n):
    	print(message)
        
if __name__ == "__main__":
	nprintln("test", 3)

 

키워드 인수(keyword argument) : 키워드 인수는 함수 정의시에 고정 인수 뒤에 와야한다.

  • 함수(키워드=값)
>>> personal_info(name='홍길동', age=30, address='서울시 용산구 이촌동')
이름:  홍길동
나이:  30
주소:  서울시 용산구 이촌동

 

시퀀스 타입 패킹과 언패킹

패킹(packing) : 하나의 변수에 여러가지의 값을 포장하는것을 말합니다.

>>> a = [1,2]
>>> b = [3,4]
>>> c = 'Hello'
>>> d = a, b, c   #패킹
>>> d
([1, 2], [3, 4], 'Hello')

 

언패킹(unpacking) : 여러가지의 값을 가진 하나의 변수를 여러변수로 나누는 것을 말합니다.

>>> a, b, c, d, e = 'Hello'   #언패킹
>>> a
'H'
>>> b
'e'
>>> c
'l'
>>> d
'l'
>>> e
'o'

 

위치 인수와 리스트 언패킹 사용하기

리스트나 튜플 앞에 *를 붙이면 언패킹(unpacking)이 되어서 print_numbers(10, 20, 30)과 똑같은 동작이 된다.

(이때 함수의 매개변수 개수와 리스트나 튜플의 요소 개수 같아야 함.)

  • 함수(*리스트)
  • 함수(*튜플)
#위치 인수를 사용하는 함수를 만들고 호출하기

>>> def print_numbers(a, b, c):
...     print(a)
...     print(b)
...     print(c)
...
>>> print_numbers(10, 20, 30)
10
20
30
>>> x = [10, 20, 30]
>>> print_numbers(*x)
10
20
30

 

위치 인수를 사용하는 가변 인수(variable argument) 함수 만들기

위치 인수와 리스트(튜플) 언패킹은 주로 인수의 개수가 정해지지 않은 가변 인수에 사용된다. 

다음과 같이 가변 인수 함수는 매개변수 앞에 *을 붙여서 만든다.

# 매개변수 이름은 원하는 대로 지어도 되지만 관례적으로 arguments의 args을 사용

>>> def print_numbers(*args):
...     for arg in args:
...         print(arg)
...
>>> print_numbers(10)
10
>>> print_numbers(10, 20, 30, 40)
10
20
30
40
>>> x = [10]
>>> print_numbers(*x)
10
>>> y = [10, 20, 30, 40]
>>> print_numbers(*y)
10
20
30
40

 

키워드 인수를 사용하는 딕셔너리 언패킹 사용하기

딕셔너리에 '키워드' : 값 형식으로 인수를 저장하고, 앞에 **를 붙여서 함수에 넣어준다. 이때 딕셔너리의 키워드는 반드시 문자열 형태여야 함.

#딕셔너리 만들기

>>> def personal_info(name, age, address):
...     print('이름: ', name)
...     print('나이: ', age)
...     print('주소: ', address)
...
>>> x = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}

#딕셔너리 언패킹

>>> personal_info(**x)
이름:  홍길동
나이:  30
주소:  서울시 용산구 이촌동
>>>

#딕셔너리 변수 대신 딕셔너리 앞에 바로 **를 붙여도 동작은 같다.

>>> personal_info(**{'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'})
이름:  홍길동
나이:  30
주소:  서울시 용산구 이촌동

 

**를 두 번 사용하는 이유 : 딕셔너리는 { 키-값 } 쌍 형태로 값이 저장되어 있기 때문이다.

*을 한 번만 사용하면 딕셔너리의 key값이 출력되고 

**을 사용하면 딕셔너의의 value값이 출력된다.

 

키워드 인수를 사용하는 가변 인수(variable argument) 함수 만들기

# 매개변수 이름은 원하는 대로 지어도 되지만 관례적으로 keyword arguments의 kwargs을 사용

>>> def personal_info(**kwargs):
...     for kw, arg in kwargs.items():
...         print(kw, ': ', arg, sep='')
...

# 직접 인수 넣기

>>> personal_info(name='홍길동', age=30, address='서울시 용산구 이촌동')
name: 홍길동
age: 30
address: 서울시 용산구 이촌동

# 딕셔너리 언패킹을 사용

>>> x = {'name': '홍길동', 'age': 30, 'address': '서울시 용산구 이촌동'}
>>> personal_info(**x)
name: 홍길동
age: 30
address: 서울시 용산구 이촌동