Python

파이썬 기초문법 4 <함수, 가변인자, 전역변수와 지역변수>

sogummi 2023. 3. 22. 09:47

<함수 전달값과 반환값> 

def 함수이름(전달값1, 전달값2, ...):
    실행 명령문1
    실행 명령문2
    ....
    return 반환값1, 반환값2, ...
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))
        return balance
    else:
        print("출금이 완료되었습니다. 잔액은 {0} 원입니다.".format(balance-money))
        return balance - money


def withdraw_night(balance, money):
    commission = 100  # 야간 출금 수수료
    return commission, balance - money - commission
    # 수수료, 야간 출금 후 잔액 반환


balance = 0  # 잔액 초기화
balance = deposit(balance, 1000)  # 입금 후 잔액 balance에 저장
print(balance)
withdraw(balance, 2000)
commission, balance = withdraw_night(balance, 300)
print("수수료 {0} 원이며, 현재 잔액은 {1} 원입니다.".format(commission, balance))
 
#출력결과
새로운 계좌가 생성되었습니다.
입금이 완료되었습니다. 잔액은 1000 원입니다.
1000
출금 잔액이 부족합니다. 잔액은 1000 원입니다.
수수료 100 원이며, 현재 잔액은 600 원입니다.

<함수 기본값>
- 함수 인자에 기본값을 지정하면 함수 호출 시 인자가 지정되지 않아도 기본값으로 처리됨

def hello(msg="Hello, World!"): # 함수 기본 값 지정 
    print(msg)

hello() # 출력 : Hello,World! 
hello("Hello, Python!") # 출력 : Hello, Python! 

def get_list(items=[456]):  # 함수 리스트 기본 값 지정
    return items

print(get_list())  # 기본값 출력 
print(get_list([789214])) # 매개변수 넣으면 매개변수 리스트 출력
 

<함수 가변인자>
- 함수 호출 시 인자의 개수가 가변적일 때 유용하게 사용할 수 있다.
- 가변인자 사용 시 함수내에서 인자들을 리스트나 튜플형태로 처리 가능
- 가변인자 정의 : * 또는 ** 
- 인자를 여러 개 전달하면 변수에 튜플로 묶어 전달해주는 가변인자 (*) 
- 키워드 인자를 딕셔너리로 묶어 전달하는 가변인자 (**) 

def my_function(*args): #가변인자 함수(튜플형식)
    for arg in args:
        print(arg)


my_function(123"four")

print(my_function) # 출력 1 2 3 four <function my_function at 0x0000027132CAF280>(함수이름 메모리주소 함께 출력)
my_function() # 1 2 3 four만 출력
 
 
 
def my_function(**kwargs):  #가변인자 (딕셔너리형식)
    for keyvalue in kwargs.items():
        print(keyvalue)


my_function(name="Alice"age=30city="New York")
my_function()
# 출력
name Alice
age 30
city New York

<지역변수와 전역변수>
1. 지역변수(Local Variables)
- 함수 내에서 선언된 변수
- 다른영역에서는 사용 불가
- 함수가 호출되면 메모리 할당, 함수 종료 시 메모리 해제
- 지역변수는 동일 이름으로 다른 함수에서 사용 가능
2. 전역변수(Global Variables)
- 프로그램 전체에서 사용 가능한 변수
- 모든 함수에서 참조 가능
- 프로그램 시작되면 메모리 할당, 프로그램 종료 시 메모리 해제
- 전역 변수는 범위가 프로그램 전체이기 때문에, 전역변수가 너무 많으면 복잡도가 증가하고 디버깅이 어려워지는 단점


gun = 10 # 전역변수 선언


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


print("전체 총 : {0}".format(gun))  # 전체 총: 10 
checkpoint(2)  # 2명경계근무 나감     #[함수 내] 남은 총: 18
print("남은 총: {0}".format(gun))  # 남은 총: 10
# 함수가 호출되어서 사용될 경우 지역변수 안에있는 20이라는 값이 적용
# 외부에 있는 10이라는 값은 변동 없음
# 전역변수를 많이 사용하면 코드관리 어려워질 수 있음

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


print("전체 총 : {0}".format(gun))  # 전체 총: 10
checkpoint(2)  # 2명경계근무 나감     #[함수 내] 남은총: 8
print("남은 총: {0}".format(gun))  # 남은 총: 8

# 전역변수를 파라미터로 받고 변경된 값을 return
# 함수의 전달값(파라미터)로 전달해서 반환값을 받아 사용하는 것을 권장
def checkpoint_ret(gun, soilders):
    gun = gun - soilders
    print("[함수 내] 남은 총: {0}".format(gun))
    return gun


print("전체 총 : {0}".format(gun))  # 전체 총: 10
gun = checkpoint_ret(gun, 2)  #함수에서 반환된 값을 다시 저장, 8
print("남은 총: {0}".format(gun))  # 남은 총: 8

- 전역변수를 파라미터로 받고 변경된 값을 반환할 때 gun = checkpoint_ret(gun, 2) 이렇게 전역변수와 같은 이름으로 저장한다면 전역변수의 값이 반환된 값으로 업데이트 함. 전역변수의 값이 변동되는 걸 방지하려면 gun_return과 같은 다른 네이밍으로 변수를 생성해서 저장해주면 됨. 전역 변수와 지역 변수를 명확히 구분해서 사용하는 것이 좋다가 결론 ! 

 

 

 

나도코딩 강의 참고