Python

[파이썬] 함수(전달값과 변환값, 기본값과 키워드값, 가변인자*,지역변수와 전역변수)

뉴라코 2024. 11. 8. 21:25
전달값, 변환값- 새로운 계좌 생성하고 입금,출금,수수료
def open_account():
    print("새로운 계좌가 생성되었습니다.")
open_account()    

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 #tuple 형식으로

 

1. 함수 정의할 때는 def를 쓰며 이전과는 다르게 print를 해도 바로 출력이 되지 않는다. 

- 세 번째줄 open_account() 하고 정의된 함수를 호출했을 때  " 새로운 계좌가 생성되었습니다" 하고 출력됨. 

 

2. 입금 함수는 두 번째 문단

첫 번째줄 deposit(계좌 총 금액, 넣는 금액) 을 입력했을 때

두 번째 줄 "입금이 완료되었습니다. 잔액은 _원입니다."라고 출력되며

세 번째 줄 계좌 총 금액+넣는 금액이 반환됨을 정의함.

 

3. 출금 함수는 세 번째 문단

첫 번째줄 withdraw(계좌 총 금액, 빼는 금액) 을 입력했을 때

두 번째 줄 "출금이 완료되었습니다. 잔액은 _원입니다."라고 출력되며

세 번째 줄 계좌 총 금액-빼는 금액이 반환됨을 정의함.

 

4. 수수료 함수는 네 번째 문단

withdraw_night(계좌 총 금액, 빼는 금액) 을 입력했을 때

첫 번째 줄에 수수료 commission을 정해준다

두 번째 줄 수수료, 총 금액 - 빼는 금액- 수수료가 결과로 반환됨을 정의함. 

 

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

 

 

1. 총 계좌가 0원으로 시작했다고 치면,

2. 1000원 입금하겠다는 deposit 함수 써서 출력 됨.

3. 2000원 출금하겠다는  withdraw 함수 씀

4. 그래서 지금 총 얼마가 있는지 보겠다

5. withdraw_night 함수에서 print 하는 것까지 정의했으면 좋았을 듯

terminal>>
입금이 완료되었습니다. 잔액은 1000원 입니다.
출금이 완료되지 않았습니다.잔액은 1000원 입니다.
1000
수수료는 100원이며, 잔액은 400원입니다

 


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

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

1. profile함수는 def profile(요소1,요소2, ...)

2. 글자 간 간격 띄울 땐 \t (역슬래쉬 t)

3. 글씨체 크기가 커서 같은 줄이지만 밑으로 내리고 싶을 땐 \ + c

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

 

# 같은 학교 같은 학년 같은 반 같은 수업.(이름만 다름)

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

profile("유재석")
profile("김태호")

1. 만약 특정 정보 빼고 같은 값을 주려면 그 안에 기본값을 입력

- age=17, main_lang="파이썬"

Terminal>>
이름:유재석 나이:17 주 사 용 언어:파이썬 이름:김태호 나이:17 주 사 용 언어:파이썬
def profile(name, age, main_lang):
    print(name,age,main_lang)

profile(name="유재석",main_lang="파이썬",age=25)

1. 키워드값을 이용하는 경우 순서가 뒤바뀌어 함수가 입력되어도 정상 출력됨.

-세번째 줄 profile(name="유재석",main_lang="파이썬",age=25)


가변인자 * 
# def profile(name, age, lan1,lang2,lan3,lan4,lan5):
#     print("이름:{0}\t나이 :{1}\t".format(name,age), end=" ")
#     print(lan1,lang2,lan3,lan4,lan5)

def profile(name, age,*language): #서로 다른 개수의 값 입력 시 가변인자*를 사용한 매개변수 이용 
    print("이름:{0}\t나이 :{1}\t".format(name,age), end=" ")
    for lang in language:
        print(lang,end=" ") #end는 줄바꿈 없이
    print() #줄바꿈

profile("유재석",20,"파이썬","자바","씨","씨쁠쁠","씨샾") 
# profile("김태호",25,"kotlin","swift","","","") #가변인자 사용 안할 때
profile("김태호",25,"kotlin","swift")

1. 첫 번째 문단에서는 def profile(이름,나이, 사용언어1,사용언어2...사용언어5) 모두 입력하는 함수 설정

2. 이때 .format(name,age), end ="  " 의 뜻은 다음 줄에 있는 출력값도 같은 줄에 출력하겠다는 뜻. 

원칙상 print는 한줄 한줄 입력시 한줄 한줄 출력됨.

3. 두 번째 문단에서는 사용 언어가 5개 이상 이거나 5개 미만인 경우를 위한 함수 설정

