-
'''* 사용자 정의 모듈
- 하나의 모듈 파일에 너무 많은 코드가 들어있다면편집이 힘들어지고, 코드를 유지, 보수하는 데 어려움이 발생합니다.
- 관리 편의상 비슷한 기능들을 가진 코드를 여러 개의 모듈에나누어서 작성하는 것이 좋습니다.'''
import calculator as cal
print(f'1인치: {cal.inch}cm')print('1~10까지의 누적합: ', cal.calc_sum(10))
n1, n2 = map(int, input('정수 2개 입력: ').split())print(f'{n1} + {n2} = {cal.add(n1, n2)}')'''* 표준 모듈 time
- time모듈은 시간 관련 기능들을 제공합니다.
- 대표적인 함수는 time()인데, 이 함수는 현재 시간을1970년 1월 1일 자정을 기준으로 현재까지 경과한시간을 초단위로 표현한 유닉스 시간을 반환합니다.'''
import timeprint(time.time())
# time 함수를 이용한 프로그램 속도 측정 테스트start = time.time()
sum = 0for n in range(500000):sum += n
end = time.time()
print(f'프로젝트 실행 속도: {end - start:0.4f}초')
'''time 모듈의 sleep() 함수는 cpu를 지정한 시간만큼 잠재워아무것도 하지 않고 시간을 끌게 합니다.'''
print("재밌는 문제~!")time.sleep(3)print("뭘까요 ㅇㅅㅇ?")time.sleep(13)'''* 표준 모듈 random
- 프로그램이 무작위 동작을 하게 하려면 난수값(랜덤값)이 필요합니다.
- 랜덤값을 난수라고 부르며, 난수를 쉽게 발생시킬수 있는함수를 제공하는 모듈이 random 모듈입니다.
- random 모듈의 random() 함수는 0.0이상 1.0미만의실수 난수값을 발생시킵니다.'''import random as rrn = r.random()print('랜덤값', rn)
'''- 정수 난수는 randint() 함수를 사용합니다.- randint()는 인수로 시작 범위와 끝 범위를 지정하는데끝 범위도 난수값에 포함되는 특징이 있습니다. (미만이 아닙니다.)'''
pets = ['멍멍이', '야옹이', '짹짹이', '호랑이', '코끼리']idx = r.randint(0, 4)print('애완동물: ', pets[idx])
# choice() 함수는 리스트 내부의 임의의 요소를 랜덤으로 선택하여 리턴합니다.print('애완동물: ', r.choice(pets))
# shuffle() 함수는 리스트의 요소를 무작위로 섞습니다print(pets)r.shuffle(pets)print(pets)
# sample() 함수는 리스트의 항목 중 n개를 무작위로 추출하여 새로운 리스트로 만들어서 리턴합니다.# 중복값은 자동으로 배제시키며, 원본 리스트는 변하지 않습니다.print('-' * 30)s_list = r.sample(pets,2)print(s_list)print(pets)
# sample 함수를 활용한 로또번호 6개 뽑기 (중복 제거)lotto_nums = list(range(1, 46))lotto = r.sample(lotto_nums, 6)lotto.sort()print(lotto)
'''* 예외 처리
- 프로그램은 실행 중에 사용자와 끊임없는 상호 작용을 합니다.(입력 | 출력, 선언 | 호출, 요청 | 응답.....)
- 프로그램의 사용자는 예측 불가의 행동을 할 수도 있으며잘못된 사용으로 인해 에러를 유발할 수도 있습니다.
- 에러의 종류에는 심각한 에러(Serious Error)와덜 심각한 에러 (Mild Error)가 있습니다.
- 심각한 에러는 개발자가 해결할 수 없는 에러(천재지변, 시스템 상 문제)등을 말합니다.Mild Error는 문법 오류나 오타 등 해결이 가능한 에러들을 말하며이를 예외(Exception)라고 칭합니다.
- 아무리 프로그램을 정교하게 구성해도, 예외 발생 시 프로그램의비정상 종료를 막을 수가 없기 때문에 예외 처리 문법을 통해프로그램의 비정상 종료를 막아야 합니다.
- 예외처리 키워드는 try와 except를 사용합니다.
- try에는 예외 발생 가능성이 있는 코드를 작성합니다.except에는 try에서 예외가 발생했을 때 실행할 코드를 작성합니다.
- try 내부에서 예외가 발생했다면 즉시 try의 실행을 중지하고except의 코드가 실행되면서 프로그램의 비정상 종료를 방지합니다.'''
try:n1 = int(input('정수1: '))n2 = int(input('정수2: '))
print(f'입력한 정수: {n1}, {n2}')
result = n1 / n2print(f'{n1} / {n2} = {result}')
except:print('0을 입력하지 마세요!')
print('프로그램 정상 종료합니다.')
'''* 다중 예외 처리
- 하나의 try 블록에서 여러 상황의 예외를 예외별로 다르게처리하고 싶다면 다중 예외처리를 사용합니다.
- 다중 예외처리를 할 때는 except 뒤에 발생하는 예외의이름을 적어줍니다.
# 자주 발생하는 예외의 이름1. NameError: 정의되지 않은 변수나 함수, 클래스를사용할 때 발생합니다.
2. ValueError: 주로 형 변환시 발생하며, 내부 값의 형태가잘못되었을 때 발생합니다.
3. ZeroDivisionError: 숫자를 0으로 나누었을 때 발생합니다.
4. IndexError, KeyError: 존재하지 않는 인덱스나 키를 사용하여시퀀스, 딕셔너리를 조회했을 때 발생합니다.
5. TypeError: 연산 수행 시 피연산자의 데이터 타입이 올바르지않을 경우 발생합니다.'''# NameError# print(apple)# insert(10)
# ValueError# int('3.14')
# Index, KeyErrors = 'hello'# print(s[6])d = {}# print(d['멍멍이']) (x)
# TypeError# print(10 ** '메롱')
s = input('정수')
try:point = int(s) #ValueError 가능성print(150 / point) #ZeroDivisionError 가능성print(s[point]) # indexError 가능성
except ValueError:print('정수로만 입력하세요.')except ZeroDivisionError:print('0으로 나눌 수 없습니다.')except IndexError:print('인덱스 범위를 벗어났어요')
'''finally 키워드는 예외 발생 여부와 상관없이항상 실행해야 하는 코드가 있을 경우 사용하는 예외 처리 방식입니다.'''pets = ['거북이', '강아지', '고양이']
for n in range(4):try:print(pets[n], '키우고 싶다~')except:print('애완동물의 정보가 없습니다.')finally:print('아무튼 출력되는 문장입니다.')print('-' * 30)
'''* 예외 일부러 발생시키기
- 프로그래밍을 진행하다 보면 일부러 예외를 발생시켜서코드의 흐름을 전환해야 하는 경우가 발생합니다.
- 파이썬은 raise라는 명령을 사용해서 오류를 강제로 발생시킬수 있습니다.'''def calc_sum(end):if end <= 0:raise ValueError
total = 0for n in range(end + 1):total += nreturn total
try:result = calc_sum(100)print(result)
result2 = calc_sum(-120)print(result2)except:print('매개값은 양수로 주세요!')
'''* 파일 입/출력
- 프로그램이 생성한 정보를 좀 더 오래 저장할 때는파일에 기억해야 합니다.
- 메모리는 속도는 빠르지만 전원이 끊어지면 정보를 잃어버릴 수있기 때문에, 하드디스크에 저장해야 데이터를 오래 보관할 수있습니다.
- 파일은 정보를 저장하는 기본 단위이며문서, 이미지, 멀티미디어 자료도 모두 파일 형태로 보관할 수있습니다.
- 파이썬에서는 파일 입/출력을 할 때open()이라는 함수를 사용합니다.ex) open('파일 경로', 모드)
- 파일 경로는 입/출력 대상의 파일 경로입니다.디렉터리 경로를 포함시킵니다.
- 모드는 읽기, 쓰기, 추가 등 무엇을 할 지결정하는 인수입니다.
- 모드의 종류1. r: 파일을 읽어들입니다. 읽어들일 파일이 없으면예외가 발생합니다.
2. w: 파일에 데이터를 저장합니다.파일이 이미 존재한다면 덮어씁니다.
3. a: 파일에 데이터를 추가합니다. (이미 존재하는 파일에)파일이 존재하지 않는다면 새롭게 생성도 해 줍니다.'''
try:# 파일 저장 기능 (write, append)file_path = 'C:/test/test.txt'
# 파일 입출력을 실행하는 내장 함수 open()# 반환값으로 파일 입출력을 담당하는 객체를 리턴합니다.# 첫번째 인수로 파일 경로를, 두번째 인수로는 모드를 설정합니다.
f = open(file_path, 'a')text = '\n n 모드는 새 파일을 생성하여 원하는 텍스트 문서를 작성할 때 사용합니다. 덮어씁니다.. a 모드는 이어서 작성..'
# 파일을 저장할 때는 f.write() 메서드를 사용합니다.# 저장할 데이터를 인수로 전달합니다.
f.write(text)print('파일 저장 완료합니다.')
except:print('파일 저장에 실패했습니다.')
finally:# 파일 입출력은 하드디스크 자원을 사용하는 코드이므로# 반드시 사용 후 그 자원을 해체하여 메모리 누수를 방지합니다.f.close()
'''* 사용자의 입력을 파일(xxx.txt)에 저장하는 프로그램을 작성하세요.(단, 프로그램을 다시 실행하더라도 파일명이 동일하다면기존 작성한 내용을 그대로 유지하고새로 입력된 내용이 추가되어야 합니다.파일명도 마지막에 입력받아서 생성하세요.)'''print('저장할 내용을 입력(\'그만\'이라고 입력 시 종료됩니다.)')user_input = ''while True:temp = input('> ')if temp == '그만':breakuser_input += temp + '\n'
f_name = input('파일명을 입력: ')f_path = f'C:/test/{f_name}.txt'
try:f = open(f_path, 'a')f.write(user_input)print('파일 저장에 성공했습니다.')
except:print('파일 저장에 실패하였습니다.')
finally:f.close()
'''* 파일 읽기 기능 (read)
- 파일로부터 데이터를 읽어들일 때는 분량에 따라적당한 메서드를 선택해서 사용합니다.
1. read(): 파일 전체를 통째로 읽어서 리턴2. readline(): 파일 데이터를 한 줄씩 읽어서 리턴3. readlines(): 파일 전체를 읽어서 한 줄씩 분리한 후에리스트에 담아서 리턴.'''file_path = 'C:/test/hint.txt'
'''try:f = open(file_path, 'r')text = f.read()print(text)except:print('파일 로드 실패!')finally:f.close()'''
# readline() 메서드는 자동으로 \n을 기준으로 하여# 데이터를 줄 단위로 읽어들이기 때문에 메모리 부담을 좀 더# 줄일 수 있습니다.
'''try:f = open(file_path, 'r')while True:text = f.readline()if '파일' in text:print(text)if len(text) == 0:break
except:print('파일 로드 실패!')finally:f.close()'''
# readlines()는 파일 데이터를 한 줄씩 읽어서# 리스트에 담아서 리턴하기 때문에 읽은 데이터를# 리스트 문법을 사용해서 처리할 수 있습니다.try:f = open(file_path, 'r')
text = f.readlines()# print(text)text.reverse()for t in text:print(t)
except:print('파일 로드 실패!')finally:f.close()
'''* points.txt 파일의 숫자값을 모두 읽어서총합과 평균을 구한 뒤총점, 평균값을 result.txt라는 파일에쓰는 프로그램을 작성해 보세요.'''import traceback as trace
try:f = open('C:/test/points/txt', 'r')numlist = f.read().split()except:print('파일 로드에 실패했습니다.')print(trace.format_exc()) # java의 e.printStackTrace()finally:f.close()sum = 0for num in numlist:score = int(num)sum += score
avg = sum / len(numlist)
try:f = open('C:/test/result.txt', 'w')data = f'총점: {sum}점, 평균: {avg:0.2f}점'f.write(data)print('파일 저장이 완료되었습니다.')except:print('파일 저장에 실패했습니다.')print(trace.format_exc())finally:f.close()
def add (n1, n2):return n1 + n2
def sub (n1, n2):return n1 - n2
def calc_sum(end):sum = 0for n in range(end + 1):sum += nreturn sum
def info():print('모듈 임포트 연습합니다.')
inch = 2.54yard = 0.91lb = 0.45
'''- 배포의 목적으로 만든 모듈이라면테스트 코드를 작성해서 다른 사용자들에게모듈 사용법을 간단히 공개해 주면 좋겠죠?
처음부터 import를 목적으로 설계된 모듈의 테스트 코드 작성 시에는다음과 같은 문법 하에서 테스트를 실행합니다.
ex) if __name__ == '__main__':test code...
- __name__ 이라는 숨겨진 변수 (내장 변수)에는현재 실행중인 모듈의 이름이 저장되게 되는데,현재 모듈에서 실행할 때는 이름이 main으로 저장됩니다.다른 모듈에서 실행할 때는 이름이 모듈 이름으로 저장됩니다.'''if __name__ == '__main__':print('__name__의 값:', __name__)
#test codeprint('1~100까지의 누적합: ', calc_sum(100))info()print(sub(100, 15))print('테스트 코드입니다.')
'''* 예외 일부러 발생시키기
- 프로그래밍을 진행하다 보면 일부러 예외를 발생시켜서코드의 흐름을 전환해야 하는 경우가 발생합니다.
- 파이썬은 raise라는 명령을 사용해서 오류를 강제로 발생시킬수 있습니다.'''def calc_sum(end):if end <= 0:raise ValueError
total = 0for n in range(end + 1):total += nreturn total
try:result = calc_sum(100)print(result)
result2 = calc_sum(-120)print(result2)except:print('매개값은 양수로 주세요!')