IT공부/점프 투 파이썬

파이썬 기본 문법 익히기_4

doublehyun 2022. 4. 26. 15:59

파이썬 프로그래밍 핵심! 클래스

    • class 가 필요한 이유?
      1. 어떠한 기능 사용(함수) + 값 저장(전역 변수) 를 하기 위해서!
      2. class 로 기능을 여러번 사용할 수 있다(인스턴스 생성으로!)
    • 클래스 개념 잡기
      • Ex) 클래스 [쿠키틀] - 인스턴스 [쿠키]
      • 클래스는 인스턴스를 만들기 위한 설계도 이다
        • 객체 - 클래스 (용어정리) ex) navi = cat()
          1. navi 는 객체
          2. navi는 cat의 인스턴스 이다
        • 즉 인스턴스는 관계위주 설명일 때 사용
    • 클래스 기초
      • self 맴버변수
        • this와 유사하며 해당 클래스에서 생성된 인스턴스를 지칭!
        • 클래스 내부 함수 선언시 첫 매개변수는 self!클래스

Ex) self

class Service:
         def setname(self, name): 
               self.name = name
                 print(name)

>>>pey.Service()
>>>pey.setname('ABC') // pey의 pey.name 은 'ABC' 이다
ABC 



      • __init__ 함수
        • instance를 만들 때 상상 실행된다 ( 생성자와 비슷함 )

Ex) __init__

class Service:

    def __init__(self, name):

        self.name = name

        print name

 

>>>pey = Service("ABC") // 아까 예시의 setname이 같이 실행된것 처럼 보임

ABC

 


    • 클래스 자세히 알기
      • 클래스의 구조

class [클래스명] [(상속 클래스 명)]:

    <클래스 변수1>

    <클래스 변수2>

    def [클래스 함수1] (self, [인수 ~ ])

        <문장1>

         ~ 형태

  • 클래스의 상속
    • 상속이란 ? 다른 클래스의 기능을 물려받는 것
    • [ class 상속받을 클래스명 (상속할 class명) ]

ex)

class A:

    def sum(self, a, b)

        print(a+b)

class B(A):

>>> x = B()

>>> x.sum(2, 5)

7

  • 메서드 오버라이딩
    • 상속받는 class에서 상속할 class와 같은 이름의 메서드를 만들어 재 정의하는 것
    • 이때 재정의한 기능으로 사용된다

ex)

class A:

    def cal(self, a, b)

        print(a+b)

class B(A):

    def cal(self, a, b) // 메서드 오버라이딩

        print(a-b)

>>> x = B()

>>> x.cal(5, 2)

3

 

  • 연산자 오버로딩
    • 연산자(+, -, /, *등) 을 객체끼리 사용할 수 있게 함

ex)

class HousePark:

    last name = '박'

    def __init__ (self, name):

        self.fullname = self.lastname + name

    def __add__ (self, other):

        print(%s 과 %s %(self.fullname, other.fullname) 

>>> A = HousePark("땡땡")

>>> B = HousePark("아무개")

>>> A+B // A=self, B=other

박땡땡 과 아무개 

- + / *
__sub__ __add__ __trudiv__ __mul__

 

2. 모듈

    = 함수나 변수, 클래스들을 모아놓은 파일, 

    = 다른 파이썬 프로그램에서 불러와 사용할 수 있게 만듬

 

 

 

 

 

 

 

 

 

 

-1 모듈 만들고 불러오기

만들기 (mod1모듈)

#mod1.py

def sum(a, b):

    return a+b

 

불러오기(동일 dir 에서)

>>>import mod1 // 불러온 상태

>>>print(mod1.sum(5, 6)) // 불러와서 기능 사용

11

>>>from mod1 import sum // sum 함수 바로 사용하게 불러오기

>>> print(sum(5, 6)

11

 

-2 if__name__ == "__main__": 의 의미

mod1.py 에 if__name__ == "__main__": print(sum(1, 2)) 추가

--- mod1.py 실행시

3 출력 -> 메인이기 때문에 if문 참

--- 다른 곳에서 mod1모듈 호출시

출력 X

메인이 아니기 때문에 if문이 거짓 (아래내용 실행 X)

 

3. 패키지

    = 도트(.)를 이용하여 파이썬 모듈을 계층적(dir구조) 로 관리함

    = 공통 작업에서 유리, 유지보수 유리, 모듈 이름이 같아도 경로가 달라 사용 가능!

Ex) game 패키지

Ex) game 패키지
game/
    __init__.py
    sound/
        __init__.py
        echo.py
        wav.py
    graphic/
        __init__.py
        render.py
    play/
        __init__.py