->def profile(이름,나이, *사용언어) 가변인자*를 사용한 매개변수 '사용언어'를 입력 ! 

4. for in 함수를 사용하여 변하는 값을 출력함.

5. print() 줄바꿈을 위한 것.

Terminal>>
이름:유재석 나이 :20 파이썬 자바 씨 씨쁠쁠 씨샾 이름:김태호 나이 :25 kotlin swift

지역변수(함수 내에서만 사용 가능) 과 전역변수(프로그램 내에서 언제든 불러옴)

-지역변수 예시

gun=10 #지역변수

def checkpoint(soldiers): #경계근무
    gun=20
    gun = gun-soldiers #checkpoint안에서 정의된 gun
    print("[함수 내]남은 총:{0}.".format(gun))
print("전체 총:{0}".format(gun)) #지역변수 출력
checkpoint(2) #2명이 경계 근무 나감
print("남은 총:{0}".format(gun)) #지역변수 출력
terminal>>
전체 총:10
[함수 내]남은 총:18.
남은 총:10

1. checkpoint(soldiers)라는 함수 정의, 총이 20자루 있고 남은 총의 개수를 출력하겠다는 것.

2. 그런데 함수 밖에 있는 gun=10과 함수 안에 있는 gun=20, gun= gun-soldiers는 무엇이 다르냐!

-> 출력값에서 확인가능. 마지막 문단 첫 번째와 세 번째 print는 함수 밖의 gun=10이 출력,

두 번째줄 checkpoint(2)에서 함수 안의 20-2=18이 출력됨.

 

-전역변수 예시

gun=10 

def checkpoint(soldiers): #경계근무
    global gun  #전역 공간에 있는 gun 사용하겠다
    gun = gun-soldiers #checkpoint안에서 정의된 gun
    print("[함수 내]남은 총:{0}.".format(gun))
print("전체 총:{0}".format(gun)) 
checkpoint(2) #2명이 경계 근무 나감
print("남은 총:{0}".format(gun))
Terminal>>
전체 총:10
[함수 내]남은 총:8.
남은 총:8

1. checkpoint 함수 설정 후 gun 앞에 global이라는 것을 붙여서 전역 변수로 만들어 버림.

2. 출력값의 gun에 전역변수 사용되어 밖에 있는 gun을 사용한 결과값 10-2=8나옴.

**하지만 전역변수의 경우 오만데서 다 사용하기 때문에 자칫하면 오류를 많이 일으킴. 

 

-전역변수를 보완할 수 있는 방법

gun=10 
def checkpoint_ret(gun,soldiers): #여기서의 gun도 함수 내 지역변수 됨.
    gun=gun-soldiers
    print("[함수 내]남은 총:{0}.".format(gun))
    return gun #return을 해줌으로써 지역변수의 gun을 밖으로 던질 수 있음

print("전체 총:{0}".format(gun)) 
gun= checkpoint_ret(gun,2) #두 명이 경계근무 나간 경우
print("남은 총:{0}".format(gun))
Terminal>>
전체 총:10
[함수 내]남은 총:8.
남은 총:8

1. 외부에서 gun=10이라는 변수 지정하고 checkpoint라는 함수 호출하고(두번째 문단 뒤에서 두번째줄)

외부의 gun을 그 함수안에 넣어서 계산한 후 그 값을 return 해준다.


함수 관련한 문제

내가 쓴 답안

print("당신의 성별은?")
input=(gender)
print("당신의 키는?")
input=(height)
def std_weight(height,gender):
    if gender == "남자":
        good_weight = height*height*22
        print("키 {0}cm 남자의 표준 체중은 {1}kg 입니다.".format(height,good_weight))
    elif gender == "여자":
        good_weight = height*height*21
        print("키 {0}cm 여자의 표준 체중은 {1}kg 입니다.".format(height,good_weight))

강사님 답안

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)
print("키 {0}cm {1}의 표준 체중은 {2}kg 입니다.".format(height,gender,weight))

1. stand weight라는 함수의 변수는 2가지 height, gender 그래서 함수 값 리턴하도록 정의

-> 함수 안에서 다 하려고 했던 것을 반성.. 함수는 일단 간단히 세우고 밖에서 출력할 것을 유념!

2. 밖에서 변수 3가지 정의하기 height,gender,weight. 마지막 weight 변수에는 함수값 출력하도록.

3. 이때, 표준체중은 m 단위이므로 키 변수 cm 단위를 바꾸는 작업을 함. height/100으로!

4.  소수점 둘째 자리 까지 이므로 반올림 함수 round(요소, 몇째자리까지 보일건지)를 입력