점프 투 파이썬 4

김지용·2022년 8월 24일
0

독서

목록 보기
4/11
post-thumbnail

클래스 모듈 패키지 예외처리 내장함수 외장함수

class Calculator:    
    def __init__(self):
        self.result = 0

    def adder(self, num):
        self.result += num
        return self.result


cal1 = Calculator()       # Calculator 은 클래스 cal1,cal2는 인스턴스
cal2 = Calculator()       # cal1,cal2는 특정 객체이며, Calculator의 인스턴스이다
			         # 즉, 인스턴스는 객체의 관계위주로 설명할 때 사용된다. (176p)

print(cal1.adder(3))
print(cal1.adder(4))
print(cal2.adder(3))
print(cal2.adder(7))

>>>3
>>>7
>>>3
>>>10

1. 클래스 내 함수의 첫번째 인수는 무조건 self로 사용해야 인스턴스의 함수로 사용할 수 있다.

2. cal1.adder(3) == Calculator.adder(cal1, 3) # 객체.메소드 == 클래스명.메소드

3. 클래스 하위에 있는 init 함수는 인스턴스를 만들 때 항상 실행된다.

4. 클래스 함수를 다른 말로 메소드라고 부른다.

5. is 와 == 의 차이점

is >>> 객체, 참조가 같을 때 True
== >>> 값이 같을 때 True

__init__ 메소드를 사용하면 인스턴스를 만드는 동시에 초깃값을 줄 수 있기 때문에 훨씬 편리하다(203p)
__init__ 메소드는 생성자라고도 한다.

클래스 상속

메소드 오버라이딩(205p)

-> 메소드 이름은 동일하게 다시 구현하는 것을 메소드 오버라이딩이라고 한다.

연산자 오버로딩(206p~)

연산자 오버로딩이란 연산자를 객체끼리 사용할 수 있게 하는 기법이다.

def __add__(self, other)
    print("self.fullname"+"과"+" other.fullname"+" 결혼했네.")

pey = HousePark("응용")  # 박응용 return이라고 가정
juliet = HouseKim("줄리엣") # 김줄리엣 return이라고 가정

pey + juliet
결과 >>> 박응용과 김줄리엣 결혼했네.

+ : __add__
- : __sub__
* : __mul__
/ : __truediv__

패키지는 도트(.)를 이용하여 파이썬 모듈을 계층적으로 관리할 수 있게 해준다.
ex)
from ProjectA.account.view import find_user
from ProjectA import account.view.find_user
위와 같이 계층간 이동을 .으로 구분지어서 사용할 수 있다.

if __name__ == "__main__":의 의미 (215p~)

mode1.py
def sfe_sum(a, b):
	~~~~~~~~
    ~~~~~~~~
    return

if __name__ == "__main__":
    print(safe_sum('a', 1))
    print(safe_sum(1, 4))
    print(safe_sum(10, 10.4))

C:\Python>python mod1.py 처럼 직접 이 파일을 실행시키면 __name__ == "__main__"이 참이 되어 if 다음문장을 실행시켜준다.
반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사요앟 때는 __name__ == "__main__"이 거짓이 되어 if문 다음 문장들을 실행하지 않는다.

즉, 모듈을 불러올 때 바로 수행되지 않게 제약을 걸고 싶을 때 사용한다.


__init__.py의 용도

init.py 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.
그래서 모듈을 불러올 때는 패키지로 정의된 하위 디렉토리들만 불러올 수 있다.(224~225p 내용)

__all__의 용도

특정 디렉토리의 모듈을 import * 을 이용하여 임포트 할 때에는 해당 디렉토리의 __init__.py 파일에

__all__ = ['echo'] 

all 변수를 선언하고 import 할 수 있는 모듈을 정의해주어야한다.
단, from a.b.c import * 에서 from의 마지막 항목이 c가 모듈인 경우는
all과 상관없이 무조건 import가능

오류 예외처리 기법(229p)

try, except문

except 발생 오류 as 오류 메시지 변수:

발생오류까지만 적으면 해당 오류때만 except문 실행

try:
    f = open('foo.txt', 'r')
except FileNotFoundError as e:   # foo.txt가 없다면 except절 수행
    print(str(e))
else:                                    # foo.txt가 있다면 else절 수행
    data = f.read()
    f.close()

else 절은 예외가 발생하지 않은 경우에 실행되며 반드시 except 절 다음에 위치해야한다.

f = open('foo.txt', 'w')
try:
    # 무언가를 수행한다.
finally:
    f.close()

finally 절은 트라이문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다.
보통 finally 절은 사용한 리소스를 close 해야할 경우에 많이 사용된다.

특정 오류 회피하기

try:
f = open("나 없는 파일", "r")
except FileNotFoundError: # 파일이 없더라도 오류를 발생시키지 않고 통과한다.
pass # pass를 사용하여 오류를 회피

오류 일부러 발생시키기

class Bird:
    def fly(self):
        raise NotImplementedError

