Study/class note

python / 함수(지역변수, 전역변수, return값)

chanzae 2021. 12. 15. 14:02

ㅁ복습

1. 리스트 > 커피의 종류가 수십가지가 되어도 if문을 더 길게 나열하지 않고 짧은 코드로 개선할 수 있음.

2. 튜플 > 가격과 같은 데이터가 프로그램 내에서 변하지 않도록 코드를 작성할 수 있음.

3. 딕셔너리 > 프로그램에서 발생하는 주문 키오스크에서 발생하는 데이터를 쌓을 수 있도록 개선

 

문제162. 위의 해원이 코드에 관리자 모드로 들어갈 때 다음과 같이 비밀번호를 물어보게 하시오.

cafe_dict = {}
cafe_dict['주문번호'] = []
cafe_dict['주문시간'] = []
cafe_dict['커피종류'] = []
cafe_dict['수량'] = []
cafe_dict['가격'] = []

def data_add():
    from datetime import datetime
    now = str(datetime.now())
    cafe_dict['주문번호'].append(ornum)
    cafe_dict['주문시간'].append(now)
    cafe_dict['커피종류'].append(coffee[num-1])
    cafe_dict['수량'].append(cup)
    cafe_dict['가격'].append(cup*coffee_p[num-1])
        
import pandas as pd

coffee = ('아메리카노', '카페라떼', '카페모카')
coffee_iv = [20, 10, 30] # [0] 아메리카노 재고, [1] 카페라떼 재고, [2] 카페모카 재고
coffee_p = (1500, 2500, 3500) # [0] 아메리카노 가격, [1] 카페라떼 가격, [2] 카페모카 가격

ornum = 0 # 주문번호 

print('┏━━━━━━━━━━━━━━━━━┓\n')
print('\n\t     ·M E N U·\n')
print('\t1번: 아메리카노 1500원 \n\t2번: 카페라떼   2500원 \n\t3번: 카페모카   3500원\n\t4번: 관리자모드 입력금지\n')
print('\n┗━━━━━━━━━━━━━━━━━┛\n')

while True:
    
    if coffee_iv[0] == 0 and coffee_iv[1] == 0 and coffee_iv[2] == 0:
        print('\n※ 모든 음료 재고가 소진되었습니다 직원에게 문의해주세요 ※')
        break
        
    num = int(input('\n주문하시겠습니까? 메뉴를 골라주세요. 번호를 눌러주세요 : '))
    
    if num < 4:
        
        if coffee_iv[num-1] == 0:
            print('※ %s는 솔드아웃 되었습니다 다시 선택해주세요 ※' %coffee[num-1])
            continue
        
        print('%s를 선택하셨습니다\n' %coffee[num-1])
        
        cup = int(input('몇 잔 주문하시겠습니까? '))
        
        if cup > coffee_iv[num-1]:
            print('죄송합니다. 주문량에 비해 %s 재고가 부족합니다.' %coffee[num-1])
            print('현재 주문 가능한 수량은 %d개 입니다. 다시 입력해주세요.' %coffee_iv[num-1])
            cup = int(input('몇 잔 주문하시겠습니까? '))
            
        print('결제하실 금액은 %d원입니다' %(cup*coffee_p[num-1]))
        money = int(input('돈을 넣어주세요 :'))
        
        if money == cup*coffee_p[num-1]:
            ornum += 1
            print('\n주문 번호 %d번 : %s %d잔 나왔습니다' %(ornum, coffee[num-1], cup))
            coffee_iv[num-1] -= cup
            
        elif money > cup*coffee_p[num-1]:
            ornum += 1
            print('거스름돈은 %d원입니다 \n\n주문 번호 %d번 : %s %d잔 나왔습니다' %(money - coffee_p[num-1]*cup, ornum, coffee[num-1], cup))
            coffee_iv[num-1] -= cup
            
        else:
            print('%d원이 부족합니다. 잔돈이 반환됩니다 \n처음화면으로 돌아갑니다' %(cup*coffee_p[num-1] - money))
            continue
        
        data_add()
        
        print('\n쿠폰이 %d개가 발행되었습니다\n20개를 모으면 한잔 무료!' %cup)
    
    elif num == 4:
        password = int(input('비밀번호를 입력하시오 '))
        if password == 1234:
            print('\n※ 관리자 모드를 실행합니다 ※\n')
            cafe = pd.DataFrame(cafe_dict)
            print(cafe)
            break
        else:
            print('\n비밀번호가 틀렸습니다.\n주문창으로 돌아갑니다.')
            continue
    
    else:
        print('※ 잘못된 번호입니다 처음화면으로 돌아갑니다 ※')
        continue

 

