책 <파이썬 자료구조와 알고리즘>을 기본으로 배운 자료구조 내용입니다.
목차
-
함수인수(위치, 키워드)
-
시퀀스 타입의 패킹과, 언패킹
-
위치 인수를 사용하는 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: 서울시 용산구 이촌동
'⏳ 알고리즘 > python 알고리즘 개념' 카테고리의 다른 글
포인터 기반의 연결 방식(2) - 추상 데이터 타입(힙과 우선순위 큐) (0) | 2020.01.07 |
---|---|
포인터 기반의 연결 방식(1) - 추상 데이터 타입(스택, 큐, 덱) (0) | 2019.12.31 |
배열 기반의 연속 방식(2) - 컬렉션 자료구조(set, 딕셔너리) (0) | 2019.12.31 |
배열 기반의 연속 방식(1) - 내장 시퀀스 타입(문자열, 튜플, 리스트) (0) | 2019.12.31 |
자료구조와 자료구조의 종류 (0) | 2019.12.31 |