본문 바로가기

1. Python

3/13(월) IT K-DT (8일차) / 20.예외처리~23.변수타입어노테이션

 

 

20. 예외처리

 

20-1. 예외처리

오류가 발생했을 때 별도의 처리를 하거나, 무시하고 프로그램을 실행하는 것.
오류가 발생될 것으로 예상되는 문장을 try 블록에 코딩하고, 오류가 발생하면 try 블록의 내용을 실행하지 않고 except 블록에 코딩된 내용을 실행.
python은 발생할 수 있는 모든 문제를 예외 class로 만들어 놓음.
  예) DDos 문제로 오류가 발생할 때 예외처리 방법을 이용할 수 있음.

 

20-1-1. try except 사용하기

 


try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except:
  오류가 발생했을 경우 실행할 문장



print(10 / 3)
print(5 / 0) 

print(4 / 2)

 

두번째 식의 경우, 숫자는 0으로 나누지 못해 에러가 발생함.(ZeroDivisionError: division by zero)

이 에러의 발생으로 다음 줄인 print(4/2)가 출력이 되지 않음.
이런 경우 예외처리가 필요함.

try:
  print(10 / 3)
  print(5 / 0)
  print(4 / 2)
except: # 모든 에러에 대한 처리가능.
  print('0으로 나눌 수 없습니다.')
print('프로그램을 종료합니다.')


3.3333333333333335
0으로 나눌 수 없습니다.
프로그램을 종료합니다.

data = [10, 20, 30, 40, 50]
print(data[5])

data의 index 번호는 0번부터 4번까지 있어 5번을 출력할 수 없음.

(IndexError: list index out of range)

 

 

try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(data[1])
  print(data[5])
  print(data[3])
except:
  print('인덱스 지정이 올바르지 않습니다.')
print('이 프로그램을 종료합니다.')


10
20
인덱스 지정이 올바르지 않습니다.
이 프로그램을 종료합니다.

 


20-1-2. 특정 예외만 처리하기

 


try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외이름:
  오류가 발생했을 경우 실행할 문장

 

try:
  print(10 / 3)
  print(5 / 0)
  print(4 / 2)
except ZeroDivisionError: 
# ZeroDivisionError에 대한 exception. 만약 IndexError: 와 같은 다른 종류의 에러내용이 들어간다면 오류가 발생함.
  print('0으로 나눌 수 없습니다.')
print('프로그램을 종료합니다.')



3.3333333333333335
0으로 나눌 수 없습니다.
프로그램을 종료합니다.

try:
  data = [10, 20, 30, 40, 50]  
  print(10 / 3)
  print(4 / 2)
  print(data[5])
except ZeroDivisionError:
  print('0으로 나눌 수 없습니다.')
except IndexError:
  print('인덱스 지정이 올바르지 않습니다.') # print(data[5]) 에서 오류가 발생하여 해당 내용이 출력이 됨.
print('프로그램을 종료합니다.')
3.3333333333333335
2.0
인덱스 지정이 올바르지 않습니다.
프로그램을 종료합니다.

 


20-1-3. 예외 에러 메세지 받기
try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외이름 as 변수:
  오류가 발생했을 경우 실행할 문장

try:
  data = [10, 20, 30, 40, 50]  
  print(10 / 3)
  print(4 / 2)
  print(data[5])
except ZeroDivisionError as e: # 변수 e를 설정. 에러메시지도 같이 출력이 되게 함.
  print('0으로 나눌 수 없습니다.', e)
except IndexError as e:
  print('인덱스 지정이 올바르지 않습니다.', e) 
print('프로그램을 종료합니다.')
3.3333333333333335
2.0
인덱스 지정이 올바르지 않습니다. list index out of range
프로그램을 종료합니다.

 


20-1-4. 예외가 발생하지 않았을 경우 처리하기
try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외이름 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
else:
  오류가 발생하지 않았을 경우 실행할 문장

try:
  data = [10, 20, 30, 40, 50]  
  string = '오늘은 즐거운 예외처리 시간'
  print(10 / 3)
  print(4 / 2)
  print ('%d' % string) 

# %d는 정수 포맷이고, string은 문자열이라 출력 시 오류가 발생함. 

TypeError: %d format: a number is required, not str
except ZeroDivisionError as e:
  print('0으로 나눌 수 없습니다.', e)
