[Python] 함수 활용하기
1. 인수의 형식
1) 위치 인수
1. 함수에 넣는 인수의 위치가 정해져 있는 형식
2. 인수를 순서대로 넣을 때, 리스트나 튜플 사용 ok
3. 리스트나 튜플 앞에 *(애스터리스크)를 붙여서 함수에 넣어 사용
def print_nums(a, b, c):
print(c)
print(b)
print(a)
a = [10,20,30]
print_nums(*a)
30
20
10
리스트 앞에 *(애스터리스크)를 붙이면 언패킹 되어서 인수가 각각의 매개변수에 대입되어 실행된다.
※ 참고 ※
a = [10, 20, 30, 40]
print_nums(*a)
인수의 개수와 함수의 매개변수 개수가 다를 때 에러 발생
2) 가변 인수
※ 참고 ※
언팩킹은 인자에 * 기호 붙임
가변 인수는 매개변수 앞에 * 기호 붙임
*args 에 들어온 가변인수들은 "튜플" 이어서 for문으로 반복할 수 있게 된다.
임의 개수의 인수를 받기 때문에 아무런 인수가 없어도 에러나지 않고 리턴값을 출력한다.
꼭 args 이름만을 사용하느냐? No.
Python에서 *args라는 형태로 자주 사용되기 때문에 관례적으로 args라는 이름을 많이 사용한다. (a,b 같은 느낌)
args 말고 내가 지정하는 이름으로도 가능하다.
3) 키워드 인수
def dog_info(name, age, breed):
print('이름 :', name)
print('나이 :', age)
print('품종 :', breed)
용도를 알고 있으면, 용도에 맞게 인수가 자기 자리를 찾을 수 있도록 키워드 인수를 사용
쉽게 말하면, 인수에 키워드를 붙여 순서와 상관없이 자기 용도에 맞게 쓸 수 있게 한다.
dog_info(age=10, breed='진돗개', name='규봉이')
함수의 매개변수 순서와 상관없이 인수에 키워드를 붙이면,
자기 용도에 맞게 사용할 수 있다.
키워드 인수 중 가장 대표적인 것은 print함수의 sep, end가 대표적이다.
print(10, 20, 30, 40, 50, sep=':', end='끝')
10:20:30:40:50끝
4) 키워드 인수 + 딕셔너리 언패킹
def dog_info(name, age, breed):
print('이름 :', name)
print('나이 :', age)
print('품종 :', breed)
a = {'name':'규봉이', 'age':10, 'breed':'진돗개'}
dog_info(**a)
왜 딕셔너리는 *를 두 번 사용할까?
왜냐하면 딕셔너리는 키:값 쌍의 형태로 값이 저장되어 있기 때문이다.
*을 한 번만 사용하면 어떻게 될까?
dog_info(*{'name':'규봉이', 'age':10, 'breed':'진돗개'})
이름 : name
나이 : age
품종 : breed
키만 출력되므로, **를 사용해야 한다.
5) 키워드 가변 인수
키워드 인수를 사용하면서 동시에 가변 인수 함수를 만들 수 있다.
이 함수를 만드는 방법은 가변 인수 함수를 만드는 것과 동일
def dictionary(**args):
for d, a in args.items():
print(d,":",a)
dictionary(name='tistory')
dictionary(name='tistory', function='blog')
출력은 다음과 같이 나온다.
a = {'name':'홍길동', 'age':10, 'gender':'male'}
dictionary(**a)
알맞게 출력된다.
2. 변수의 범위(variable scope)
1) 지역 변수(local variable)
함수에 필요한 모든 것을 내부에 포함시켜 독립성을 향상
2) 전역 변수(global variable)
어디에서나 참조
3. 함수에서 재귀 호출 사용하기
1) 재귀 호출이란?
함수 안에서 함수 자기자신을 호출하는 방식을 재귀호출(recursive call) 이라고 한다.
def hello():
print('Hello, world!')
hello()
파이썬에서 최대 재귀깊이가 1,000 으로 정해져 있지만
무한루프에 빠지지 않도록 하기 위해
종료 조건을 만들어주어야 한다.
def hello(count):
if count == 0: # 종료 조건
return # if문이 참이면 그대로 끝
print('Hello, world!', count)
count -= 1
hello(count)
hello(3)
[실행순서]
1. 인자를 3으로 하는 함수를 호출한다.
2. count매개변수에 3이 대입되어 함수 안으로 들어간다.
3. 조건문은 False이므로 실행하지 않고 print함수, count-1 실행 후 다시 hello함수에 인자를 2로 하는
재귀 호출이 이루어진다.
4. count 매개변수에 2가 대입되어 함수 안으로 들어간다.
조건문은 False이므로 ...
...
5. count매개변수에 0이 대입되어 함수 안으로 들어간다.
6. 조건문이 True로 성립하므로 return문이 실행되어 종료된다.