ABC 부트캠프/python

4일차 - python 함수, 모듈, 파일과 예외 처리, 객체지향 프로그래밍

멋진단지 2023. 3. 17. 16:26

함수란?

함수는 수학에서의 '함수' 개념과 '함수'의 영어 단어인 function이 가지는 '기능'이라는 의미를 모두 가진다.

내장함수 종류

파이썬 안에서 기본적으로 사용할 수 있는 함수.

파이썬의 내장함수
파이썬의 내장함수

 

 

 

 

 

 

사용자 정의 함수 (함수의 정의와 호출)

내가 직접 만드는 함수!

"""
함수 생성 및 호출
"""

# 함수 정의는 위에다가 하기!
def hello():
    print("안녕하세요!")


# 메인 루틴(실제로 프로그램이 시작할 때 실행되는 부분)
# 실제로 시작되는 코드
# 사용자가 만든 hello 함수를 출력
hello()
hello()
hello()

def 로 직접 자신이 함수를 만들 수 있다!

사용자 함수의 정의는 메인 루틴보다 위에다가 작성해야 함!

 

* 메인 루틴: 실제로 프로그램이 시작할 때 실행되는 부분.

 

 

 

 

 

 

 

함수의 매개변수

매개변수는 함수에서 전달하고자 하는 값이나 변수를 전달받기 위해 함수 정의에서 사용되는 변수.

 

def say_hello(name):

     print("%s님 안녕하세요!")

 

say_hello 함수에서 name이 매개변수!

"""
함수의 매개변수
"""

def hello():
    print("안녕하세요!")

def say_hello(name):
    print("%s님 안녕하세요!" % name)

def print_name(f_name, l_name):
    name = f_name + l_name
    print("%s님 안녕하세요!" % name)
    
    
# 홀수 짝수를 판정해서 출력하는 함수
def even_add(n):
    if n % 2 == 0:
        print("%d는 짝수이다." % n)
    else:
        print("%d는 홀수이다." % n)

hello()
say_hello("오소진")
print_name("오", "소진")

x = int(input("양의 정수를 입력하세요: "))
even_add(x)

매개변수는 여러 개 사용할 수 있음.

하지만, 함수를 호출할 때 인수의 개수와 사용되는 매개변수의 개수는 같아야 함.

 

위의 print_name의 함수에서

print_name("소진")

으로 인수 한 개만 보내면 에러가 발생함. 

 

 

 

 

 

매개변수 *args

# 평균을 구하는 함수 -> 매개변수를 가변적으로 사용할 수 있도록 *args
def average(*args):
    num_args = len(args)
    sm = 0
    for i in range(num_args):
        sm = sm + args[i] # 튜플

    avg = sm / num_args
    print("%d 과목 평균: %.1f" % (num_args, avg))

일반적인 함수 정의에서는 매개변수의 개수가 고정!

하나의 함수에서 매개변수의 개수를 고정하지 않고 인수의 개수에 따라

매개변수를 가변적으로 사용하고 싶을 때 * 사용!

 

매개변수로 받은 *args는 average 함수에서 args로 사용

받은 args는 튜플 데이터형으로 쓰임!

 

 

 

 

 

 

 

 

매개변수에 리스트 전달하기

리스트, 튜플 등의 다른 데이터 형도 정의 함수의 매개 변수로 활용될 수 있음.

# 자료구조(리스트, 튜플, 딕셔너리) 형태로 매개변수를 사용
list1 = [80, 90, 50 , 30, 100]

def func(food):
    food.append("딸기")
    food.append("바나나")

fruits = []
print(fruits)

# 자료값 주소를 보내기 때문에 append를 하게 되면 fruits list에도 영향을 줌!
func(fruits)
print(fruits)

# 출력: []
#	['딸기', '바나나']

리스트 형태로 보낼 때

list에 있는 데이터만 보내는 것이 아닌 list 자체를 정의 함수로 전달!

 

정의 함수에서 list.append("요소")를 한다면 fruits 리스트에도 동일하게 append가 됨.

 

 

 


모듈이란?

- 하나의 파일을 여러개로 나누어 관리

- 프로그램에서 공통적으로 사용되는 함수들을 모아서 별도의 파일에 저장하는 기능을 제공.

- 필요한 모듈 파일을 불러와서 파일 내에 정의된 함수들을 쉽게 이용

 

math 모듈 함수

math 모듈의 모듈 함수

"""
math 모듈 사용 예제
"""

import math

