함수(기능)을 호출 → 함수(기능)를 실행
매개변수 → 함수(기능)을 실행할 때 함수에 전달할 값을 가지고 있는 변수
리턴값 → 함수(기능)가 실행을 종료하면서 반화는 하는 값
함수를 만드는 이유
- 반복되는 코드를 하나로 묶기 위해
- 기능별로 코드를 묶기 위해 (분업화를 위해)
함수의 기본
함수를 생성하는 코드의 기본 구조를 아래 보이고 있다.
def function_name():
# statement(문장 - 실행할 수 있는 코드의 최소 단위)
# 함수 선언(생성)-----------------
def greeting():
print('Hello~') # statement(문장)
# 함수 생성 코드 끝 --------------
# 함수 호출(실행) ----------------
greeting()
Hello~
함수를 불렀다. 왜 불렀을까? 기능을 수행하라고 불렀다. 이름이 함수(function, 기능)이니까
함수에 매개변수 만들기
def function_name(매개변수1, 매개변수2, ...):
#statement(문장
# 함수 선언(생성) -----------------
def add(a, b):
print(a+b)
# 함수 선언 끝 --------------------
# 함수 호출(실행)------------------
add(1,2)
3
가변 매개변수
앞서 살펴본 함수는 함수 선언할 때의 매개변수 개수와 함수를 호출할 때의 매개변수의 개수가 같아야 한다. 적어도 안되고 많아도 안된다. 그런데 그동안 많이 사용했던 print() 함수는 매개변수를 1개를 사용해도 되고 2개를 사용해도 되고... 아무런 문제가 없었다.
print('Hello')
print('Hello', 'world', '!')
Hello
Hello world !
이와 같이 매개변수를 주는 데로 받을 수 있는 함수를 가변 매개변수함수라고 한다. 매개변수를 주는 데로 받을 수 있다는 말은 매개 변수의 개수가 변할 수 있다는 의미이다. 가변 매개변수 함수는 다음과 같은 형태로 만든다.
def function_name(일반_매개변수1, 일반_매개변수2, ..., *가변_매개변수):
#statement(문장)
가변 매개변수라는 것을 명시하기 위해 매개변수 앞에 *를 붙여 표시한다. 가변 매개변수를 사용할 때는 아래 두 가지 제약이 있다.
- 가변 매개변수 뒤에는 일반 매개변수를 위치시킬 수 없음.
- 가변 매개변수는 하나만 사용할 수 있음.
위와 같은 제약 사항이 없으면 가변 매개변수가 어느 것인지 알 수 없기 때문에 만들어진 제약이다. 예를 들어 아래 코드와 같은 함수 선언이 있다고 가정하겠다.
def what_eat(n, *data):
# statement(문장)
위 함수 선언에서 매개변수 n은 일반 매개변수다. data가 가변 매개변수이다. 가변 매개변수 data뒤에 일반 매개변수가 없다. 그리고 가변 매개 변수는 하나만 있다.
def print_n_times(n, *datas):
print(datas)
for i in range(n):
for data in datas:
print( '{} '.format(data), end='' )
print()
print_n_times(2, '사과', '수박', '참외')
print('--- 구분선 ---')
print_n_times(3, '수박', '참외', '딸기', '귤')
('사과', '수박', '참외')
사과 수박 참외
사과 수박 참외
--- 구분선 ---
('수박', '참외', '딸기', '귤')
수박 참외 딸기 귤
수박 참외 딸기 귤
수박 참외 딸기 귤
가변 매개변수를 사용하는 어떤 함수를 선언하고 동작을 확인해 보겠다.
def i_eat(time, *what): # 일반매개변수1, *가변매개변수
print(time, end=' ')
for food in what:
print(food, end=' ')
print(' 먹었습니다.')
i_eat('점심밥으로', '자장면', '군만두')
점심밥으로 자장면 군만두 먹었습니다.
def my_hobby(season, month, *what): # 일반매개변수1, 일반매개변수2, *가변매개변수
print(season + ' 제 취미는 ')
for hobby in what:
print(hobby)
print('입니다.')
print('특히 {}월에 취미 생활을 위해 시간을 많이 내는 편입니다.'.format(month))
my_hobby('가을', 9, '낚시', '등산', '드라이브')
가을 제 취미는 낚시 등산 드라이브 입니다. 특히 9월에 취미 생활을 위해 시간을 많이 내는 편입니다.
Quiz
def my_hobby(season, month, *what):
print(season + ' 제 취미는 ')
for hobbyin what:
print(hobby)
print('입니다.')
print('특히 {}월에 취미 생활을 위해 시간을 많이 내는 편입니다.'.format(month))
hobby = ['낚시', '등산', '드라이브']
my_hobby('가을', 9, *hobby)
아래와 같이 출력되도록 my_hobby()함수를 수정하시오.
가을 제 취미는 낚시, 등산, 드라이브입니다.
특히 9월에 취미 생활을 위해 시간을 많이 내는 편입니다.
def my_hobby(season, month, *what):
print(season + ' 제 취미는', end=' ')
for idx, hobby in enumerate(what): # ch04 참
if idx == len(what)-1: # 마지막 요소의 경우
print(hobby, end='')
else:
print(hobby, end=', ')
print('입니다.')
print('특히 {}월에 취미 생활을 위해 시간을 많이 내는 편입니다.'.format(month))
hobby = ['낚시', '등산', '드라이브']
my_hobby('가을', 9, *hobby) # Ch04-1 전개연산자
가을 제 취미는 낚시, 등산, 드라이브입니다. 특히 9월에 취미 생활을 위해 시간을 많이 내는 편입니다.
def my_hobby(season, month, *what):
print(season + ' 제 취미는', end =' ')
print(', '.join(what), end='')
print('입니다.\\n특히 {}월에 취미 생활을 위해 시간을 많이 내는 편입니다.'.format(month))
hobby = ['낚시', '등산', '드라이브']
my_hobby('가을', 9, *hobby) # Ch04-1 전개연산자
가을 제 취미는 낚시, 등산, 드라이브입니다. 특히 9월에 취미 생활을 위해 시간을 많이 내는 편입니다.
기본 매개변수(Default parameter)
그동안 편하게 써온 print() 함수는 다음과 같은 형태로 매개변수를 받는다.
print(value, ..., sep=' ', end='\\n',file=sys.stdout, flush=False)
위 print() 함수의 value가 가변 매개변수이다. 앞에서 가변 매개변수는 일반 매개변수 앞에 올 수 없다고 말했다. 그렇다면 sep, end, .., flush는 일반 매개변수가 아니다? sep, end, .., flush는 기본 매개변수이다. 기본 매개변수는 매개변수 = 값 형태이며, 해당 함수를 호출할 때 기본 매개변수 값을 지정하지 않을 경우 매개변수=값에 의해 값이 자동으로 할당된다.
print()함수에서 end라는 매개 변수가 보인다. 이 매개변수는 end='\\n'과 같이 end의 값은 \\n으로 내정되어 있다. 매개변수 end에 우리가 별도로 값을 할당 하지 않는다면 내정된 값, \\n이 할당된다.
print('hello world!')
print('my nickname is ship')
hello World! my nickname is ship
print()함수의 기본 매개변수 end에는 print 동작 후 마지막(끝, end)에 어떤 문자를 출력할 것인지 지정하는 변수이다. 그런데 print()함수를 호출하면서 end 기본 매개변수에 아무런 값을 전달하지 않으면 사전에 설정된 기본값인 '\\n'을 출력한다. 그래서 print()함수는 주어진 문자열을 출력한 후 다음 출력 위치를 한 줄 아래로 이동했던 것이다.
print('hello world!', end=' ')
print('my nickname is ship')
hello world! my nickname is ship
위 코드 셀에서 1번 줄에 있는 print()의 경우 기본 매개변수 end에 공백(' ')을 전달했기 때문에 'hello world!' 출력 후 마지막에 출력할 글자가 공백(' ')이 되어 한 칸을 띠우게 된 것이다.
함수에서 기본 매개변수를 사용할 때 제약 조건이 하나 있다.
- 기본 매개변수 뒤에는 일반 매개변수가 올 수 없다.
기본 매개변수가 가변 매개변수보다 앞에 올 때
아래 코드 셀에 있는 코드가 실행되었을 때 어떻게 반응하는지 짐작해 보고 그 결과를 확인해 보자. 기본 매개변수가 가변 매개변수 앞에 놓여있다.
def print_n_times(n=2, *values):
for i in range(n):
for value in values:
print(value)
print()
print_n_times('안녕하세요', '즐거운', '파이썬 프로그래밍')
TypeError Traceback (most recent call last)
<ipython-input-29-21ee5f46cf1b> in <cell line: 7>()
5 print()
6
----> 7 print_n_times('안녕하세요', '즐거운', '파이썬 프로그래밍')
<ipython-input-29-21ee5f46cf1b> in print_n_times(n, *values)
1 def print_n_times(n=2, *values):
----> 2 for i in range(n):
3 for value in values:
4 print(value)
5 print()
TypeError: 'str' object cannot be interpreted as an integer
=⇒ 결론 : 기본 매개변수와 가변 매개변수를 동시에 사용하지 말 것
키워드 매개변수
매개변수 이름을 지정해서 입력하는 매개 변수를 ‘키워드 매개변수’라고 함.
기본 매개변수와 가변 매개변수를 같이 사용하면 문제 생김.
—>키워드 매개변수를 활용하면 가변 매개변수 개념도 살고 기본 매개변수 개념도 산다.
def print_n_times(*values, n=2):
for i in range(n):
for value in values:
print(value)
print()
|----> 키워드 매개변수
print_n_times("안녕하세요", "즐거운", "파이썬 프로그래밍", n=3) # 여기가 변경 되었음
안녕하세요
즐거운
파이썬 프로그래밍
안녕하세요
즐거운
파이썬 프로그래밍
안녕하세요
즐거운
파이썬 프로그래밍
리턴(Return)
- 값을 반환하면서 리턴(Return)
'리턴'의 의미는 프로그램의 흐름(또는 제어권)을 그 함수를 호출한 곳으로 넘긴다라고 생각하면 된다. 프로그램의 흐름이 자신(함수)을 호출한 쪽으로 넘기면서 값을 전달 할 수도 있고 아무 값도 전달하지 않고 흐름만 넘길 수도 있다.
returned_value = input('>>> ')
print(returned_value)
>>> 22
22
def return_test():
x = 3
print(f'{x}를 호출한 쪽에 전달하면서 리턴(제어권을 반환)합니다.')
return x
y = return_test()
print(f'{y}를 받았습니다.')
3를 호출한 쪽에 전달하면서 리턴(제어권을 반환)합니다. 3를 받았습니다.
def add(a, b):
return a + b
result = add(1, 4)
print(result)
result = add(2, 4)
print(result)
5 6
- 값을 반환하지 않고 리턴
def double_print(string):
print(string)
print(string)
data = double_print('Hello World!')
print(data)
Hello World!
Hello World!
None
# 값을 전달하면서 제어권 반환
def add(a, b):
result = a + b
return result
data = add(1, 4)
print(data)
5
# 값을 전달하지 않고 제어권만 반환
def add(a, b):
result = a + b
return
data = add(1, 4)
print(data)
None
조기 리턴
예전에는 특히 C언어 프로그래밍에서 함수를 선언한 직후에 함수에서 사용할 변수를 선언하고 리턴(return) 문은 함수 선언 코드의 맨 마지막에 하는 것이 좋다고 여겨졌다. 그러나 리턴 문을 코드의 중간에 사용할 수 있으며 최근에는 필요에 따라 함수 선언 코드 어디에서라도 리턴 문을 쓰고 있다.
함수 선언 코드의 끝에 리턴 문이 오게 하기 위해 아래와 같은 형태의 코드를 사용했다.
def fibonacci(n):
if n in dictonary:
return dictonary[n]
else:
output = fibonacci(n-1) + fibonacci(n-2)
dictonary[n] = output
retrun output
'빅데이터 분석가 양성과정 > Python' 카테고리의 다른 글
Ch06-1 예외처리 / 구문 오류와 예외 (0) | 2024.07.05 |
---|---|
Ch05-2 함수 / 함수의 활용 (0) | 2024.07.05 |
Ch04-4 반복문 / 문자열, 리스트, 딕셔너리 (3) | 2024.07.05 |
CH04-3 반복문 / 범위 자료형과 while 반복문 (0) | 2024.07.05 |
Ch04-2 반복문 / 딕셔너리와 반복문 (0) | 2024.07.04 |