[점프 투 파이썬] Chapter 06 : 파이썬 날개달기

Immutable(변하지 않는다 ) vs Mutable(변할수 있다)

  • Immutable: 정수, 실수 , 문자열, 튜플 → 새로운 값으로 할당
  • Mutable : 리스트, 딕셔너리, 집합 → 기존 값에 값을 추가

클래스

반복되는 변수 & 메서드를 미리 정해놓은 틀

  • 반복되는 변수, 메서드를 계속 반복하면 가독성이 떨어지고 복잡해지기 때문에 틀을 만들어놓고, 새로운 인스턴스를 만들어낸다
# 틀짜기
class Calculator:
	def __init__(self):
		self.result = 0
	def add(self,num):
		self.result += num
		return self.result

# 틀을 이용해서 인스턴스 객체 만들기
cal1 = Calculator()
cal2 = Calculator()

# 사용
print(call.add(3))
print(call.add(4))
print(cal2.add(3))
print(cal2.add(7))

응용

class FourCal:
		def __init__(self, first, second):  # 예약어, 이게 무조건 맨처음 실행됨
        self.first = first
        self.second = second
    def setdata(self, first, second):  # self는 생성한 인스턴스에 바인딩 된다
        self.first = first  # 이제 self.first = a.first 값은 4가 되는것이다
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

# 데이터 설정하기 (값 할당)
a = FourCal()
a.setdata(1, 2)
print(a.first)
print(a.second)

# 전달한 값으로 더하기
print(a.add())

# __init__
a = FourCal() # inint 떄문에 생성자 함수 호출할때부터 인자를 넣어야한다
a.setdata(1, 2)

클래스의 상속

기존 부모 클래스에서 정의한 값, 메서드를 그대로 상속받아 사용 , 더 나아가 활용함

class 자식클래스변수(부모클래스): # (부모클래스) -> 상속 부모
    pass # 부모의 기능을 그대로 씀
  • 자식에게도 init 을 선언해도 된다

메서드 오버라이딩

부모 기능을 재구성함

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

# 부모클래스의 똑같은 div를 재할당 함으로, 기능을 달리함 
class SageFourCal(FourCal):
	def div(self):
		if self.second == 0:
			return 0
		else:
			return self.first / self.second

a = SafeFourCal(4, 0)
a.div() # 0이 나온다

클래스 변수, 객체 변수

class FourCal:
	first = 3 # 클래스 변수 : 클래스에 공통적으로 사용되는 변수
	self.fisst = frist # 객체 변수 : 인스턴스에 할당할 변수

모듈이란?

미리 만들어 놓은 .py 파일

# mod1.py
def add(a,b):
	return a+b
# 내 파일을 런타임 하면 해당 name은 main이다, 하지만 import해서 쓸경우 improt한 곳이 main이 된다
# 이를 이용하면 내 파일로 런타임을 할때만 원하는 코드가 나오게 할수있다
if __name__ == "__main__": 
	print(add(1,2))
	print(add(3,4))

#이라 할때..

import mod1 # import로 불러 오고
print(mod1.add(1,2)) # 사용한다

from mod1 import add # mod1에서 add만 쓴다
print(add(1,2)

# import 경로 찾기
import sys
sys.path.append("C:\\~~~~~\\~~") # sys는 경로에 해당 경로를 넣어준다

패키지란?

모듈 여러개를 모아 놓은 것


game/ # 루트 디렉터리
    __init__.py # <=패키지를 설정하는 파이썬 파일 
    sound/ # 서브 디렉터리
        __init__.py
        echo.py
        wav.py
    graphic/
        __init__.py
        screen.py
        render.py
    play/
        __init__.py
        run.py
        test.py

폴더는 디렉터리, .py는 파이썬 모듈이다

패키지만들기

# 실행하는 방법, 경로가 중간에 끊기면 ㄴㄴ

import game.sound.echo
game.sound.echo.echo_test()

# 특정 모듈를 가져올때
from game.sound import echo
echo.echo_test()

# 특정 모듈의 메서드를 가져올때
from game.sound.echo import echo_test
echo_test()

# 모듈의 이름을 바꿔서 사용
from game.sound.echo import echo_test as e
e()

# 해당 디렉터리 하부의 모든 모듈 가져오기
from game.sound import *
__all__ = ['echo' , '사용할 모듈', '가져올 모듈' ...]

# 상대 경로로 가져오기 (..=지금 보고있는 파일 기준 한단계 위)
from ..sound.echo import echo_test
echo_test

예외 처리

오류가 발생했을때 프로그램이 종료되지 않고, 처리 하는것

오류가 발생할수 있는 구문?

  • try: 오류가 발생할수 있는 구문
  • except Exception as e : 오류 발생
  • else: 오류 발생 ㄴㄴ
  • finally: 무조건 마지막에 실행

try, except문

try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...

# 에러
try:
   4/0
except ZeroDivisionError[as e]]:
    print(e)