#echo.py
def echo_test():
    print("echo")
#render.py
def render_test():
    print("render")

-> game, sound, graphic, play는 디렉터리, game이 루트 dir, 나머지 sub dir

 

- 사용법

>>> import game.sound.echo

>>> game.sound.echo.echo_test()

echo

>> from game.sound import echo

>> echo.echo_test()

echo

-> import만 사용하면 경로를 전체 적어서 모듈 안에 함수 사용

-> from a import b 로 하면 경로를 a까지는 생략 가능, a부터는 적어야 함

-> from 이 없을 때 import의 마지막 항목은 반드시 모듈이나 패키지 여야 한다!

 

- __init__.py의 용도

    = 해당 dir이 패키지의 일부임을 알려주는 역활

ex) sound/ 에 __init__.py가 없으면 

      game/

grapic/ play/

-----------------------> 사실 python3.3부터는 없어도 인식한다,,, 하지만 하위버전 호환을 위해 사용하자!

 

- __all__의 용도(__init__.py파일 안에 변수)

    = 특정 dir* 로 모듈을 사용할 때 __all__로 설정된 모듈은 모듈.함수 로 사용할 수 있다

ex)(sound에는 echo.py, wav.py가 존재)

#__init__.py

__all__ = ['echo']

 

>>> from game.sound import *

>>> echo.echo_test()

echo

>>> wav.wav_test()

오류 발생! // __all__ 변수에 선언 안되있기 때문

 

- relative 패키지

 

ex) graphic의 render.py에서 echo.py를 사용하려면

#render.py
from game.sound.echo import echo_test
def render_test():
    print('render')
    echo_test()
#render.py
from ..sound.echo import echo_test
def render_test():
    print('render')
    echo_test()

이때 sound의 부모 dir, graphic의 부모 dir은 game으로 동일하다 (깊이depth 가 같다)

..의 뜻은 자신의 부모 dir경로를 나타내므로

graphic에서의 .. = game = sound에서의 .. 이다
따라서 from game.sound.echo import echo_test = from ..sound.echo import echo_test

-> 이때 .. 은 모듈 내에서만 사용 가능한 경로이다

 

4. 예외처리

    = 프로그램 작성중 발생하는 오류를 예외적으로 처리할 수 있다

 - 오류 발생 상황

    1. 디렉터리에 없는 파일을 열려고 할 때 : FileNotFoundError

    >>> f = open('없는파일', r)

    2. 0으로 다른 숫자를 나눌 때 : ZeroDivisionError

    >>> 4/0

    3. 리스트 인덱스 오류 : IndexError

 

 - 오류 예외처리 기법

    1. try except 문

실행문1 실행중 오류가 발생하면 실행문2 실행

try:
    <실행문1>
except [발생오류[as 오류메시지 변수]]:
    <실행문2>
try:
    4/0
except ZeroDivisonError as e:
    print(e)
------------------------
division by zero

    2. try else 문

예외가 발생하지 않은 경우 실행, 반드시 except 절 바로 다음에 위치해야 함

오류발생 = 2 실행, 정상 실행 = 1, 3 실행

try:
    <실행문1>
except [발생오류[as 오류메시지 변수]]:
    <실행문2>

esle:

    <실행문3>

 

    3. try finally 문

예외가 발생하던 말던 수행해야 하는 것(대부분 리소스.close() 인 경우에 많이 쓰임)

 

 - 오류 회피하기

파일이 없는 경우 pass로 실행 안하고 지나감