except IndexError as e:
  print('인덱스 지정이 올바르지 않습니다.', e) 
except TypeError as e:
  print('데이터 타입이 올바르지 않습니다.', e) 
else:
  print('정상적인 프로그램 진행') # 위의 except에 걸리는 오류가 하나도 없는 경우, 해당 내용이 출력됨.
print('프로그램을 종료합니다.')
3.3333333333333335
2.0
정상적인 프로그램 진행
프로그램을 종료합니다.

 


20-1-5. 예외와 관계없이 코드 실행하기
try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외이름 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
else:
  오류가 발생하지 않았을 경우 실행할 문장
finally:
  예외 발생 여부와 관계없이 항상 실행할 코드

* else와 finally는 사용하지 않아도 무방. option개념.

try:
  data = [10, 20, 30, 40, 50]  
  string = '오늘은 즐거운 예외처리 시간'
  print(10 / 3)
  print(4 / 2)
  print ('%d' % string) 
except ZeroDivisionError as e:
  print('0으로 나눌 수 없습니다.', e)
except IndexError as e:
  print('인덱스 지정이 올바르지 않습니다.', e) 
except TypeError as e:
  print('데이터 타입이 올바르지 않습니다.', e) 
else:
  print('정상적인 프로그램 진행') 
finally:
  print('오류에 관계없이 무조건 실행되는 문장')
print('프로그램을 종료합니다.') 
# finally는 굳이 사용할 필요 없이 맨 아랫줄에 넣어도 되지만,

코드를 보았을 때 미관상 깔끔함을 목적으로 finally를 만들어 사용해 주는 것을 추천.
3.3333333333333335
2.0
데이터 타입이 올바르지 않습니다. %d format: a number is required, not str
오류에 관계없이 무조건 실행되는 문장
프로그램을 종료합니다.

 


<예제1>
데이터를 입력하면 오름차순 정렬하여 출력하는 프로그램을 '예외처리'를  이용하여 작성해보자.

(단, 숫자와 문자를 섞어 입력하면 숫자+문자 형식으로 정렬/숫자를 먼저 정렬, 000을 입력하면 정렬을 시작함.) 
데이터를 입력하세요:abc
데이터를 입력하세요:123
데이터를 입력하세요:1
데이터를 입력하세요:bbb
데이터를 입력하세요:000 결과 [1, 123, 'abc', 'bbb']
# 숫자가 담기는 리스트와 문자가 담기는 리스트를 따로 저장하는 것을 염두에 두고 코드를 작성


num = []
string = []

while True:
  data = input('데이터를 입력하세요:')
  if data == '000':
    break
  try:
    num.append(int(data)) 

# int를 num[]에 추가하겠음. 이렇게 작성 시 문자열에 대해서는 오류가 발생하게 됨.
  except:
    string.append(data) 

# 오류에 대한 예외로 data에 대한 데이터들을 string[]에 추가하겠음.

num.sort()
string.sort()

print(num + string)


데이터를 입력하세요:abc
데이터를 입력하세요:123
데이터를 입력하세요:1
데이터를 입력하세요:b
데이터를 입력하세요:bbb
데이터를 입력하세요:000
[1, 123, 'abc', 'b', 'bbb']

 

 


20-2. 예외 발생 시키기
raise : 예외를 발생시킴

try:
  n = int(input('짝수를 입력하세요: '))
  if n%2 != 0 : #만약 n이 홀수인 경우.
    raise Exception ('짝수가 아닙니다.') # 예외를 발생시킴. 만약 input() 창에 홀수를 넣는 경우, 해당 내용이 출력됨.
  print(n)
except Exception as e:
  print('예외가 발생했습니다' ,e)
짝수를 입력하세요: 2
2
def func1():
  n = int(input('짝수를 입력하세요:'))
  if n%2 != 0 : 
    raise Exception ('짝수가 아닙니다.')
  print(n)

try:
  func1()
except Exception as e:
  print('예외가 발생했습니다.', e) # Exception에 대한 메세지가 출력됨. Error가 발생한 상황.
짝수를 입력하세요:3
예외가 발생했습니다. 짝수가 아닙니다.

def func1():
  func2()
def func2():
  func3()
def func3():
  print('%d' % '문자열 출력')