# else 이용
	try:
			f = open('none','r')
	except FileNotFoundError as a: 
		  print(ste(e))
	else : # 구문에 에러가 없을때(성공) 했을때 실행해라
			data = f.read()
			print(data)
			f.close()

try .. finally

f = open('foo.txt', 'w')
try:
    # 무언가를 수행한다.
		data = f.read()
		print(data)
except Exception as e: # Exception은 모든 에러의 부모 클래스, 상속받아서 다 알수있다
		print(e)
finally:
    f.close() # 성공, 실패 상관 없이, 코드가 실행됨

# 여러 조건
try:
    a = [1,2]
    print(a[3])
    4/0
except ZeroDivisionError as e:
    print(e)
except IndexError as e:
    print(e)

예외 처리

# 예외 처리 - 오류 회피하기
try:
    f = open("나없는파일", 'r')
except FileNotFoundError:
    pass

# 예외 처리 - 오류 일부러 발생시키기
class Bird:
    def fly(self):
        raise NotImplementedError # 이게 실행되면 에러가 생김

# 변형하면 fly을 사용할수있음
class Eagle(Bird):
    def fly(self):
        print("very fast")

eagle = Eagle()
eagle.fly()

에러 처리를 쉽게해, 재사용성과 유지보수를 쉽게 한다


내장함수

빌트인 함수, 기본적으로 있는 함수

# abs : 절대값
>>> abs(3)
3
>>> abs(-3)
3
>>> abs(-1.2)
1.2

# all : 리스트 참인지 검사
>>> all([1, 2, 3])
True

# any : 하나라도 참?
>>> any([1, 2, 3, 0])
True

# 아스키 코드 받아 문자 출력 (알고리즘에서 사용함)
>>> chr(97)
'a'
>>> chr(44032)
'가'

# dir : 객체가 자체적으로 가지고 있는 변수나 함수를 보여 준다(프로퍼티, 메서드)
>>> dir([1, 2, 3])
['append', 'count', 'extend', 'index', 'insert', 'pop',...]
>>> dir({'1':'a'})
['clear', 'copy', 'get', 'has_key', 'items', 'keys',...]

... 너무 많아서 찾아보자

divmod
enumerate
eval
* filter
hex
id
* input
* int
isinstance
* len
* list
* map
max
min
oct
* open
ord
pow
* range
round
* sorted
str
* sum
tuple
*type
*zip

*는 꼭보자

외장 함수

라이브러리에서 가져다 쓰는 함수

라이브러리는 개발자들이 계속 만듬 ⇒ 겁나 편함

# pickle : 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈
>>> import pickle
>>> f = open("test.txt", 'wb')
>>> data = {1: 'python', 2: 'you need'}
>>> pickle.dump(data, f)
>>> f.close()

# time : 시간과 관련된 time 모듈
>>> import time
>>> time.time()
988458015.73417199 #1970년 1월 1일 0시 0분 0초를 기준

#random : 난수(규칙이 없는 임의의 수)를 발생시키는 모듈
>>> import random
>>> random.random()
0.53840103305098674

# webbrowser : 자신의 시스템에서 사용하는 기본 웹 브라우저를 자동으로 실행하는 모듈
>>> import webbrowser
>>> webbrowser.open("http://google.com")

좋은 웹페이지 즐겨찾기