041 지역변수와 전역변수 이해하기(global)

변수는 자신이 생성된 범위(코드블럭)안에서만 유효합니다. 함수 안에서 만든 변수는 함수 안에서 살아 있디가 함수 코드의 실행이 종료되면 그 생명을 다한다. 이것을 '지역변수'라고 한다.

ex) 스타벅스 매장용 머그컵의 개념으로 생각하면 됨.

 

이와는 반대로 함수 외부에서 만든 변수는 프로그램이 살아있는 동안에 함께 살아있다고 프로그램이 종료되면 같이 소멸이 됨. 이렇게 프로그램 전체를 유효범위로 가지는 변수를 '전역변수'라고 함.

ex) 텀블러 개념

 

예제. 전역변수와 지역변수 설명

a = 'scott' #전역변수

def func12():
    b = 'allen'    #지역변수
    return b

예제. 전역변수의 사용 예

pi = 3.1415926     # 전역변수 생성

def cycle_func1(num1):     # 원의 넓이를 구하는 함수
    global pi              # 함수 내에서 전역변수를 쓰려면 앞에 global 붙여줘야 함
    return pi * nim1 * num1
    
def cycle_fun2(num2):      # 부채꼴의 넓이를 구하는 함수
    global pi               
    return 1/4*pi*num2*num2

문제163. 반지름을 5로 해서 위의 2개의 함수를 각각 실행하시오.

print(cycle_func1(5))
print(cycle_func2(5))

#78.539815
#19.63495375

전역변수가 필요한 이유는 원주율처럼 어느 함수에서 사용하든 일괄된 데이터를 써야 할 때 필요

만약 위의 함수를 다시 지역변수로 쓸 경우 다음과 같이 실행됨. 함수를 작성할 때마다 변수값이 달라질 수 있고, 또 그에따라 결과가 다르게 나옴.

def cycle_func1(num1):    
    pi = 3.14            
    return pi * num1 * num1
    
def cycle_func2(num2):     
    pi = 3.141592             
    return 1/4*pi*num2*num2

print(cycle_func1(5))
print(cycle_func2(5))

#78.5
#19.63495

 

 

042 함수 리턴값 이해하기(return)

모든 함수는 이름을 가지고 있음. 이 이름을 불러주면 파이썬은 그 이름 아래에 정의되어 있는 코드를 실행함. 이때 함수를 부르는 코드를 호출자라고 함다. 함수가 호출자에게 결과를 돌려주는 것을 반환(return)이라고 함.

pi = 3.14159

def cycle_func1(num1):
    global pi
    return pi*num1*num1

print( cycle_func1(5) ) # 함수를 호출하는 호출자 코드

 

문제164. 커피 키오스크 코드 전체를 함수로 만들고 함수를 실행하시오. (함수이름: coffee_kiosk)

