본문 바로가기

Study/class note

python / 함수

039 함수 이해하기(def)

1. 오라클을 배울 때 함수를 다음과 같이 사용했었음.

select max(sal)
 from emp;

2. 파이썬 문자열 메소드(함수) 사용하는 방법

'smith'.upper()

3. 파이썬 리스트 메소드(함수) 사용하는 방법

a = []
a.append(1)
a.append(2)

a

4. 외부 모듈의 함수

내장되어 있는 함수 말고 불러와야 쓸 수 있는 함수를 쓸 때 외부를 import해야함.

import math     # math라는 모듈(module)을 불러오겠다.
math.sqrt(4)

모듈이란? 특정 목적을 가지고 만든 프로그램 코드들의 모음

math라는 모듈은 수학식을 파이썬으로 구현하고 싶을 때 필요한 함수들이 코딩되어 있음.

 

내게 필요한 함수를 사용하려면 직접 만들어야 함.

누군가가 만들어놓은 함수가 있다면 그냥 가져다 쓰면 제일 좋고 그렇지 않고 없다면 내가 직접 만들어야 함.

 

* 함수 생성 방법

def 함수명:
    실행문
    return  출력값이 있는 변수명

 

ㅁ파이썬에서 콜론(:)으로 끝을 맺는 경우 4가지

"""
1. if문 종료시
if 조건:
    실행문
    
2. loop문 종료시
for i in range(1,11):
    실행문
    
3. 함수 생성시
def 함수이름(입력매개변수):
    함수 실행문

4. 클래스 생성시
class 클래스이름:
"""

예제. 함수만들기

def add_number(n1,n2):
    result = n1 + n2
    return result

print(add_number(1,2) )

문제148. 다음의 my_abs라는 함수를 생성하시오 (절대값을 출력하는 함수)

def my_abs(num):
    if num < 0:
        return (-1)*num
    else:
        return num

print(my_abs(-3))      #3

문제149. 유클리드 거리를 계산하는 함수를 distance_function이라는 이름으로 생성하시오.

A지점 : (2,3)

B지점 : (4,5)

위의 A지점과 B지점 사이의 유클리드 거리계산을 함수를 이용해 구하시오.

import math           #보통 import는 함수 밖에서 씀.

def distance_function(x1,y1,x2,y2):
    result1 = (x2-x1)**2
    result2 = (y2-y1)**2
    result3 = math.sqrt(result1+result2)
    return result3

거리계산이 필요한 이유?

ex) 이 환자가 유방암 환자인지 아닌지를 조직검사 하기 전에 엑스레이 사진으로만 판별하고 싶다면 수많은 엑스레이 사진을 학습한 인공지능이 양성종양인지 악성종양인지 판별해줌. 판별할 때 바로 거리를 계산해서 알아냄.

 

문제150. 맨하탄 거리공식

def manhattan_distance(x1,y1,x2,y2):
    result1 = (x2-x1)
    result2 = (y2-y1)
    result3 = my_abs(result1+result2)
    return result3

print(manhattan_distance(2,3,4,5))

 

ㅇ함수를 만들어서 사용할 때 유의할 점

1. 반복되는 코드가 하나의 긴 코드에서 반복되어 사용하고 있다면 함수를 만들어서 코드를 간격하게 해야함.

2. 함수는 가급적 재사용이 가능해야함.

3. 함수는 가급적 기능이 하나여야 함.

(단순하게 만들어야 나중에 긴 코드를 작성할 때 이런 작은 함수들을 가져다가 레고 조립하듯이 조립해서 사용 가능)

 

문제151. 아래의 오라클 함수를 파이썬으로 구현하시오.

-- SQL
select initcap('smith')
 from dual;      # Smith
# 파이썬
def initcap(name):
    result = name[0].upper() + name[1:].lower()
    return result

print(initcap('smith'))

문제152. 키오스크 커피머신의 코드를 간결하게 하기 위해서 아래의 코드를 함수로 만들어서 코드에 추가하시오.

cafe_dict['주문번호'].append(order_no)
cafe_dict['커피종류'].append('아메리카노')
cafe_dict['수량'].append(cup)


def data_add(order_no,coffee_type,cup):
    cafe_dict['주문번호'].append(order_no)
    cafe_dict['커피종류'].append(coffee_type)
    cafe_dict['수량'].append(cup)

 

 

040 함수 인자 이해하기

인자란 함수에서 사용한 입력 매개변수를 말함.

def add_text(t1,t2):
    return t1 + '  '+ t2
    
# 이때 t1, t2를 입력매개변수라고 함

만약 매개변수에 아무것도 입력하지 않고 실행해도 실행되게끔 하려면 기본값이 출력되게끔 함수를 구성해야함.

def add_text(t1, t2 ='최고'):
    return t1 + ' ' +t2
    
print(add_text('파이썬','데이터 분석'))
print(add_text('파이썬'))

#파이썬 데이터 분석
#파이썬 최고

문제153. 아래의 data_add 함수를 실행할 때 기본값을 할당하는 함수로 생성해서 아래와 같이 실행되게 하시오.

data_add('아메리카노')
data_add('카페라떼')
data_add('카페모카')

믄제154. 파이썬으로 현재 날짜와 현재 시간을 확인하시오.

from datetime import datetime

now = str(datetime.now())
print(now)

문제155. data_add 함수에 주문날짜를 추가하시오.

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


def data_add(c_type):
    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)

문제156. 아래의 SQL을 판다스로 구현하시오.

-- SQL
select max(sal)
 from emp;
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
emp['sal'].max()

 

문제157. 아래의 SQL을 판다스로 구현하시오.

-- SQL
select sum(sal)
 from emp;
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
emp['sal'].sum()

문제158. 아래의 SQL을 판다스로 구현하시오.

-- SQL
select sum(sal)
 from emp
 where deptno = 20;
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
emp['sal'][emp['deptno']==20].sum()

문제159. 아래의 SQL을 판다스로 구현하시오.

-- SQL
select deptno, sum(sal)
 from emp
 group by deptno;
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")

result = emp.groupby('deptno')['sal'].sum().reset_index()
result

reset_index()를 쓰지 않으면 결과가 data frame형식으로 나오지 않음.

 

문제160. 아래의 SQL을 판다스로 구현하시오.

-- SQL
select job, sum(sal)
 from emp
 group by job;
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")

result = emp.groupby('job')['sal'].sum().reset_index()
result

 

 

 

 

 

커피키오스크 최종

import pandas as pd

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

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

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

def data_add(c_type):
    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)
            

        
while True:
    
    # 전체 품절
    if c_stock[1] == 0 and c_stock[2] == 0 and c_stock[3] == 0:
        print('\n\n\n모든 커피가 품절입니다.')
        print('='*40,'\n')
        break
        
    num = int(input('\n%d번손님,주문하시겠습니까? \n메뉴를 골라주세요. 번호를 눌러주세요.'%order_no))

    # 주문
    if num < 4:
        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)
        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')

            data_add(c_type[num])

            order_no += 1
            
        elif c_stock[num] >= cup and money < price:
            print('금액이 부족합니다. 돈을 반환합니다.')
            print('='*40,'\n')
            continue
            
            
    # 결산(관리자용)         
    elif num == 4:
        cafe = pd.DataFrame(cafe_dict)
        print(cafe)
        break
        
  # 메뉴 없음          
    else:
        print('메뉴가 없습니다.')
        print('='*40,'\n')
        continue
반응형