func1() # func1 실행 시 func2, func3로 가쳐 오류 발생. TypeError: %d format: a number is required, not str

 

def func3():
  try :
    print('%d' % '문자열 출력')
  except TypeError:
    print('타입이 올바르지 않습니다.')
func1()
타입이 올바르지 않습니다.
def func1():
  try :
    func2()
  except TypeError:
    print('타입이 올바르지 않습니다.') 

# 위의 식과 다르게 func1()을 정의하는 단계에서부터 예외처리해도 문제없이 출력이 가능하다.
def func2():
  func3()
def func3():
타입이 올바르지 않습니다.

 

 


 

21. 파일 입출력 

 

 

21-1. 파일 열기


파일 입출력이란, 컴퓨터에서 파일을 읽어들이거나, 파일에 쓰거나, 파일을 수정하는 것을 의미함.
파일변수 = open('파일이름', '파일 열기 모드 or 종류 모드')
파일 열기 모드 : w(출력), r(입력), a(추가출력)
w : 지정된 경로에 파일이 없으면 파일을 만든 후 저장하고, 파일이 있으면 기존의 모든 데이터를 지우고 다시 저장.
r : 지정된 경로에 파일이 없으면 에러 발생, 있으면 해당 파일의 데이터를 읽어옴.
a : 지정된 경로에 파일이 없으면 파일을 만든 후 저장하고, 파일이 있으면 기존의 데이터 뒤에 이어서 저장.
파일 종류 모드 : t(텍스트파일, 생략가능), b(바이너리파일(텍스트파일 외의 파일로, 이미지, 오디오, 동영상파일))
input = open('text.txt', 'r') # 텍스트파일 열기 모드로 열라는 의미. 'r'은 원래 'rt'에서 t가 생략된 것.
input = open('apple.jpg', 'rb') # 바이너리파일 열기 모드로 열라는 의미.
만약 파일이 있는 폴더가 다르다면, 파일이름 앞에 경로도 추가해야 함.
파일을 출력할 때 작업이 모두 완료되면 반드시 close() 메소드를 사용해서 파일을 닫아야 정상적으로 데이터가 저장됨.

 


21-1-1. 파일 저장하기

file = open('data.txt', 'wt') # wt에서 t는 생략이 가능함.
for i in range(10):
  file.write('파일 열기 테스트 : ' + str(i) + '\n')  

# write() : file에 내용을 작성하겠다는 의미의 메소드. '\' : 파일 내에서 개행(enter키)을 진행해주는 역할.
file.close()

print('data.txt 파일에 쓰기 완료')
# 왼쪽의 파일 탭을 열어보면, data.txt가 정상적으로 생성이 된 것을 확인할 수 있음.
data.txt 파일에 쓰기 완료

 


21-1-2. 파일 경로


절대 경로 : 디스크 드라이브의 최상위(root) 디렉토리부터 파일이 저장되거나 읽어올 디렉터리까지의 경로. 

  (=full경로) 예) C:/yjcho/python/day2/data.txt
상대 경로 : 현재 화면에 표시되는 소스파일이 위치한 디렉토리부터 파일이 저장되거나 읽어올 디렉토리까지의 경로.
같은 디렉토리에 저장하는 경우 : 파일명 or ./파일명
상위 디렉토리에 저장하는 경우 : ../파일명 or ./../파일명
하위 디렉토리에 저장하는 경우 : 디렉토리명/파일명 or ./디렉토리명/파일명
file = open('data/data.txt', 'wt') 
for i in range(10):
  file.write('파일 열기 테스트 : ' + str(i) + '\n')
file.close()
print('data.txt 파일에 쓰기 완료')
data.txt 파일에 쓰기 완료

 


21-1-3. 파일 읽어오기


read() : 파일로부터 전체 데이터를 읽어오는 메서드.
read(size) : 파일로부터 size만큼의 데이터를 읽어옴.

file = open('./data/data.txt', 'rt')
data = file.read() # 전체 데이터를 읽어옴.
print('data.txt 파일 전체 데이터 읽기 완료')
print(data)
file.close()
data.txt 파일 전체 데이터 읽기 완료
파일 열기 테스트 : 0
파일 열기 테스트 : 1
파일 열기 테스트 : 2
파일 열기 테스트 : 3
파일 열기 테스트 : 4
파일 열기 테스트 : 5
파일 열기 테스트 : 6
파일 열기 테스트 : 7
파일 열기 테스트 : 8
파일 열기 테스트 : 9