try:

    f = open('없는파일', r)

except FileNotFoundError:

    pass

    

    - 오류 일부러 발생시키기

raise 내장오류 로 발생시킴

 

5. 내장함수

숫자 관련 리스트, 튜플, 문자열, 딕셔너리, 집합 등 반복 가능한 것들 기타
abs(x) = x 절댓값 반환 all(x) = x 모두 참이면 True, 하나라도 거짓이면 False input(x) = 사용자가 입력을 받는 함수, x(문자열) 프롬프트에 띄움
divmod(a, b) = a b 나눈 몫과 나머지를 튜플의 형태로 반환 any(x) = x 모두 거짓이면 False, 하나라도 참이면 True lamda 인수 표현식 = 함수를 생성할 한줄로 선언 def와 동일한 역할
hex(x) = x 16진수로 변환하여 반환 range([strat,] stop [, step]) = 범위의 값을 반복가능한 객체로 반환, start 없으면 0부터, step 숫자 사이의 거리 open(filename, [mode]) = 파일을 모드 형태로 파일 객체를 반환함
int(x) = x(문자열형태 숫자, 소수점) 정수 형태로 반환 dir str(object) = object 문자열 형태로 변환하여 반환
int(x, radix) = radix형태로 표현된 x 10진수로 반환 enumerate(~)  = 순서가 있는 자료형을 인덱스 값을 포함하는 것으로 반환한다  for문에서 많이 쓰임 (0, a), (1, b) 형태로 반환 type(object) = 입력값의 자료형을 알려줌
oct(x) = 정수의 형태를 8진수로 반환 eval(x) = 문자열을 실행한 결과 값을 리턴하는 함수 ? instance(object, class) = object class 인스턴스인지 비교(T or F) 반환
chr(i) = 아스키 코드값i 해당하는 문자 출력 filter(a, 반복가능 자료형) = 반복 가능 자료   a 만족하는 것만 반환
a = 함수(조건)
id(x) = 객체를 입력받아 객체의 주소값(reference) 반환
ord(c) = 문자의 아스키 코드값을 반환 len(s) = s길이를 반환  
pow(x, y) = x y제곱 반환 list(s) = 반복 가능한 자료형 s 입력받아 리스트로 반환  
  map(f, x) = 함수(f) 반복가능 자료형(x) 입력받은 자료형의 요소가 f 의해 수행된 결과를 묶어서 반환한다  
  max(x) = 반복가능한 자료형x 최대값을 반환 / min(x) = 최소값 반환  
  sorted(x) = 반복가능한 자료형 x 정렬해서 반환(list .sort 반환 X )  
  tuple(x) = 반복 가능한 자료형 x 튜플로 반환  
  zip(iterable*) = 동일한 개수로 이뤄진 자료형을 묶어줌  

6. 외장함수

  = 파이썬 라이브러리 사용

 

- sys = sys 모듈은 파이썬 인터프리터가 제공한 변수 함수를 직접 제어할 수 있게 해줌

- pickle = 객체의 형태를 유지하면서 파일에 저장

- OS = 환경변수 dir, file등 os자원 제어 가능하게함

- shutil = 파일 복사 모듈

- glob = dir의 파일이름 읽기

- tempfile = 임시 파일 생성후 사용

- time = 시간관련

- calendar = 달력을 보여줌

- random = 난수 생성

- webbrowser = 기본 웹프라우저 자동 실행됨

 

=========================================================================

연습문제

 

#calculator.py
class Calculator :
    def __init__ (self, list) :
        self.list = list

    def sum(self) :
        tmp = 0
        for x in self.list :
           tmp += x
        return tmp

    def avg(self) :
        tmp = 0
        for x in self.list :
           tmp += x
        return tmp/len(self.list)

if __name__ == '__main__' :
    cal1 = Calculator([1, 2, 3, 4, 5])
    cal2 = Calculator([6, 7, 8, 9, 10])

    print(cal1.sum())
    print(cal1.avg())
    print(cal2.sum())
    print(cal2.avg())