09. Python Basics - 함수, 전달값, 반환값, 기본값, 키워드값, 가변인자, 지역변수, 전역변수

Jayson Hwang·2022년 4월 13일
0

Python Basics

목록 보기
9/10

9-1. 함수

함수 정의

def open_account():
    print("새로운 계좌가 생성되었습니다.")

open_account()

# 새로운 계좌가 생성되었습니다.

9-2. 전달값 & 반환값

입금

def deposit(balance, money): #입금
    print("입금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance + money))
    return balance + money

balance = 0 # 잔액
balance = deposit(balance, 1000)

# 입금이 완료되었습니다. 잔액은 1000 원입니다.
# 1000

출금

def deposit(balance, money): #입금
    print("입금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance + money))
    return balance + money

def withdraw(balance, money): #출금
    if balance >= money: #잔액이 출금보다 많으면
        print("출금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance - money))
        return balance - money
    else:
        print("출금이 완료되지 않았습니다. 잔액은 {0} 원입니다.".format(balance))
        return balance

balance = 0 # 잔액
balance = deposit(balance, 1000)
balance = withdraw(balance, 2000)
# 입금이 완료되었습니다. 잔액은 1000 원입니다.
# 출금이 완료되지 않았습니다. 잔액은 1000 원입니다.

balance = 0 # 잔액
balance = deposit(balance, 1000)
balance = withdraw(balance, 500)
# 입금이 완료되었습니다. 잔액은 1000 원입니다.
# 출금이 완료되었습니다. 잔액은 500 원입니다.

수수료

def deposit(balance, money): #입금
    print("입금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance + money))
    return balance + money

def withdraw(balance, money): #출금
    if balance >= money: #잔액이 출금보다 많으면
        print("출금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance - money))
        return balance - money
    else:
        print("출금이 완료되지 않았습니다. 잔액은 {0} 원입니다.".format(balance))
        return balance

def withdraw_night(balance, money): #저녁에 출금
    commission = 100 # 수수료 100원
    return commission, balance - money - commission

balance = 0 # 잔액
balance = deposit(balance, 1000)
commission, balance = withdraw_night(balance, 500)
print("수수료는 {0} 원이며, 잔액은 {1} 원입니다.".format(commission, balance))

# 입금이 완료되었습니다. 잔액은 1000 원입니다.
# 수수료는 100 원이며, 잔액은 400 원입니다.

9-3. 기본값

def profile(name, age, main_lang):
    print("이름 : {0}\t나이 : {1}\t주 사용 언어: {2}"\
        .format(name, age, main_lang))

profile("유재석", 20, "파이썬")
profile("김태호", 25, "자바")

# 이름 : 유재석   나이 : 20       주 사용 언어: 파이썬
# 이름 : 김태호   나이 : 25       주 사용 언어: 자바
# # 같은 학교 같은 학년 같은 반 같은 수업.
# # 이런 조건일 때 사용되는 것이 기본 값.
def profile(name, age = 17, main_lang = "파이썬"):
    print("이름 : {0}\t나이 : {1}\t주 사용 언어: {2}"\
        .format(name, age, main_lang))

profile("유재석")
profile("김태호")
profile("하하", 25, "자바")

# 이름 : 유재석   나이 : 17       주 사용 언어: 파이썬
# 이름 : 김태호   나이 : 17       주 사용 언어: 파이썬
# 이름 : 김태호   나이 : 25       주 사용 언어: 자바

9-4. 키워드 값

def profile(name, age, main_lang):
    print(name, age, main_lang)

# 키워드로 지정해서도 순서대로 입력하지 않아도 순서대로 출력이 가능하다.
profile(name = "유재석", main_lang = "파이썬", age = 20)
profile(main_lang= "자바", age = 25, name = "김태호")

# 유재석 20 파이썬
# 김태호 25 자바

9-5. 가변인자

def profile(name, age, lang1, lang2, lang3, lang4, lang5):
    print("name : {0}\tage : {1}\t".format(name, age), end=" ")
    # end = " " 는 프린트문이 끝날 때 줄바꿈을 하지않고, 이어서 밑에 있는 문장을 출력한다.
    print(lang1, lang2, lang3, lang4, lang5)

profile("jay", 20, "Python", "Java", "C", "C++", "C#")
profile("chris", 25, "Kotlin", "Swift", "", "", "")

# name : jay      age : 20         Python Java C C++ C#
# name : chris    age : 25         Kotlin Swift   

하지만,
만약에 빈값이 있을 때, 매번 빈값("")을 넣어줘야한다.
혹은 jay가 할줄 아는 언어가 추가된다면? (함수를 바꿔줘야하는 상황...)
함수를 바꾸지 않고, 이럴때 쓸 수 있는 것이 "가변인자"

def profile(name, age, *language):
    print("name : {0}\tage : {1}\t".format(name, age), end=" ")
    for lang in language:
        print(lang, end=" ")
    print()

profile("jay", 20, "Python", "Java", "C", "C++", "C#", "JavaScript")
profile("chris", 25, "Kotlin", "Swift")

# name : jay      age : 20         Python Java C C++ C# JavaScript 
# name : chris    age : 25         Kotlin Swift 

9-6. 지역변수, 전역변수

지역변수: 함수 내에서만 쓸수 있는거, 함수가 호출될때 만들어졌다가 함수 호출이 끝나면 사라지는 거
전역변수: 프로그램 내에서 어디서나 부를 수 있는 거

예제

gun = 10

def checkpoint(soldiers): # 경계근무
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))

print("전체 총 : {0}".format(gun))
checkpoint(2) # 2명이 경계근무 나감
print("남은 총 : {0}".format(gun))

# 오류 발생
# UnboundLocalError: local variable 'gun' referenced before assignment
# "gun 이라는 함수는 할당이 안되었는데 사용되고 있다." 라는 오류
# checkpoint()라는 함수 내에서 만들어진 gun인데 초기화가 되지 않아서 사용이 불가능하다는 오류
  • 지역변수
gun = 10

def checkpoint(soldiers): # 경계근무
    gun = 20
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))

print("전체 총 : {0}".format(gun))
checkpoint(2) # 2명이 경계근무 나감
print("남은 총 : {0}".format(gun))

# 전체 총 : 10
# [함수 내] 남은 총 : 18
# 남은 총 : 10
  • 전역변수
gun = 10

def checkpoint(soldiers): # 경계근무
    global gun # 전역 공간에 있는 gun을 사용
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))