def coffee_kiosk():
    # 1. 주문 데이터를 쌓기위한 코드

    cafe_dict = {}
    cafe_dict['주문번호'] = []
    cafe_dict['주문시간'] = []
    cafe_dict['커피종류'] = []
    cafe_dict['수량'] = []
    cafe_dict['가격'] = []


    # 3. 커피종류, 커피재고, 커피가격을 리스트 또는 튜플화 함     
    # if 문 여러번 나열하지 않고 코드를 단순하게 하기 위해서 

    import pandas as pd

    coffee = ('아메리카노', '카페라떼', '카페모카')
    coffee_iv = [20, 10, 30] # [0] 아메리카노 재고, [1] 카페라떼 재고, [2] 카페모카 재고
    coffee_p = (1500, 2500, 3500) # [0] 아메리카노 가격, [1] 카페라떼 가격, [2] 카페모카 가격
    ornum = 0 # 주문번호 

    # 4. 메뉴판 출력
    print('┏━━━━━━━━━━━━━━━━━┓\n')
    print('\n\t     ·M E N U·\n')
    print('\t1번: 아메리카노 1500원 \n\t2번: 카페라떼   2500원 \n\t3번: 카페모카   3500원\n\t4번: 관리자모드 입력금지\n')
    print('\n┗━━━━━━━━━━━━━━━━━┛\n')

    # 5. 주문 프로그램 시작 
    while True:

        if coffee_iv[0] == 0 and coffee_iv[1] == 0 and coffee_iv[2] == 0:
            print('\n※ 모든 음료 재고가 소진되었습니다 직원에게 문의해주세요 ※')
            break

        num = int(input('\n주문하시겠습니까? 메뉴를 골라주세요. 번호를 눌러주세요 : '))

        if num < 4:

            if coffee_iv[num-1] == 0:
                print('※ %s는 솔드아웃 되었습니다 다시 선택해주세요 ※' %coffee[num-1])
                continue

            print('%s를 선택하셨습니다\n' %coffee[num-1])

            cup = int(input('몇 잔 주문하시겠습니까? '))

            if cup > coffee_iv[num-1]:
                print('죄송합니다. 주문량에 비해 %s 재고가 부족합니다.' %coffee[num-1])
                print('현재 주문 가능한 수량은 %d개 입니다. 다시 입력해주세요.' %coffee_iv[num-1])
                cup = int(input('몇 잔 주문하시겠습니까? '))

            print('결제하실 금액은 %d원입니다' %(cup*coffee_p[num-1]))
            money = int(input('돈을 넣어주세요 :'))

            if money == cup*coffee_p[num-1]:
                ornum += 1  # 주문번호를 생성
                print('\n주문 번호 %d번 : %s %d잔 나왔습니다' %(ornum, coffee[num-1], cup))
                coffee_iv[num-1] -= cup  # 재고에서 차감

            elif money > cup*coffee_p[num-1]:
                ornum += 1  # 주문번호를 생성
                print('거스름돈은 %d원입니다 \n\n주문 번호 %d번 : %s %d잔 나왔습니다' %(money - coffee_p[num-1]*cup, ornum, coffee[num-1], cup))
                coffee_iv[num-1] -= cup

            else:
                print('%d원이 부족합니다. 잔돈이 반환됩니다 \n처음화면으로 돌아갑니다' %(cup*coffee_p[num-1] - money))
                continue

            from datetime import datetime
            now = str(datetime.now())
            cafe_dict['주문번호'].append(ornum)
            cafe_dict['주문시간'].append(now)
            cafe_dict['커피종류'].append(coffee[num-1])
            cafe_dict['수량'].append(cup)
            cafe_dict['가격'].append(cup*coffee_p[num-1])

            print('\n쿠폰이 %d개가 발행되었습니다\n20개를 모으면 한잔 무료!' %cup)

        elif num == 4:
            secr_num = int(input('비밀번호를 입력하세요 ~ '))
            if secr_num==1234:
                cafe = pd.DataFrame(cafe_dict)
                print('\n※ 관리자 모드를 실행합니다 ※\n')
                print(cafe)
                break

        else:
            print('※ 잘못된 번호입니다 처음화면으로 돌아갑니다 ※')
            continue

함수 사용시 입력매개변수나 return 절없이 사용 가능.

 

문제165. coffee_kiok 함수에 새로운 메뉴를 추가하고 잘 작동되는지 확인하시오.