자식클래스가 fly라는 함수를 구현하지않고 호출하면 에러가 무조건 나게 하고 싶을 때
NotImplementedError 라는 내장 오류를 발생시킨다.

꼭 작성해야 하는 부분이 구현되지 않을 경우 일부러 오류를 발생시키고자 사용한다.

내장함수

내장함수들은 외부 모듈과 달리 import가 필요하지 않다.

abs(x) -> 절대값을 반환

abs(-1.2) = 1.2

all(x)

반복가능한(iterable) 자료형 x를 입력 인수로 받으며 모두 참이면 True, 하나라도 거짓이면 False
iterable은 for문으로 출력할 수 있는 것을 의미

all([1,2,3])
결과 >>> True
all([1,2,3,0])
결과 >>> False          # 0은 자료형 중에서 거짓을 뜻한다.

any(x)

하나라도 참이면 True, 모두 거짓이면 False를 리턴한다. all(x)와 반대이다.

chr(i)

아스키 코드값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수이다.
ord()함수와 반대

dir

객체가 자체적으로 가지고 있는 변수나 함수를 보여준다.

dir(['리스트']) 하면 리스트가 쓸 수 있는 메소드들이 나온다.
결과 >>>[......, append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

dir({'key':'val'}) 하면 딕셔너리가 쓸 수 있는 메소드들이 나온다.
결과 >>> [......., 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

divmod(a, b)

a를 b로 나눈 몫과 나머지를 튜플 형태로 반환한다.
divmod(7,3)
결과 >>>(2,1)

enumerate()

순서가 있는 자료형(리스트,튜플,문자열)을 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.

for i, name in enumerate(['body', 'foo', 'bar']):
    print(i, name)
0 body
1 foo
2 bar

eval(expression)

실행 가능한 문자열(1+2, 'hi + 'a' 같은 것)을 입력받아 문자열을 실행한 결과값을 리턴

eval('1+2')
결과 >> 3
eval("'hi + 'a'")
>'hia'
eval('divmod(7,3)')
결과 >> (2,1)

filer(a, b)

필터는 a라는 함수와 b라는 반복가능한 함수를 받아서 b 중 리턴값이 참인 값만 묶어서 돌려준다.

def positive(x):
    return x>0

print(list(filter(positive, [1, -3, 2, 0, -5, 6])))
결과 >>>[1, 2, 6]

print(list(filter(lambda x: x > 0, [1, -3, 2, 0, -5, 6])))  
# 람다로 출력한 값은 리스트로 묶으면 값을 보기 좋다.
결과 >>>[1, 2, 6]

hex(x)

정수값을 입력받아 16진수(hexademical)로 변환하여 리턴하는 함수이다.

id(object)

객체를 입력받아 객체의 고유 주소값(레퍼런스)을 리턴하는 함수이다.

a = 3
b = a

id(3)
결과 >>> 135072304
id(a)
id(b)
결과 >>> 135072304
결과 >>> 135072304

input([prompot])

b = input("Enter: ") # Enter: 라는 프롬프트를 띄우고 사용자 입력을 받음

int()
int(3.4)
결과 >>> 3
int('11', 2)   #  2진수로 표현된 '11'의 10진수 값을 리턴
결과 >>> 3
int('1A', 16)   #  16진수로 표현된 '1A'의 10진수 값을 리턴
결과 >>> 26

instance(object, class)

해당클래스의 인스턴스가 맞으면 True, 아니면 False를 반환

lambda 인수1, 인수2, ... : 인수를 이용한 표현식

sum lambda a, b: a+b
sum(3,4)
>>> 7

len()

입력값의 길이(요소의 전체 갯수)를 리턴하는 함수

list()

자료형을 리스트로 만들어 리턴
리스트를 넣으면 그대로 반환

map(f, iterable)

함수 f와 반복가능한(iterable) 자료형을 입력으로 받는다.

map은 입력받은 자료형의 각 요소가 함수 f에 의해 수행된 결과를 묶어서 리턴하는 함수이다.

list(map(lambda a: a*2, [1,2,3,4]))
결과 >>> [2,4,6,8]

max(iterable)
max([1,2,3])
결과 >>> 3
max("python")
결과 >>> 'y'

min(iterable)
min([1,2,3])
결과 >>> 1
min("python")
결과 >>> 'h'

oct(x)

정수 형태의 숫자를 8진수 문자열로 바꾸어 리턴하는 함수이다.

open(filename, [mode])

'파일 이름'과 '읽기 방법'을 입력받아 파일객체를 리턴하는 함수이다.
읽기방법이 생략되면 기본값인 읽기 전용모드 (r)로 파일 객체를 만들어 리턴한다.

w 쓰기모드
r 읽기모드
a 추가모드
b 바이너리 모드

b는 w,r,a 와 함께 사용된다.
f = open("binary_file", "rb")

ord('c')

문자의 아스키 코드값을 리턴하는 함수이다. chr 함수와 반대!

pow(x, y)

x의 y 제곱한 결과값을 리턴한다.

range([start,] stop [,step])

인수가 3개일 경우
list(range(1, 10, 2)) # 1부터 9까지, 숫자 사이의 거리는 2
결과 >>>[1, 3, 5, 7, 9]

sorted(iterable)

입력값을 정렬한 후 '리스트'로 리턴하는 함수이다.

sorted 함수와 리스트 자료형의 sort함수의 차이

a = [3,1,2]
result = a.sort() 
print(result)
결과 >>> None   # 리턴값이 없어서 None이 출력됨. / 변수의 값만 정렬해서 변경
sorted(a)
결과 >>>[1,2,3]

str(object) 문자열로 리턴

tuple("abc")

결과 >>> ('a', 'b', 'c')

type(object) 입력값의 자료형이 무엇인지 알려주는 함수이다.

zip(iterable) 동일한 개수로 이루어진 자료형을 묶어주는 역할을 하는 함수이다.

list(zip([1, 2, 3], [4, 5, 6]))
>>> [(1, 4), (2, 5), (3, 6)]
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
>>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

외장함수(251p)

sys

sys 모듈은 파이썬 인터프리터가 제공하는 변수들과 함수들을 직접 제어할 수 있게 해주는 모듈이다.

  • sys.argv
  • sys.exit()
  • sys.path 등등이 있다.

pickle

pickle은 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈이다.
아래에서는 딕셔너리 객체를 이용했지만 어떤 자료형이든 상관없이 저장하고 불러올 수 있다.

import pickle
f = open("test.txt", 'wb')
data = {1:'python', 2: 'you need'}
pickle.dump(data, f)
f.close()
import pickle
f = open("test.txt", 'rb')
data = pickle.load(f)
print(data)

결과 >>> {2: 'you need', 1:'python'}

OS 모듈 (254p~266p)

os.environ 내 시스템의 환경 변수값을 알고 싶을 때
os.chdir("C:\WINDOWS") 현재 디렉터리의 위치 바꾸기
os.getcwd() 현재 자신의 디렉터리 위치를 리턴한다.
os.system("dir") 시스템 명령어인 dir 호출하기

os.popen 실행한 시스템 명령어의 결과값 리턴받기
f = os.popen("dir")
os.popen은 시스템 명령어를 실행시킨 결과값을 읽기 모드 형태의 파일 객체로 리턴한다.

기타 유용한 os 관련 함수

os.mkdir(디렉토리) 디렉토리를 생성한다.
os.rmdir(디렉토리) 디렉토리를 삭제한다(단, 디렉토리가 비어있어야 삭제가능)
os.unlink(파일 이름) 파일을 지운다.
os.rename(src, dst) src라는 이름의 파일을 dst라는 이름으로 바꾼다.

그 외 파이썬 모듈들 (앞부분의 모듈을 import 해서 써야한다.)

shutil.copy(src, dst) -> src라는 이름의 파일을 dst라는 디렉토리로 복사한다.
glob.glob(pathname) -> glob모듈은 *,? 등의 메타문자를 써서 원하는 파일만 읽어 들일 수 있다.
tempfile.mktemp() -> 중복되지 않는 임사파일의 이름을 무작위로 만들어서 리턴한다.
tempfile.TemporaryFile()은 임시 저장 공간으로 사용될 파일객체를 리턴한다.
이 파일은 기본적으로 바이너리 쓰기 모드(wb)를 갖는다. f.close()가 호출되면 파일 객체는 자동으로 사라진다.

time.time() 은 UTC(Universal Time Coordinate 협정 세계 표준시)를 이용하여 현재시간을 실수 형태로 리턴하는 함수이다.
1970년 1월 1일 0시 0분 0초를 기준으로 지난 시간을 초 단위로 리턴한다.

import time
time.time()
>> 1661144752.9804044 # 초단위로 리턴

time.localtime(time.time()) 은 time.time()에 의해 반환된 실수값을 이용해서 연도,달,월,시,분,초의 형태로 바꾸어주는 함수이다.
time.asctime(time.localtime(time.time()))은 time.ctime()을 이용해 간편하게 표시할 수 있다.
asctime과 다른 점은 ctime은 항상 현재 시간만을 리턴한다는 점이다.
time.strftime('출력할 형식 포맷 코드', time.localtime(time.time())))
strftime 함수는 시간에 관계된 것을 세밀하게 표현할 수 있는 여러가지 포맷코드를 제공한다.
포맷코드들(259p)
%a - 요일 줄임말 / Mon
%A - 요일 / Monday
%b - 달 줄임말 / Jan
%B - 달 / January
%c - 날짜와 시간을 출력함 / Mon Aug 23 14:13:42 2022

   # time.strftime('%c', time.localtime(time.time()))

.
.
.
time.sleep(1) 주로 루프 안에서 초단위의 일정 시간간격을 두고 루프를 실행하려고 사용
calendar.calendar(연도) 그 해의 전체 달력을 볼 수 있다.
random....
webbrowser....
등등이 있다.

읽어들인 파일 객체의 내용을 보기 위해서는 다음과 같이 하면된다.
print(f.read())

267p 문제풀이!!!

profile
김죵입니당 ^^

0개의 댓글