file = open('./data/data.txt', 'rt')
data = file.read(10) # 10글자를 읽어옴. (유니코드 10글자)
print('data.txt 파일 일부 데이터 읽기 완료')
print(data)
file.close()
data.txt 파일 일부 데이터 읽기 완료
파일 열기 테스트 

# read(10)을 이용하여 data.txt에 있는 모든 데이터를 출력하기.
file = open('./data/data.txt', 'rt')
while True:
  data = file.read(10)
  if not data:
    break
  print (data, end='')
file.close
파일 열기 테스트 : 0
파일 열기 테스트 : 1
파일 열기 테스트 : 2
파일 열기 테스트 : 3
파일 열기 테스트 : 4
파일 열기 테스트 : 5
파일 열기 테스트 : 6
파일 열기 테스트 : 7
파일 열기 테스트 : 8
파일 열기 테스트 : 9

 



<예제2>
키보드로 데이터를 입력하고 txt파일에 저장하는 프로그램을 작성해보자. 

(단, quit이 입력이 되면 저장을 끝내고 프로그램을 종료)


단어를 입력하세요 : banana
단어를 입력하세요 : apple
단어를 입력하세요 : orange ...
단어를 입력하세요 : quit
저장되었습니다.

file = open('/content/data/data.txt', 'w')

while True:
  data = input('단어를 입력하세요:')
  if data.lower() == 'quit': # 대소문자 혼합 입력 방지 목적으로 lower()을 사용.
    break
  file.write(data + '\n')
print('저장되었습니다.')
file.close()
단어를 입력하세요:asfd
단어를 입력하세요:quit
저장되었습니다.



21-1-4. with 문


자원을 획득 및 사용 후 반납해야 하는 경우 블록으로 사용하는 문장.

with open('/content/data/word.txt', 'w') as f:
  while True:
    data = input('단어를 입력하세요:')
    if data.lower() == 'quit':
      break
    f.write(data + '\n')
  print('저장되었습니다.')
  file.close()
단어를 입력하세요:adsf
단어를 입력하세요:quit
저장되었습니다.

 

 

21-1-5. readline()


텍스트파일을 한 줄씩 읽어서 처리
파일이 종료되어 더이상 읽을 수 없으면 빈 문자열 ''을 읽어옴.

# 1-4의 with문에서 획득한 자원들을 읽어서 출력하는 경우
with open('/content/data/word.txt', 'r') as f:
  lines = []
  while True:
    line  = f.readline()
    if not line:
      break
    if len(line.strip()) != 0: # 공백을 모두 제거한 값이 0이 아닌 경우 = 자원이 존재하는 경우.
      print(line, end='')
      lines.append(line.strip())
  print(lines)
adsf
['adsf']

 


21-1-6. readlines()


전체 라인을 모두 읽어서 각 라인단위로 리스트에 raw string으로 저장.
with open('/content/data/word.txt', 'r') as f:
  lines = f.readlines()
  print(lines) 
['adsf\n']
for i in lines:
  print(i, end='')
adsf

 

 

21-2. 인코딩과 디코딩

 

데이터의 '전송'과 관련하여 안정성과 호환성 목적으로 사용.
(bytes로 전송하면 안정적이고 호환성이 높기 때문)

 


21-2-1. 인코딩(Incoding)


컴퓨터에서 사랑이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정.
'코드화', '암호화', '부호화'로 부름.
예) 아스키코드 인코딩, URL 인코딩, Base64 인코딩, 유니코드 인코딩 등.