# 제곱근 sqrt(x) x의 제곱근을 반환
print("sqrt(25): ", math.sqrt(25))
print("sqrt(2): ", math.sqrt(2))
print(math.pi)
print("sqrt(pi): ", math.sqrt(math.pi))

 

 

 

 

import 구문

import로 모듈을 가져올 수 있음.

# import
import math
math.sqrt(25)

# import as <- 별칭을 줌
import datetime as dt
datetime.date.today() # 너무 코드가 길어짐
dt.date.today() # <- 이렇게 사용 가능!

# from import <- 모듈의 함수명까지 바로 사용 가능!
from datetime import date, datetime
date.today()
datetime.now()

import를 여러 방법으로 불러올 수 있음.

 

  •  improt
  •  improt as ~
    • 별칭을 줄 수 있음.
  •  from import ~
    • 모듈의 함수명까지 바로 사용.

 

 

 

 

 

 

 

time 모듈 함수

time 모듈의 모듈 함수

import time

seconds = time.time()
print(seconds)
print(time.localtime())
tm = time.localtime()
print("년: ", tm.tm_year)
print("월: ", tm.tm_mon)
print("일: ", tm.tm_mday)
print("시: ", tm.tm_hour)
print("분: ", tm.tm_min)
print("초: ", tm.tm_sec)

 

 

 

 

 

 

+ strftime() 함수에서 쓰이는 포맷 기호

strftime() 함수에서 쓰이는 포맷 기호

import time

tm = time.localtime(time.time())
print(tm)

# 2023-3-17 12:30:44 PM 식으로 출력
strings = time.strftime("%Y-%m-%d %I:%M:%S %p", tm)
print(strings)
time.sleep(3)
print("3초 후 나타남!")

"""
출력
time.struct_time(tm_year=2023, tm_mon=3, tm_mday=17, tm_hour=12, 
tm_min=26, tm_sec=55, tm_wday=4, tm_yday=76, tm_isdst=0)
2023-03-17 12:26:55 PM
3초 후 나타남!
"""

# 프로그램 소요시간 측정 코드
start = time.time()
time.sleep(3)
end = time.time()
print("소요시간 : ", end-start)

 

 

 

 

 

 

 datetime 모듈 함수

datetime 모듈의 모듈 함수

import datetime
print(datetime.date.today())
print(datetime.datetime.now())

# 출력: 2023-03-17
#	2023-03-17 12:30:57.595576

 

 

 

 

 

 

random 모듈 함수

random 모듈의 모듈 함수

"""
random 모듈 예제
"""

import random

# 1) random() 0~1 사이의 임의의 실수 값을 반환 (0,1은 포함되지 않음)
print(random.random())

# 2) uniform(시작범위, 종료범위) 특정 구간의 임의의 실수 값을 반환
print(random.uniform(3, 7))

# 3) randit(시작범위, 종료범위) 특정구간의 임의의 정수 값을 반환 (범위값을 포함)
print(random.randit(1, 6))

# 4) choice(리스트) 리스트, 튜플, 문자열의 요소 중 임의의 요소를 반환
print(random.choice([1, 2, 3, 4, 5, 6]))
print(random.choice(["가위", "바위", "보"]))

# 5) shuffle(리스트) 리스트 요소의 순서를 임의로 섞음
list1 = ["가위", "바위", "보"]
print("원래의 리스트: ", list1)
random.shuffle(list1)
print("순서가 변경된 리스트", list1)

 

 


주사위 게임 프로그램

"""
주사위 게임 만들기
- 게임 시작 시간 표시 -> 주사위 던지기 -> 승부 판정하기 -> 계속 여부 확인
y -> 반복,  n -> 게임 종료
"""

import time
import random

# 게임 시작 시간 표시
start = time.localtime(time.time())
chk_start = time.time()
print("게임 시작 시간: ", time.strftime("%H:%M:%S %p", start))


# 게임 여부 확인 변수 초기화
again = "y"

while True:
    if again == "y":
        print("two dice are rolling...")

        # 프로그램 돌릴 시간 확보
        time.sleep(2)

        # 주사위 던지기
        me = random.randint(1, 6)
        computer = random.randint(1, 6)

        print("나 : ", me)
        print("컴퓨터: ", computer)

        # 승부 판정
        if me > computer:
            print("나의 승리!")
        elif me < computer:
            print("컴퓨터의 승리!")
        else:
            print("무승부")

        print("-" * 50)
    else:
        break

    again = input("계속하시겠습니까? (y: 예, n: 아니오)")

print("게임이 종료되었습니다.")
end = time.localtime(time.time())
chk_end = time.time()
print("게임 종료 시간: ", time.strftime("%H:%M:%S %p", end))
print("게임 사용 시간: ", chk_end-chk_start)

 


