IT Cookie
[Python 문법] 함수 본문
8. 함수(Function)
- 특정작업을 하나의 단위로 묶어 놓은 것
- 함수의 종류
- 내장 함수 : 파이썬이 기본적으로 제공하는 함수
- User 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수
- 함수 사용시 불필요한 소스코드의 길이를 줄일 수 있음
- 매개변수 : 함수 내부에서 사용할 변수
- 반환 값 : 함수에서 처리 된 결과를 반환
def 함수명(매개변수):
실행할 소스코드
return 반환값
[예시]
# 더하기 함수
def add(a, b):
return a + b
print(add(20, 23)) // 43
8-1. 파라미터 지정
- 파라미터의 변수를 직접 지정 가능
- 이 경우, 매개변수의 순서가 달라도 상관이 없음
def add(a,b):
print('결과 :', a + b)
add(b = 20, a = 23)
// 결과 : 43
8-2. 지역변수와 전역변수
- 지역변수(함수 내에서만 사용, 호출이 끝나면 사라짐)
- 전역변수(프로그램 내 어디서든 부를 수 있음)
[지역변수]
error_code = 10
def checkpoint(reviewer): // 추가근무
error_code = 20
error_code = error_code - reviewer
print("[함수 내] 남은 에러 코드 : {0}".format(error_code))
print("전체 에러 코드 : {0}".format(error_code)) // 에러코드 10개 출력
checkpoint(2) // 2명
# 추가근무 함수호출 했을 때 에러코드 18개 발견
## (밖에있는 error_code가 아니라 안에 있는 error_code가 20-2=18이 출력)
print("남은 에러 코드 : {0}".format(error_code))
# 함수 외부에서는 출력했을때 10이 그대로 -> error_code라는 변수의 값이 변하지 않은것 -> 지역변수
## 이럴때 해볼수 있는 것이 전역변수를 사용한다는 것!
/*
전체 에러 코드 : 10
[함수 내] 남은 에러 코드 : 18
남은 에러 코드 : 10
*/
[전역변수]
error_code = 10
def checkpoint(reviewer): // 추가 근무
global error_code // 전역 공간에 있는 error_code라는 변수를 checkpoint함수 내에 사용
error_code = error_code - reviewer
print("[함수 내] 남은 에러 코드 : {0}".format(error_code))
print("전체 에러 코드 : {0}".format(error_code))
checkpoint(2) // 2명 추가 근무
print("남은 에러 코드 : {0}".format(error_code))
# 실제로도 함수 외부에 있는 "error_code = 10" 의 값이 변화 -> 출력값 바뀜
/*
전체 에러 코드 : 10
[함수 내] 남은 에러 코드 : 8
남은 에러 코드 : 8
*/
[반환값 return]
- 일반적으로 전역변수를 많이 쓰게 되면 코드 관리가 어려움
- 가급적 함수의 전달값으로 파라미터로 던져서 계산하고 반환값을 받아서 사용하는 방법이 좋음
# return
# 바뀌어진 error_code 라는 변수의 값을 외부로 던질수 있음
# 밖에서는 error_code 라는 변수에 checkpoint_2 함수에서 계산되고 반환되는 값을 받아서 다시 저장함
error_code = 10
def checkpoint_2(error_code, reviewer):
error_code = error_code - reviewer
print("[함수 내] 남은 에러 코드 : {0}".format(error_code)) // 여기까지는 지역변수로써 변수값이 바뀌지 않음
return error_code
print("전체 에러 코드 : {0}".format(error_code))
checkpoint(2) // 2명 추가근무
print("남은 에러 코드 : {0}".format(error_code))
8-3. global 키워드
- global 키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고,
함수 바깥에 선언된 변수를 바로 참조하게 됨
- 기본적으로 C언어 계열의 프로그래밍 언어에서는 이러한 global 키워드가 없으면 자동으로 함수 바깥에 있는 전역변수를 참조함
- 파이썬의 경우 함수 바깥쪽에 정의되어 있는 변수를 사용하고자 할 때, global 키워드를 이용해야함
a = 0
def func():
global a
a += 1 // 바깥쪽에 선언되고 있는 a를 참조해서 a의 값을 1씩 증가
for i in range(15): // func 함수를 15번 호출
func()
print(a)
[오류해결]
- 하나의 함수를 정의
- 그 함수에서는 바깥쪽에 있는 전역변수로 선언된 a
- a라는 변수의 값을 증가시키도록 해보기
- 이때, a라는 변수가 할당되기 전 참조화 되었다는 오류메세지가 뜸
- 하나의 함수 안에 포함되어 있는 a라는 변수는 초기화가 안된것 처럼 처리가 된 것
- a라는 값이 0이라고 할당을 해준 다음 출력해야함
a = 20
def func():
a += 1
// 단순히 값 참조는 오류없이 실행가능
a = 20
def func():
print(a + 23)
func()
[연습]
- 전역변수에 참조를 해야 할 경우 global 키워드 사용
- 이 경우, 바깥쪽에 있는 전역변수에 참조할 것
- 전역변수의 값을 참조해서 값을 변경할 때, global 키워드 사용
array = [5,6,7,8,9]
def func():
global array
array.append(10)
func()
print(array)
[연습2]
- 전역변수 리스트가 선언되었을 경우
- 전역변수로 선언된 리스트 객체의 내부 메소드로 호출하는 것은 오류없이 실행됨
array = [5, 6, 7, 8, 9]
def func():
array.append(10)
print(array)
func()
[연습3]
- 함수 안에 지역변수로써, 이 전역변수와 동일한 이름의 하나의 리스트가 선언이 될 경우
- 이 함수 안에서는 지역변수가 우선적으로 참조
- 전역변수와 지역변수는 동일한 이름의 변수가 존재한다면 -> 함수 안에서는 내부적으로 선언되어 있는 함수를 우선적으로 처리
- 함수 안에서 출력되는 array를 이 함수 안쪽에서 선언되어 있는 array를 참조
- 함수 바깥쪽에서 array를 참조하게 되면 -> 전역변수로 선언되어 있는 array에 우선적으로 접근
a = 20
def func():
a = 0
a += 1
print(a)
8-4. 여러 개의 반환값
- 파이썬에서 함수는 여러개의 반환값을 가질 수 있음
- 패킹 : 여러개의 변수가 한꺼번에 반환되는 것
- 언패킹 : 함수를 호출하는 측면에서 반환된 값들을 차례대로 특정 변수에 담는 것
[연습]
- 입력으로 받을 매개변수를 차례대로 명시
- 콜론(:)을 넣어서 함수의 반환 값을 이어서 명시
- 어떠한 함수 자체를 입력으로 받는 또 다른 함수가 존재할 수 있음
def operator(a, b):
add_var = a + b
subtract_var = a - b
multiply_var = a * b
divide_var = a / b
return add_var, subtract_var, multiply_var, divide_var
a, b, c, d = operator(2, 3)
print(a, b, c, d)
// 5 -1 6 0.6666666666666666
[실습] 전달값과 반환값
1. 입금(잔액, 현재입금한금액)
➡️ def 입금 함수(balance, money):
2. 변수
➡️ balance라는 변수 - 처음엔 0원
3. 입금 deposit
➡️ 입금하는 호출을 호출하면서 현재잔액 0원 + 새로 1000원 입금하면서
➡️ 위의 def 함수구문으로 들어감 → return을 통해서 총 금액 반환
4. 출력 print
➡️ 반환될 금액을 밑에 balance에 저장함
def deposit(balance, money): // 입금
print("입금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance + money))
return balance + money
balance = 0 // 잔액(초기엔 계좌에 돈X)
balance = deposit(balance, 1000)
print(balance)
[1단계] 기본출금
// 출금
def withdraw(balance, money):
if balance >= money: // 잔액이 출금보다 많으면
print("출금이 완료되었습니다. 잔액은 {0}원입니다.".format(balance - money))
return balance - money
else: // 잔액이 출금보다 적으면
print("출금이 완료되지 않았습니다. 잔액은 {0}원입니다.".format(balance)) // 출금안했으니까 balance값만
return balance
balance = 0 // 잔액
/*
balance = withdrwaw(balance, 2000)
*/
balance = withdraw(balance, 500)
[2단계] 저녁에 출금가능(+ 수수료)
def withdraw_night(balance, money):
commission = 100
return commission, balance - money - commission
// 받고싶은 값
// 수수료가 얼마나 나왔고, 현재 잔액중에서 얼마를 출금하고 수수료까지 뺀 금액을 튜플형식으로 보내줌
// 두개의 값을 콤마로 구분해서 반환해줌
balance = 0
/* balance = deposit(balance, 1000)
balance = withdraw(balnace, 2000)
balance = withdraw(balance, 500) */
commission, balance = withdraw_night(balance, 500)
print("수수료 {0} 원이며, 잔액은 {1}원입니다.".format(commission, balance))
'SW > Python' 카테고리의 다른 글
Web Crawling 활용 (0) | 2023.03.13 |
---|---|
Web Crawling 기초 (0) | 2023.03.13 |
[Python 문법] 반복문 (0) | 2023.03.07 |
[Python 문법] 조건문 (0) | 2023.03.07 |
[Python 문법] 기본 입출력 (0) | 2023.03.07 |
Comments