IT Cookie

[Python 문법] 함수 본문

SW/Python

[Python 문법] 함수

ahhyeon 2023. 3. 7. 17:03

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)

[오류해결]

  1. 하나의 함수를 정의
  2. 그 함수에서는 바깥쪽에 있는 전역변수로 선언된 a
  3. 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