파일

텍스트 파일에 데이터 저장

"""
텍스트 파일에 데이터를 저장하기
"""

# 파일 객체 = open(파일명, 파일 모드, 인코딩)
f = open("new_file.txt", "w", encoding="utf-8")

names = ["홍지수", "안지영", "김연수", "김예린", "한정연"]

for name in names:
    f.write(name + "\n")

print("파일 쓰기 완료!")
f.close()

# 파일을 열면 파일 꼭 닫기!

# 추가모드로 사용자 2명 추가
f = open("new_file.txt", "a", encoding="utf-8")

names = ["손영민", "황현준"]

for name in names:
    f.write(name + "\n")

print("파일 쓰기 완료!")
f.close()


# 텍스트 파일 읽기
f = open("new_file.txt", "r", encoding="utf-8")
lines = f.readlines() # 리스트로 반환
print(lines)

"""
출력
파일 쓰기 완료!
파일 쓰기 완료!
['홍지수\n', '안지영\n', '김연수\n', '김예린\n', '한정연\n', '손영민\n', '황현준\n']
"""

파일 객체 = open(파일명, 파일 모드, 인코딩)

 

open() 으로 파일을 열면 close() 함수로 파일을 꼭 닫아야 함!

open 함수의 파일 모드

 

텍스트 파일을 읽을 때,


['홍지수\n', '안지영\n', '김연수\n', '김예린\n', '한정연\n', '손영민\n', '황현준\n'] 으로 출력됨.

 

데이터 안에 \n이 들어가기 때문에

완벽한 데이터를 뽑기 위해서는 \n을 지워야 함.

# 텍스트 파일 읽기 (\n을 지우는 코드)
f = open("new_file.txt", "r", encoding="utf-8")
lines = f.readlines() # 리스트로 반환
name_list = []
for line in lines:
    temp = line.replace("\n", "")
    name_list.append(temp)
    
print(name_list)

# 출력: ['홍지수', '안지영', '김연수', '김예린', '한정연', '손영민', '황현준']

 

 

 

 

 

 

CSV 파일 읽기

데이터가 (,) 형태로 읽을 수 있는 파일!

"""
csv 파일 읽기
"""

import csv
file_name = "weather.csv"
f = open(file_name, "r", encoding="utf-8")

lines = csv.reader(f)

# 헤더 담을 list
header = next(lines)

for line in lines :

    # 특정 데이터 추출 -> 12월 25일의 최저기온 찾기 -> weather.csv
    # 지점명[0], 일시[1], 평균기온[2], 최고기온[3]
    # 최저기온[4], 강수량[5], 습도[6]
    if line[1] == "12월 25일":
        day = line[1]
        min_temp = line[4]

        
print("%s 최저기온: %s도",(day, min_temp))


f.close()

예외처리

- 예외(Exception)은 작성한 프로그램을 실행했을 때 예기치 않게 발생되는 오류와 같은 상황을 의미

- 예외에 대처하고 처리하는 방법을 제공

 

try 블록: 오류가 발생하는지를 테스트하는 블록

except 블록: 오류를 처리하는 블록

finally 블록: try와 except 블록이랑 상관없이 무조건 실행되는 블록

 

 

 

try ~ except ~ 구문

 

"""
예외 처리
"""

try:
    print(x)

except NameError:
    print("변수가 정의되지 않아 오류가 발생했습니다.")


print("예외가 발생했어도.. 출력 되어야 함..")

# 출력: 변수가 정의되지 않아 오류가 발생했습니다.
#	예외가 발생했어도.. 출력 되어야 함..

x가 정의되지 않아 NameError로 프로그램에 에러가 발생되지만

except 구문으로 프로그램이 작동함.

 

 

 

 

try ~ except ~ finally

"""
예외 처리
"""

try:
    print(x)

except NameError:
    print("변수가 정의되지 않아 오류가 발생했습니다.")

finally:
    print("오류가 발생하건 안 하건 무조건 실행")
    
print("예외가 발생했어도.. 출력 되어야 함..")

"""
출력
변수가 정의되지 않아 오류가 발생했습니다.
오류가 발생하건 안 하건 무조건 실행
예외가 발생했어도.. 출력 되어야 함..
"""
def get_value(list1, n):

    try:
        result = list1[n]

    except:
        print("인덱스 범위를 벗어남")
        result = -1

    finally:
        return result

data = ["가위", "바위", "보"]
print(get_value(data, 2))
print(get_value(data, 3))

"""
출력
보
인덱스 범위를 벗어남
-1
"""