print("전체 총 : {0}".format(gun))
checkpoint(2) # 2명이 경계근무 나감
print("남은 총 : {0}".format(gun))

# 전체 총 : 10
# [함수 내] 남은 총 : 8
# 남은 총 : 8

하지만,

일반적으로는 전역변수 많이 쓰게되면 코드 관리가 어려워서 권장되는 방법은 아님.
가급적 함수의 전달값 파라미터로 던져서 계산을 하고 반환값을 받아서 사용하는 방법을 사용해야함.

gun = 10

def checkpoint_return(gun, soldiers):
    gun = gun - soldiers
    print("[함수 내] 남은 총 : {0}".format(gun))
    return gun

print("전체 총 : {0}".format(gun))
gun = checkpoint_return(gun, 2)
print("남은 총 : {0}".format(gun))

# 전체 총 : 10
# [함수 내] 남은 총 : 8
# 남은 총 : 8

Quiz

표준 체중을 구하는 프로그램 작성

  • 표준 체중: 각 개인의 키에 적당한 체중

  • 성별에 따른 공식

    	- 남자: 키(m) x 키(m) x 22
    	- 여자: 키(m) x 키(m) x 21
  • 조건1 : 표준 체중은 별도의 함수 내에서 계산

    	함수명 : std_weight
    	전달값 : 키(height), 성별(gender)
  • 조건2 : 표준 체중은 소수점 둘째자리까지 표시

def std_weight(height, gender): # 키는 m 단위(실수), 성별은 "남자" / "여자"
    if gender == "남자":
        return height * height * 22
    else:
        return height * height * 21

height = 175 # cm 단위
gender = "남자"
weight = round(std_weight(height / 100, gender), 2) # 소수점 2째자리, round(, 2) 사용
print("키 {0}cm {1}의 표준 체중은 {2}kg 입니다.".format(height, gender, weight))

# 키 175cm 남자의 표준 체중은 67.38kg 입니다.
profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글