def coffee_kiosk():
    # 1. 주문 데이터를 쌓기위한 코드

    cafe_dict = {}
    cafe_dict['주문번호'] = []
    cafe_dict['주문시간'] = []
    cafe_dict['커피종류'] = []
    cafe_dict['수량'] = []
    cafe_dict['가격'] = []


    # 3. 커피종류, 커피재고, 커피가격을 리스트 또는 튜플화 함     
    # if 문 여러번 나열하지 않고 코드를 단순하게 하기 위해서 

    import pandas as pd

    coffee = ('아메리카노', '카페라떼', '카페모카','녹차라떼)
    coffee_iv = [20, 10, 30, 20] # [0] 아메리카노 재고, [1] 카페라떼 재고, [2] 카페모카 재고, [3] 녹차라떼 재고
    coffee_p = (1500, 2500, 3500, 3500) # [0] 아메리카노 가격, [1] 카페라떼 가격, [2] 카페모카 가격, [3] 녹차라떼 가격
    ornum = 0 # 주문번호 

    # 4. 메뉴판 출력
    print('┏━━━━━━━━━━━━━━━━━┓\n')
    print('\n\t     ·M E N U·\n')
    print('\t1번: 아메리카노 1500원 \n\t2번: 카페라떼   2500원 \n\t3번: 카페모카   3500원\n\t4번: 관리자모드 입력금지\n')
    print('\n┗━━━━━━━━━━━━━━━━━┛\n')

    # 5. 주문 프로그램 시작 
    while True:

        if coffee_iv[0] == 0 and coffee_iv[1] == 0 and coffee_iv[2] == 0:
            print('\n※ 모든 음료 재고가 소진되었습니다 직원에게 문의해주세요 ※')
            break

        num = int(input('\n주문하시겠습니까? 메뉴를 골라주세요. 번호를 눌러주세요 : '))

        if num < 4:

            if coffee_iv[num-1] == 0:
                print('※ %s는 솔드아웃 되었습니다 다시 선택해주세요 ※' %coffee[num-1])
                continue

            print('%s를 선택하셨습니다\n' %coffee[num-1])

            cup = int(input('몇 잔 주문하시겠습니까? '))

            if cup > coffee_iv[num-1]:
                print('죄송합니다. 주문량에 비해 %s 재고가 부족합니다.' %coffee[num-1])
                print('현재 주문 가능한 수량은 %d개 입니다. 다시 입력해주세요.' %coffee_iv[num-1])
                cup = int(input('몇 잔 주문하시겠습니까? '))

            print('결제하실 금액은 %d원입니다' %(cup*coffee_p[num-1]))
            money = int(input('돈을 넣어주세요 :'))

            if money == cup*coffee_p[num-1]:
                ornum += 1  # 주문번호를 생성
                print('\n주문 번호 %d번 : %s %d잔 나왔습니다' %(ornum, coffee[num-1], cup))
                coffee_iv[num-1] -= cup  # 재고에서 차감

            elif money > cup*coffee_p[num-1]:
                ornum += 1  # 주문번호를 생성
                print('거스름돈은 %d원입니다 \n\n주문 번호 %d번 : %s %d잔 나왔습니다' %(money - coffee_p[num-1]*cup, ornum, coffee[num-1], cup))
                coffee_iv[num-1] -= cup

            else:
                print('%d원이 부족합니다. 잔돈이 반환됩니다 \n처음화면으로 돌아갑니다' %(cup*coffee_p[num-1] - money))
                continue

            from datetime import datetime
            now = str(datetime.now())
            cafe_dict['주문번호'].append(ornum)
            cafe_dict['주문시간'].append(now)
            cafe_dict['커피종류'].append(coffee[num-1])
            cafe_dict['수량'].append(cup)
            cafe_dict['가격'].append(cup*coffee_p[num-1])

            print('\n쿠폰이 %d개가 발행되었습니다\n20개를 모으면 한잔 무료!' %cup)

        elif num == 4:
            secr_num = int(input('비밀번호를 입력하세요 ~ '))
            if secr_num==1234:
                cafe = pd.DataFrame(cafe_dict)
                print('\n※ 관리자 모드를 실행합니다 ※\n')
                print(cafe)
                break

        else:
            print('※ 잘못된 번호입니다 처음화면으로 돌아갑니다 ※')
            continue

개인 맞춤형 추천 서비스를 제공할 수 있게 됨.

 

문제165. emp2.csv로 emp 데이터 프레임을 생성하시오.

import pandas as pd

emp = pd.read_csv("c:\\data\\emp2.csv")
emp

 문제166. emp데이터 프레임을 emp_report.csv로 내리시오.

emp.to_csv("c:\\data\\emp_report.csv")

문제167. coffee_kiosk 함수의 메뉴에 관리자 모드에 지금까지 정산한 내역이 c:\\data에 내려지도록 코드를 추가하시오.

# 맨 마지막 부분에 추가하면 됨
	# 5. 주문정산 내역 판다스로 출력    
    cafe = pd.DataFrame(cafe_dict) 
    cafe.to_csv("c:\\data\\coffee_report.csv")
    return cafe
    
 
# 한글 깨질 경우
cafe.to_csv("c:\\data\\coffee_report.csv",encoding = "UTF8") 로 넘어가면 됨
                                          encoding = "ANSI"

문제168. emp 판다스 데이터 프레임의 월급의 토탈값을 출력하시오.

emp['sal'].sum()

문제169. (점심시간 문제) 커피 키오스크의 관리자모드로 정산할 때 맨 아래쪽에 지금까지 번 총 수익이 얼마인지 출력되게하시오.

def coffee_kiosk():
    import pandas as pd

    print('='*16,' CAFE ','='*16)
    print('1번:아메리카노:1500원 \n2번:카페라떼:2500원 \n3번:카페모카:3500원 \n4번:녹차라떼:3500원 \n\n9번:결산(관리자용)')
    print('='*40)

    c_type = {1:'아메리카노',2:'카페라떼',3:'카페모카',4:'녹차라떼'}
    c_stock = {1:20,2:10,3:30,4:20}
    c_price = {1:1500,2:2500,3:3500,4:3500}
    coupon = 0
    order_no = 1

    cafe_dict = {}
    cafe_dict['주문번호'] = []
    cafe_dict['주문시간'] =[]
    cafe_dict['커피종류'] = []
    cafe_dict['수량'] = []
    cafe_dict['가격'] = []

    while True:

        # 전체 품절
        if c_stock[1] == 0 and c_stock[2] == 0 and c_stock[3] == 0 and c_stock[4] == 0:
            print('\n\n\n모든 커피가 품절입니다.')
            print('='*40,'\n')
            break

        num = int(input('\n%d번손님,주문하시겠습니까? \n메뉴를 골라주세요. 번호를 눌러주세요.'%order_no))

        # 주문
        if num < 5:
            print('%s를 선택하셨습니다.'%c_type[num])
            if c_stock[num] == 0:
                print('\n%s : 품절'%c_type[num])
                print('\n다시 입력해주세요~')
                continue

            cup = int(input('몇 잔 주문하시겠습니까? '))

            if cup > c_stock[num]:
                print('\n죄송합니다. 주문량에 비해 %s가 부족합니다.'%c_type[num])
                print('현재 주문 가능한 수량은 %d잔 입니다.' %c_stock[num], '다시 입력해주세요.')
                cup = int(input('몇 잔 주문하시겠습니까? '))

            price = c_price[num] * cup
            print('\n결제하실 금액은 %d원 입니다.'%price)
            
            
            # 쿠폰 20개 미만
            if coupon < 20:
                money = int(input('돈을 입력하시오~ '))
                if c_stock[num] >= cup and money >= price:
                    print('\n[주문번호 %d]'%order_no)
                    print('%s가 나왔습니다. 거스름돈은 '%c_type[num],money - price,'원 입니다.')
                    print('쿠폰이 %d개 발급되었습니다.(20개 모으면 한잔 무료)'%cup)
                    c_stock[num] -= cup
                    coupon += cup
                    print('현재 보유한 쿠폰 :  %d개 '%coupon)
                    print('='*40,'\n')

                    from datetime import datetime
                    now = str(datetime.now())
                    cafe_dict['주문번호'].append(order_no)
                    cafe_dict['주문시간'].append(now)
                    cafe_dict['커피종류'].append(c_type)
                    cafe_dict['수량'].append(cup)
                    cafe_dict['가격'].append(price)

                    order_no += 1

                elif c_stock[num] >= cup and money < price:
                    print('금액이 부족합니다. 돈을 반환합니다.')
                    print('='*40,'\n')
                    continue
            
            #쿠폰 20개 이상
            elif coupon >= 20:
                question1 = int(input('쿠폰을 사용하시겠습니까?(1일 1회 1잔만 가능) \n예 : 1번\n아니오 : 2번 '))
                
                # 쿠폰사용 
                if question1 == 1:
                    print('\n쿠폰 20개가 차감됩니다.')
                    coupon -= 20
                    if cup == 1:
                        price -= price
                        print('\n[주문번호 %d]'%order_no)
                        print('%s가 나왔습니다. 쿠폰은 발급되지 않습니다.'%c_type[num])
                        print('현재 보유한 쿠폰 :  %d개 '%coupon)
                        print('='*40,'\n')
                    else:
                        price -= c_price[num]
                        money2 = int(input('결제할 차액은 %s 원 입니다. 돈을 입력하세요~ '%price))
                        if money2 >= price:
                            print('\n[주문번호 %d]'%order_no)
                            print('%s가 나왔습니다. 거스름돈은 %s원 입니다. 쿠폰은 발급되지 않습니다.'%(c_type[num],money2 - price))
                            print('현재 보유한 쿠폰 :  %d개 '%coupon)
                            print('='*40,'\n')
                    
                        elif money2 < price:
                            print('금액이 부족합니다. 돈을 반환합니다.')
                            print('='*40,'\n')
                            continue
                            
                    from datetime import datetime
                    now = str(datetime.now())
                    cafe_dict['주문번호'].append(order_no)
                    cafe_dict['주문시간'].append(now)
                    cafe_dict['커피종류'].append(c_type)
                    cafe_dict['수량'].append(cup)
                    cafe_dict['가격'].append(price)

                    order_no += 1
                
                #쿠폰 사용 안함
                elif question1 == 2:
                    money = int(input('돈을 입력하시오~ '))
                    if c_stock[num] >= cup and money >= price:
                        print('\n[주문번호 %d]'%order_no)
                        print('%s가 나왔습니다. 거스름돈은 '%c_type[num],money - price,'원 입니다.')
                        print('쿠폰이 %d개 발급되었습니다.(20개 모으면 한잔 무료)'%cup)
                        c_stock[num] -= cup
                        coupon += cup
                        print('현재 보유한 쿠폰 :  %d개 '%coupon)
                        print('='*40,'\n')
                        
                        from datetime import datetime
                        now = str(datetime.now())
                        cafe_dict['주문번호'].append(order_no)
                        cafe_dict['주문시간'].append(now)
                        cafe_dict['커피종류'].append(c_type)
                        cafe_dict['수량'].append(cup)
                        cafe_dict['가격'].append(price)

                        order_no += 1

                    elif c_stock[num] >= cup and money < price:
                        print('금액이 부족합니다. 돈을 반환합니다.')
                        print('='*40,'\n')
                        continue
                        
                else:
                    print('번호를 잘못 입력했습니다. 처음 화면으로 돌아갑니다.')


        # 결산(관리자용)         
        elif num == 9:
            print('\n\n------- 관리자 모드로 실행됩니다 -------')
            password = int(input('비밀번호를 입력하세요~ '))
            if password == 1234:
                print('\n\t정산 내역을 출력합니다')
                break
            else:
                print('비밀번호가 틀렸습니다. 처음 화면으로 돌아갑니다.')
                continue

      # 메뉴 없음          
        else:
            print('메뉴가 없습니다. 처음 화면으로 돌아갑니다.')
            print('='*40,'\n')
            continue

    cafe = pd.DataFrame(cafe_dict) 
    cafe.to_csv("c:\\data\\coffee_report.csv")
    print('\n  오늘 지금까지 총 수익은 ',cafe['가격'].sum(),'원 입니다.')
    return cafe

문제170. 아래의 오늘 날짜와 현재 시간을 보는 now변수를 출력하시오.

from datetime import datetime
now = str(datetime.now())

print(now)

# 2021-12-15 13:45:33.982040

문제171. 위의 결과에서 다음과 같이 아래의 날짜만 가져오게끔 하시오.(문자열 슬라이싱)

print(now[:10])

문제172. 이번에는 다음과 같이 시간도 붙여서 출력되게 하시오.

print(now[:10]+'일_'+now[11:13]+'시_'+now[14:16]+'분_'+now[17:19]+'초' )

문제173. 인공지능화 시킬 커피 키오스크 코드에 매출액 정산하는 csv파일의 이름을 coffee_report_2021-12-15일_13시_51분_49초.csv 형태로 저장되게 하시오.

cafe = pd.DataFrame(cafe_dict) 
    cafe.to_csv("c:\\data\\coffee_report_"+now[:10]+'일_'+now[11:13]+'시_'+now[14:16]+'분_'+now[17:19]+'초'+".csv",encoding = "ANSI")
    print('\n  오늘 지금까지 총 수익은 ',cafe['가격'].sum(),'원 입니다.')
    return cafe

 

반응형