(유니코드 공식 사이트 : https://home.unicode.org/)

 

Home

 

home.unicode.org

txt1 = 'Hello Python'
type(txt1)
str
# 유니코드 인코딩을 실행하는 경우 (영어)
txt2 = txt1.encode('utf-8') # utf-8 = 유니코드의 코드 중 하나
type(txt2)
# bytes인 컴퓨터가 인지할 수 있는 타입으로 바뀜.
print(txt2)
b'Hello Python'
# 유니코드 인코딩을 실행하는 경우 (한글)

txt3 = '안녕하세요. 파이썬'
print(txt3.encode('utf-8'))
b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94. \xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac'

 


21-2-2. 디코딩(Decoding)


사람이 인지할 수 있는 형태의 언어로 되돌리는 과정.
'역코드화', '복호화'로 부름.

(인코딩, 디코딩 참고 사이트 : https://checkserp.com/encode/unicode/)

 

Unicode Converter, Unicode Encoding and Decoder

Online Unicode converter, easy to use unicode encoding and decoder tool. Convert plain text to unicode codes and vice versa.

checkserp.com

txt3 = '안녕하세요. 파이썬'
txt4 = txt3.encode('utf-8')
print(txt4)
b'\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94. \xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac'
print(txt4.decode('utf-8')) # 유니코드로 디코딩하는 경우.
안녕하세요. 파이썬
print(txt4.decode('ascii')) # 아스키코드로 디코딩하는 경우, 코덱이 없어서 오류가 발생함. UnicodeDecodeError:

 

 


 

22. 클로저와 데코레이터

 

 

22-1. 클로저(Closure)


함수 안의 함수를 결과로 반환할 때, 그 내부 함수를 일컫는 용어.
콜백함수, 함수의 순차적 실행, 데코레이터 함수에 사용됨.
def mul2(n): # n을 넣었을 때 2를 곱해주는 함수를 생성.
  return n*2
mul2(10)
20
def mul5(n): # n을 넣었을 때 5를 곱해주는 함수를 생성.
  return n*5
mul5(10)
50
# mul1, mul2, mul3, mul4 ...mul100까지 만들어야 하는 번거로움이 있어 아래와 같이 개선.
class Mul:
  def __init__(self, m):
    self.m = m
  def mul(self, n):
    return self.m * n
mul2 = Mul(2)
print(mul2.mul(10))
print(mul2.mul(5))
20
10
# class의 코드를 special method로 바꾸는 방법.
class Mul:
  def __init__(self, m): # 객체를 생성할 때 자동으로 호출.
    print('생성자 호출')
    self.m = m
  def __call__(self, n): # 객체를 실행할 때 자동으로 호출.
    print('call 호출')
    return self.m * n # ★ call 호출은 머신러닝, 딥러닝에서 많이 사용되는 special method이므로 잘 알아두는 것을 추천.

특수 메소드 (special method)
이중 언더스코어 (__)로 둘러싸인 method를 의미.
python에서 내부적으로 사용되며, class에서 사용자 정의 연산을 정의.
예를 들어, add 특수 메소드는 덧셈 연산자 (+)를 오버로딩하여, 클래스에서 정의한 연산 방식을 사용할 수 있도록 함.
특수 메소드는 클래스의 다양한 기능을 지원하며, 파이썬에서 객체 지향 프로그래밍을 할 때 매우 중요한 역할을 함.

mul2 = Mul(2) # 객체를 생성함.
mul2(10)
생성자 호출
call 호출
20
# 클로저 사용하기
def mul(m): # 외부 함수
  def wrapper(n): # 내부 함수 (클로저)
    return m*n
  return wrapper
mul2 = mul(2) # m=2인 wrapper함수가 mul2에 저장됨. 객체를 만들음.
print(mul2(10)) # m=2, n=10인 wrapper함수가 실행. 객체를 실행함.
mul5 = mul(5)
print(mul5(10))
20
50

 


22-2. 데코레이터(Decorator)


함수를 꾸며주는 함수.
함수를 인수로 받는 클로저.
@(어노테이션)을 이용.
반복되는 작업을 여러 함수에 적용하거나, 기존 함수를 수정하지 않고 추가 기능을 구현하고 싶은 경우 사용됨.

 

import time
def func1(a,b):
  start = time.time()
  print('함수가 시작되었습니다.')
  result = a+b
  end = time.time()
  print(f'함수 수행시간: {end-start}')
  return result
  result = func1(10,3)
  print(result)
  print(format(6.389617919921875e-05, 'f'))
함수가 시작되었습니다.
함수 수행시간: 5.650520324707031e-05
13
0.000064


import time
def func2(a,b):
  start = time.time()
  print('함수가 시작되었습니다.')
  result = a*b
  end = time.time()
  print(f'함수 수행시간: {end-start}')
  return result
  result = func1(10,3)
  print(result)
print(format(6.008148193359375e-05, 'f'))
함수가 시작되었습니다.
함수 수행시간: 8.296966552734375e-05
13
0.000060

# 데코레이터 만들기
def func1(a,b):
  result = a+b
  return result
def func2(a,b):
  result = a*b
  return result

def elapsed(func): # 위에서 func1, func2를 받아서 elapsed() 함수를 실행
  def wrapper(a,b):
    start = time.time()
    print('함수가 시작되었습니다.')
    result = func(a,b) # a,b의 연산을 하고 result로 출력
    end = time.time()
    print(f'함수 수행시간: {end-start}')
    return result
  return wrapper
deco1 = elapsed(func1)
result = deco1(10,3)
print(result)
함수가 시작되었습니다.
함수 수행시간: 0.0007336139678955078
13


deco2 = elapsed(func2)
result = deco2(10,3)
print(result)
함수가 시작되었습니다.
함수 수행시간: 0.000759124755859375
30


@elapsed
def func1(a,b):
  result = a+b
  return result
@elapsed
def func2(a,b):
  result = a*b
  return result
result = func1(10,3)
print(result)
함수가 시작되었습니다.
함수 수행시간: 7.128715515136719e-05
13


result = func2(10,3)
print(result)
함수가 시작되었습니다.
함수 수행시간: 5.269050598144531e-05
30

 


 

23. 변수 타입 어노테이션

 

 

23-1. 변수 타입 어노테이션

 


23-1-1. 타입 어노테이션(Type Annotation)


변수나 상수를 선언할 때 타입을 명시적으로 선언해줌으로써 어떤 타입의 값이 저장될 것인지를 직접 알려주는 방법.
프로그램은 수많은 함수, 클래스 등으로 복잡하게 얽혀있는 경우가 많은데 변수 타입이 맞지 않으면 

에러나 버그의 발생가능성이 매우 높아짐.
타입 어노테이션을 사용하면 코드 가독성과 협업 효율성이 매우 높아짐.
파이썬 3.5부터 기능이 지원되어 많은 라이브러리, 프로젝트에서 사용이 확산되는 추세.
Java, C, C++ 등은 컴파일 시 변수 타입이 결정되는 정적 프로그래밍 언어이며 파이썬은 프로그램 실행 도중에 

변수 타입을 동적으로 결정하는 동적 프로그래밍 언어이다.

 


23-1-2. 동적 프로그래밍 언어의 장단점


장점
  * 타입이 자유로워 유연한 코딩이 가능하므로 쉽고 빠르게 프로그램을 만들 수 있음.
  * 타입 체크를 위한 코드가 없으므로 깔끔한 소스 코드를 작성할 수 있음.
단점
  * 프로젝트의 규모가 커질수록 잘못된 타입 사용으로 버그가 생길 확률이 높아짐.
  * 정적 프로그래밍 언어의 특징상 타입 버그 발생 시 원인을 찾기가 어려움.
  * 실행 속도가 느림.
Java
  int a = 10;
  a = "십"; // 에러
python
  a = 10
  type(a) # int
  a = "십"
  type(a) # str
a: int=10
print(a)
print(type(a))
10
<class 'int'>
def add(a:int, b:int) -> int: #a는 int, b는 int, 결과는 int 자료형으로 처리.
  return a+b
# 타입 어노테이션을 확인하는 방법
add.__annotations__
{'a': int, 'b': int, 'return': int}
add(10,3)
13
add('10','3') # 오류가 발생하지는 않음.

103


 

과제

* 작성 후 파일로 저장해서 DM에 첨부


영어 단어장 프로그램을 만들어보자.


아래 번호를 선택하세요
단어 입력 (단어, 뜻, 레벨)
단어 출력
단어 저장 (word.txt에 저장)
프로그램 종료
아래 번호를 선택하세요. 1
단어를 입력하세요 apple, 사과, 1
입력되었습니다.
아래 번호를 선택하세요 1
단어를 입력하세요 banana, 바나나, 1
입력되었습니다.
아래 번호를 선택하세요 2
apple(사과, level1) banana(바나나, level1)
아래 번호를 선택하세요 3
저장되었습니다.
아래 번호를 선택하세요 4
프로그램을 종료합니다.
단, 저장된 파일이 있는 경우 프로그램 재실행시 데이터를 읽어 메모리에 저장