5. 파이썬 기초 문법[클래스 ~ 라이브러리]
5-1. 클래스
- 클래스 : 반복되는 변수&메소드(함수)를 미리 정해놓은 틀(설계도 같은 개념)
단, C언어에는 클래스가 없음.
- 클래스를 사용하지 않고 계산기 만들기
>>> result = 0
>>> def add(num):
>>> global result
>>> result += num # '+=' 왼쪽 변수에 오른쪽 값을 더하고 그 결과를 왼쪽 변수에 할당
>>> return result
>>> print(add(3))
>>> print(add(4))
# 따로따로 계산하고 싶다면?
>>> result1 = 0
>>> result2 = 0
>>> def add1(num):
>>> global result1
>>> result1 += num
>>> return result1
>>> def add2(num):
>>> global result2
>>> result2 += num
>>> return result2
>>> print(add1(3))
>>> print(add1(4))
>>> print(add2(3))
>>> print(add2(7))
3
7
3
10
- 클래스를 사용하여 더하기 빼기가 가능한 계산기 만들기
>>> class Calculator:
>>> def __init__(self):
>>> self.result = 0
>>> def add(self, num):
>>> self.result += num
>>> return self.result
>>> cal1 = Calculator()
>>> cal2 = Calculator()
>>> print(cal1.add(3))
>>> print(cal1.add(4))
>>> print(cal2.add(3))
>>> print(cal2.add(7))
3
7
3
10
# 중복된 부분을 클래스로 만들어서 효율적으로 구현. 추가할 때도 클래스(설계도)를 추가하면 됨
- 클래스와 객체 : 붕어빵을 만든다고 가정했을 때, 붕어빵 틀이 클래스 / 틀로 찍어서 나온 붕어빵이 객체
# 클래스의 간단한 예제
>>> class Cookie: # 클래스를 사용할 때 이름 앞글자는 항상 대문자로
>>> pass
>>> 초코쿠키 = Cookie()
>>> 아몬드쿠키 = Cookie()
* 클래스에서 나온 객체를 인스턴스라고 하기도 함.
- 클래스를 어떻게 만들지 구상하기
1. 어떤 클래스를 만들 것인지 : 계산기를 만들어야겠다
2. 어떤 기능을 가지고 있어야하는지 :
1) 사칙연산을 위해 두개의 숫자를 입력 받아야겠네(setdata 메소드)
2) 더하기 기능을 넣어야지(add 메소드)
3) 그 외 빼기, 곱하기, 나누기를 넣어야겠다(sub, mul, div 메소드)
# 클래스 없이 계산기 만들기
>>> a = FourCal()
>>> a.setdata(4, 2)
>>> a.add()
>>> a.sub()
>>> a.mul()
>>> a.div()
6
2
8
2
# 클래스 구조 만들기
>>> class FourCal:
>>> pass
>>> a = FourCal()
>>> print(type(a))
<class '__main__.FourCal'>
# 클래스로 계산기 만들기1 : 객체에 연산할 숫자 지정하기
>>> class FourCal:
>>> def setdata(self, first, second): # self는 말 그대로 객체 자기 자신을 의미함(참조 그림1)
>>> self.first = first
>>> self.second = second
>>> a = FourCal()
>>> a.setdata(4,2)
>>> print(a.first)
>>> print(a.second)
4
2
# self를 쓰지 않고 표현하는 방법도 있음. 통상적으로는 위 예제처럼 self를 작성
>>> a = FourCal()
>>> FourCal.setdata(a, 4, 2)
# * 객체에 생성되는 객체만의 변수를 '객체변수' 또는 '속성'이라 함. (객체가 가지고 있는 변수)
# 클래스로 계산기 만들기2 : add 집어넣기
>>> class FourCal:
>>> def setdata(self, first, second):
>>> self.first = first
>>> self.second = second
>>> def add(self):
>>> result = self.first + self.second
>>> return result
>>> a = FourCal()
>>> a.setdata(4,2)
>>> print(a.add())
6
# 클래스로 계산기 만들기3 : 곱하기, 빼기, 나누기 집어넣기
>>> class FourCal:
>>> def setdata(self, first, second):
>>> self.first = first
>>> self.second = second
>>> def add(self): # 더하기 기능 추가
>>> result = self.first + self.second
>>> return result
>>> def mul(self): # 곱하기 기능 추가
>>> result = self.first * self.second
>>> return result
>>> def sub(self): # 빼기 기능 추가
>>> result = self.first - self.second
>>> return result
>>> def div(self): # 나누기 기능 추가
>>> result = self.first / self.second
>>> return result
>>> a = FourCal()
>>> a.setdata(4,2)
>>> print(a.add())
>>> print(a.mul())
>>> print(a.sub())
>>> print(a.div())
>>> b = FourCal()
>>> b.setdata(10,5)
>>> print(b.mul())
6
8
2
2
50
# 클래스 변수
* self를 명시적으로 표현하는 것은 파이썬만의 독특한 특징.
- 생성자(클래스에서 오류 방지하기) : class로 인스턴스를 찍어낼 때, 처음에 무조건 실행되게 하는 것.
>>> class FourCal:
>>> def __init__(self, first, second): # __init__ 부분이 생성자
>>> self.first = first
>>> self.second = second
>>> def setdata(self, first, second):
>>> self.first = first
>>> self.second = second
>>> def add(self):
>>> result = self.first + self.second
>>> return result
>>> def mul(self):
>>> result = self.first * self.second
>>> return result
>>> def sub(self):
>>> result = self.first - self.second
>>> return result
>>> def div(self):
>>> result = self.first / self.second
>>> return result
>>> a = FourCal()
TypeError : FourCal.__init__() missing 2 required positional arguments : 'first' and 'second'
# 생성자를 넣으니, 조건을 충족하지 못했다고 오류가 남.
- 상속 : 클래스를 만들 때 다른 클래스의 기능을 물려받게 하는 것
>>> class FourCal:
>>> def __init__(self, first, second):
>>> self.first = first
>>> self.second = second
>>> def setdata(self, first, second):
>>> self.first = first
>>> self.second = second
>>> def add(self):
>>> result = self.first + self.second
>>> return result
>>> def mul(self):
>>> result = self.first * self.second
>>> return result
>>> def sub(self):
>>> result = self.first - self.second
>>> return result
>>> def div(self):
>>> result = self.first / self.second
>>> return result
>>> class MoreFourCal(FourCal): # 밑줄 자리에 부모 class를 넣으면 상속이 됨.
>>> def pow(self):
>>> result = self.first ** self.second
>>> return result
>>> a = MoreFourCal(4, 2)
>>> print(a.add()) # 부모 클래스한테 상속받은 것
>>> print(a.pow()) # 자신이 가지고 있는 함수
6
16
- 매소드 오버라이딩(Method Overriding) : 부모 클래스의 기능을 덮어 씌우는 것.
>>> class TwoCal:
>>> def __init__(self, first, second):
>>> self.first = first
>>> self.second = second
>>> def setdata(self, first, second):
>>> self.first = first
>>> self.second = second
>>> def add(self):
>>> result = self.first + self.second
>>> return result
>>> def div(self):
>>> result = self.first / self.second
>>> return result
>>> class SafeTwoCal(TwoCal):
>>> def div(self):
>>> if self.second == 0: # 나누는 값이 0인 경우 0을 리턴하도록 수정(부모의 div가 아닌 상속된 class로 적용됨)
>>> return 0
>>> else:
>>> return self.first / self.second
>>> a = MoreTwoCal(4, 0)
>>> print(a.div())
0
- 클래스 변수 : 공통적으로 가지고 있는 클래스 변수
>>> class Family:
>>> last name : "Kim"
>>> a = Family()
>>> b = Family()
>>> print(a.lastname)
>>> print(b.lastname)
Kim
Kim
5-2. 모듈
- 모듈 : 함수나 변수 또는 클래스를 모아 놓은 파이썬 파일(통상 모듈을 사용하는 입장)
# mod1.py(만들어져 있는 모듈)
>>> def add(a, b):
>>> return a + b
>>> def sub(a, b):
>>> return a - b
# 모듈 불러오기
>>> import mod1
>>> print(mod1.add(3, 4))
7
# 모듈에서 특정 함수(기능)만 불러오기
>>> from mod1 import add # mod1에서 add라는 함수만 쓸거야~
>>> print(add(3, 5))
8
# 모듈에서 오류 방지하기(if __name__ == "__main__": 기능)
>>> def add(a, b):
>>> return a + b
>>> def sub(a, b):
>>> return a - b
>>> print(add(1, 2))
3
# 만약 위의 예제처럼 모듈에 특정 값을 남겨놓으면, 모듈만 실행해도 3이라는 값이 나온다
>>> def add(a, b):
>>> return a + b
>>> def sub(a, b):
>>> return a - b
>>> if __name__ == "__main__": # 만약에 이 파일 안에서 실행되는거라면 아래의 기능을 수행해
>>> print(add(1, 2))
>>> print(__name__)
__main__
3
mod1 # __name__ 변수가 파이썬 자체에서 지정한 변수 이름(실행한 모듈 자체 이름이라고 이해하면 됨)
# 파일 경로 알려주기(sys 모듈 사용하기)
>>> import sys
>>> sys.path.append("/Users/name/Documents/python") # path는 절대경로로만 설정
>>> sys.path
5-3. 패키지
- 패키지 : 모듈의 집합(불러와서 쓰는 기능으로 이해만 할 것)
# 패키지 불러오는 원리, 패키지 예시 사진 참조 (이해만 하면 됨)
>>> import game.echo.sound
>>> game.sound.echo.echo_test() # game > sound > echo에 있는 echo_test 함수를 사용한다는 것
echo
# echo 모듈이 있는 디렉터리까지 from import하여 실행하는 방법
>>> from game.sound import echo
>>> echo.echo_test()
echo
# echo_test 함수를 직접 import 해서 실행하는 법
>>> from game.sound import echo_test
>>> echo_test()
echo
# 패키지 변수 및 함수의 정의
아래 패키지 예시를 보면 game 폴더에서 __init__.py가 있는데, 이것은 패키지라는 것을 알려주기 위한 용도의 파일
- 줄여쓰기
>>> import mod3 as m # mod3는 이제부터 m이라고 쓸게
>>> m.add()
5-4. 예외 처리
- 예외 처리 : 오류가 발생하면 어떻게 처리할지
# 파이썬 내 대표적인 오류
# 1. 없는 파일을 열 때
>>> f = open("없는파일", 'r')
FileNotFoundError : [Errno 2] No such file or directory : '없는 파일'
# 2. 숫자를 0으로 나눌 때
>>> 4 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError : division by zero
# 3. 리스트에서 리스트 외의 범위를 불러오려고 했을 때
>>> a = [1 , 2, 3]
>>> a[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError : list index out of range
# 예외 처리 하는 방법(try, except ZeroDivisonError, finally, else)
>>> try: # 오류가 발생할 수 있는 구문
>>> 4 / 0
>>> except ZeroDivisionError as e: # 오류가 발생했을 때
>>> print(e) # 상단의 as e를 지우고, e 부분에 메시지를 적어도 됨.
division by zero
>>> try:
>>> f = open('foo.txt', 'w')
>>> finally: # 중간에 오류가 발생하더라도 마지막에 무조건 실행
>>> f.close()
# many_error.py
>>> try:
>>> a = [1, 2]
>>> print(a[3])
>>> 4 / 0
>>> except ZeroDivisionError:
>>> print("0으로 나눌 수 없습니다.")
>>> except IndexError:
>>> print("인덱싱 불가합니다.")
인덱싱 할 수 없습니다 # 먼저 발생한 오류에 맞춰 메시지가 전시됨
# try_else.py
>>> try:
>>> age=int(input('나이를 입력하세요: '))
>>> except:
>>> print('입력이 정확하지 않습니다.')
>>> else: # else는 오류 발생이 안되었을 때 사용하는 것
>>> if age <= 18:
>>> print('미성년자는 출입금지입니다.')
>>> else:
>>> print('환영합니다.')
나이를 입력하세요 : 아무개
입력이 정확하지 않습니다.
나이를 입력하세요 : 20
환영합니다.
# 에러 패스하기
>>> try:
>>> f = open('없는 파일', 'r')
>>> except FileNotFoundError:
>>> pass
# 오류 일부러 발생시키기 (사용자가 꼭 덮어쓰지 않으면 안되게끔 강제하기 위해서 오류를 강제로 발생시킬 수도 있음)
>>> class Bird:
>>> def fly(self):
>>> raise NotImplementedError
>>> class Eagle(Bird):
>>> pass
>>> eagle = Eagle()
>>> eagle.fly()
Traceback (most recent call last):
File "<stdin>", line 9, in <module>
eagle.fly() ···
NotImplementedError
>>> class Bird:
>>> def fly(self):
>>> raise NotImplementedError # 사용자가 메소드를 오버라이딩하게끔 강제하는 것
>>> class Eagle(Bird):
>>> def fly(self): # 부모 클래스의 메소드가 정해져 있지만, 에러메시지 때문에 메소드를 오버라이딩함
>>> print("펄럭펄럭")
>>> eagle = Eagle()
>>> eagle.fly()
펄럭펄럭
# 예외 만들기
>>> class MaxError(Exception):
>>> pass
>>> def say_nick(nick):
>>> if nick == '운영자':
>>> raise MaxError()
>>> print(nick)
>>> say_nick("운영자")
MaxError
>>> class NickError(Exception):
>>> def __str__(self):
>>> return "허용되지 않은 닉네임입니다."
>>> def say_nick(nick):
>>> if nick == '운영자':
>>> raise MyError()
>>> print(nick)
>>> say_nick("운영자")
>>> say_nick("호랑이")
허용되지 않은 닉네임입니다.
호랑이
5-5. 내장 함수
- 내장 함수 : 파이썬 안에 내장된 함수(필요한게 있을 때 찾아서 쓰는 느낌으로 이해)
abs 입력값의 절대값을 리턴하는 함수 all 입력값의 요소가 모두 참이면 True, 거짓이 하나라도 있으면 False를 리턴 any 입력값의 요소 중 하나라도 참이면 True, 모두 거짓일 때만 False 리턴 chr 유니코드 숫자 값을 입력받아 그 코드에 해당하는 문자를 리턴 dir 객체가 지닌 변수나 함수를 보여주는 함수 divmod 2개의 숫자(a, b)를 입력으로 받고, a를 b로 나눈 몫과 나머지를 튜플로 리턴 enumerate(열거) 순서가 있는 데이터를 입력으로 받고, 인덱스 값을 포함하는 enumerate 객체로 리턴 eval 문자열로 구성된 표현식을 입력으로 받고, 결과값을 리턴 filter 첫번째 인수로 함수, 두번째 인수로 함수에 들어갈 데이터를 받고, 참인 것만 묶어서 리턴 hex 정수를 입력받고, 16진수 문자열로 변환하여 리턴 id 객체를 입력받고, 고유 주소값을 리턴 input 사용자 입력을 받는 함수 int 문자열 형태의 숫자나 소수점이 있는 숫자를 정수로 리턴 isinstance 첫번째 인수로 객체, 두번째 인수로 클래스를 받아 참이면 True, 거짓이면 False len 입력값의 길이(요소의 전체 개수)를 리턴하는 함수 list 반복 가능한 데이터를 입력받아 리스트로 만들어 리턴하는 함수 map 함수와 반복 가능한 데이터를 입력으로 받고, 입력받은 데이터 각 요소에 함수를 적용한 결과를 리턴 max 반복 가능한 데이터를 입력받고, 최대값을 리턴하는 함수 min 반복 가능한 데이터를 입력받고, 최소값을 리턴하는 함수 oct 정수를 8진수 문자열로 바꾸어 리턴 open '파일 이름', '읽기 방법'을 입력받고, 파일 객체를 리턴 ord 문자의 유니코드 숫자 값을 리턴하는 함수 pow(x, y) x를 y제곱한 결과값을 리턴하는 함수 range 입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어 리턴 round 숫자를 입력받고, 반올림해서 리턴 sorted 입력 데이터를 정렬한 후 그 결과를 리스트로 리턴 str 문자열 형태로 객체를 변환하여 리턴 sum 입력 데이터의 합을 리턴 tuple 반복 가능한 데이터를 튜플로 바꾸어 리턴 type 입력값의 자료형이 무엇인지 알려주는 함수 zip 동일한 개수로 이루어진 데이터들을 묶어서 리턴 * 외우는게 아니고 익숙해진 뒤, 필요할 때마다 찾아보면서 적용.
5-6. 표준 라이브러리
- 표준 라이브러리 : import라는 명령어와 함께 쓰는 라이브러리(마찬가지로 익숙해지고, 필요할 때마다 찾아보면서 적용)
# datetime.date
>>> import datetime
>>> day1 = datetime.date(2021, 12, 14)
>>> day2 = datetime.date(2023, 4, 5)
>>> print(day1)
>>> print(type(day1))
2021-12-14
<class 'datetime.date'>
# diff
>>> day1 = datetime.date(2021, 12, 14)
>>> day2 = datetime.date(2023, 4, 5)
>>> diff = day2 - day1
>>> print(diff.days)
477
# time
>>> import time
>>> a = time.time() # time.time()은 1970년 1월 1일부터 지금까지를 초단위로 계산해서 불러줌.
>>> for i in range(1, 1000):
>>> print("")
>>> b = time.time()
>>> print(b-a)
0.08 # 함수를 수행하는데 걸린 시간
# time.sleep
>>> import time
>>> for i in range(3):
>>> print(i)
>>> time.sleep(1)
0
1
2
5-7. 외부 라이브러리
- 외부 라이브러리(사용법은 각 외부 라이브러리에 맞는걸로 찾아서 공부하면 됨)
# 외부 라이브러리를 사용하려면 pip 도구를 선행 설치해야 함(템플릿 같은 개념)
# pip : 파이썬 모듈이나 패키지를 쉽게 설치할 수 있게 도와주는 도구 (pypi.org)
# pip 설치 / 삭제 / 업그레이드
>>> pip install 패키지 이름
>>> pip uninstall 패키지 이름
>>> pip install --upgrade 패키지 이름
# 설치된 패키지 확인하기
>>> pip list # 터미널 창에 입력
# 외부 라이브러리(Faker) 설치하기
>>> pip install Faker
# Faker 사용해보기
>>> from faker import Faker
>>> fake = Faker()
>>> print(fake.name())
>>> print(fake.address())
>>> print(fake.text())
Eric Haynes
416 Patricia Terrace Apt. 286
Yeseniaside, DC 18262
Goal figure likely. Couple agree individual lose major before short. Turn reduce similar field market.
* 외부 라이브러리의 메소드를 보고 싶으면 ⌘+ 클릭을 하면 상세 원리가 적혀있음