파이썬

11. 표준 라이브러리 -2

Mara7 2022. 8. 21.
반응형
LIST

11.1. 출력 포매팅

import reprlib
# reprlib: 결과 문자열의 크기에 제한이 있는 객체 표현을 생성하는 수단 제공

print(reprlib.repr(set('supercalifragilisticexpialidocius')))
# 같은 이름의 내장 함수에 의해 반환된 것과 비슷한 문자열을 반환함
# 글자크기 줄여줌
import pprint
# pprint : 데이터를 보기 좋게 출력(pretty print)
t = [[['black','cyan'],'white',['green','red']],[['magenta','yellow'],'blue']]
pprint.pprint(t,width=30)

<출력>
[[['black', 'cyan'],
  'white',
  ['green', 'red']],
 [['magenta', 'yellow'],
  'blue']]
import textwrap
# 텍스트의 문단을 주어진 화면 너비에 맞게 포맷
doc ="""The wrap() method is just like fill() except that it returns a list of strings instead of one big string sith newlines to separate the wrapped lines."""
print(textwrap.fill(doc,width=40))

# <출력>
	The wrap() method is just like fill()
	except that it returns a list of strings
	instead of one big string sith newlines
	to separate the wrapped lines.

11.2. 템플릿

from string import Template
# string 모듈: template 클래스 포함함
# 형식 : $와 유효한 파이썬 식별자로 만들어진 자리표시자 이름을 사용함
# 중괄호를 사용하여 자리표시자로 둘러쌈 
t = Template('${village}folk send $$10 to $cause.')
print(t.substitute(village='Nottingham',cause='the ditch fund'))
from string import Template

t = Template('Return the $item to $owner')
d = dict(item='unladen swallow')
t.substitute(d)
# substitute() : 템플릿 치환 , 새 문자열 반환
# 자리표시자가 딕셔너리나 키워드 인자로 제공되지 않을 때 KeyError를 일으킴
print(t.safe_substitute(d))

from string import Template

import time,os.path
photofiles = ['img_1074.jpg','img_1076.jpg','img_1077.jpg']
class BatchRename(Template):
    delimiter = '%'
fmt = input('Enter rename style(%d-date %n-seqnum %f-format): ')

t = BatchRename(fmt)
date = time.strftime('%d%b%y')
for i,filename in enumerate(photofiles):
    base,ext = os.path.splitext(filename)
    newname = t.substitute(d=date,n=i,f=ext)
    print('{0} --> {1}'.format(filename,newname))

11.3. 바이너리 데이터 레코드 배치 작업

import struct
# struct 모듈 : 정수, 부동 소수점 숫자, 문자열을 bytes 객체로 변환하거나 bytes 객체에서 빼냄
with open('myfile.zip','rb') as f:
# myfile.zip 을 binary 포맷으로 읽거나 쓰기 
    data = f.read()
start = 0
$ 0 부터 시작한다.
for i in range(3):
#0부터 3까지 반복
    start +=14
# start에 14를 더해서 출력한다.
fields = struct.unpack('<lllHH', data[start:start+16])
# ZIP 파일 헤더 정보를 루핑하는 방법
# unpack(format,string)
# "H" : 2byte "l" : 4byte 부호 없는 숫자
# " < " : 표준 크기 + 리틀 엔디안 바이트 순서를 가짐
## 리틀 엔디안 바이트 : 낮은 주소에 데이터의 낮은 바이트부터 저장하는 방식
    crc32,comp_size,uncomp_size,filenamesize,extra_size= fileds
# crc32(): 부호 있는 정수
# comp_size
# uncomp_size
# extra_size 
    start +=16
filename = data[start:start:filenamesize]
    start += filenamesize
    extra = data[start:start+extra_size]
    print(filename.hex(crc32),comp_size,uncomp_size)

    start +=extra_size + comp_size

11.4. 다중 스레딩

  • 스레딩은 차례로 종속되지 않는 작업 분리하는 기술
  • 스레드 : 다른 작업이 백그라운드에서 실행되는 동안 사용자 입력을 받는 응용프로그램의 응답을 향상하는데 사용
import threading,zipfile
threading, zipfile 모듈 불러옴
class AsyncZip(threading,Thread):
# AsyncZip : 비동기 이터러블과 함께 작동하는 간단한 zip 함수

    def __init__(self,infile,outfile):
# 빈 객체를 만들기/초기값 설정
        threading.Thread.__init__(self)
# 
        self.infile = infile
        self.outfile = outfile

    def run(self):
        f = zipfile.ZipFile(self.outfile,'w',zipfile.ZIP_DEFLATED)
        f.write(self.infile)
        f.close()
        print('Finished backgroud zip of:',self.infile)
backgroud = AsyncZip('mydata.txt','myarchive.zip')
backgroud.start()
print('The main program continues to run in foreground')

backgroud.join()
print('Main program waited until backgroud was done')

11.5. 로깅

import logging
# 파이썬 로깅 시설
logging.debug('Debugging information')
# debug : **디버그** // 상세한 정보, 문제 진단 시 필요
logging.info('informational message')
# info  : **정보** // 예상대로 작동하는지 확인
logging.warning('Warning:config file %s not found','server.conf')
# warning : **경고** // 예상치 못한 일 발생(소프트웨어 예전처럼 작동)
logging.error('Error occured')
# error : **에러** // 심각한 문제로 인해 소프트웨어 일부 기능 수행 못함
logging.critical('Critical error -- shutting down')
# critical : **심각** // **심각한 에러**로 인해 프로그램 자체가 계속 실행되지 않을 수 있음.

11.6. 약한 참조

  • 파이썬은 자동 메모리 관리를 수행하며 메모리는 마지막 참조가 제거된 직후에 해제됨
  • 가비지 수거 : 더 사용되지 않는 메모리를 반납하는 절차, 파이썬은 참조 횟수 추적과 참조 순호나을 감지하고 끊을 수 있는 순환 가비지 수거기를 통해 가비지 수거를 수행함
    • 가비지 수거기 : gc 모듈 사용
import weakref,gc
# weakref : 참조를 만들지 않고 객체를 추적할 수 있는 도구 제공

class A:
    def __init__(self,value):
        self.value = value
    def __repr__(self):
        return str(self.value)
a = A(10)
# reference 만들기
d = weakref.WeakValueDictionary()
d['primary'] = a
# reference를 만들 수 없음 
d['primary']
# 만약에 살아있으면 object 를 패치함

del a
# one reference를 제거함
gc.collect()
# 가비지 수거를 실행함
d['primary']
# entry는 자동으로 제거됨

11.7. 리스트 작업 도구

  • 내장 리스트 형
from array import array
# array() : 동질적인 데이터만을 저장하고 보다 조밀하게 저장하는 리스트와 같음
a = array('H',[4000,10,700,22222])
# 'H' : 2 바이트의 부호 없는 이진 숫자(형 코드 "H")로 저장된 숫자 배열
sum(a)
>>> 26932
print(a[1:3])
>>> array('H', [10, 700])
from collections import deque
# collections 모듈은 deque() 객체 제공
# deque(): 양뱡향 큐 
d = deque(["task1","task2","task3"])
d.append("task4")
# d에 task4 추가 >>> deque(['task1','task2','task3','task4'])
print("Handing",d.popleft())
# d에 popleft() 왼쪽에서 하나 제거 >>> deque(['task2','task3','task4'])

unsearched = deque([starting_node])
# unsearched 를 starting_node 데크로 저장
def breadth_first_search(unsearchead):
    # breadth_first_search 함수를 정의
    node = unsearchead.popleft()
    # node를 unsearchead.popleft로 정의,
    for m in gen_moves(node):
        # m을 gen_moves(node)만큼 반복
        if is_goal(m):
            #a만약에 is_goal(m)이라면?
            return m
        # m리턴
        unsearched.append(m)
        # unsearched에 m을 append
import bisect
#bisect 모듈 불러오기
## bisect : 배열 이진 분할 알고리즘
scores = [(100,'perl'),(200,'tcl'),(400,'lua'),(500,'python')]
bisect.insort(scores,(300,'ruby'))
# 정렬된 시퀀스에 삽입
print(scores)
from heapq import heapify,heappop,heappush
# heapq 모듈 : 이진 트리 기반의 최소 힙 자료 구조 제공, 
							#최소 힙을 지원하는 모듈로 직접 최소 힙을 구현하지 않아도 되는 장점이 있음
## heap : 최댓값, 최솟값을 찾아내는 연산을 빠르게 하기 위해 고안됨
### q : 가장 먼저 들어온 데이터
#### heapq 모듈에서 heapify,heappop,heappush 가져오기
data = [1,3,5,7,9,2,4,6,8,0]
heapify(data)
# 배열을 힙형태로 만들어줌
# heap order에서 리스트 다시 가져 오기
heappush(data,-5)
# 새로운 엔티티 추가하기
print([heappop(data) for i in range(3)])
# 세가지 가장 작은 엔티티들 패치하기

11.8. 10진 부동 소수점 산술

from decimal import *
# decimal : 10진 부동 소수점 산술을 위한 decimal 데이터형을 제공함

round(Decimal('0.70')*Decimal('1.05'),2)
# round : 반올림
print(round(.70*1.05,2))
from decimal import *
# decimal : 10진 부동 소수점 산술을 위한 decimal 데이터형을 제공함

round(Decimal('0.70')*Decimal('1.05'),2)
# round : 반올림
round(.70*1.05,2)

Decimal('1.00')% Decimal('.10')
#네 자리 유효 숫자를 자동으로 추론
# Decimal 손으로 한 수학을 재현, 이진 부동 소수점이 십진수를 정확히 표현할 수 없을 때 발생할 수 있는 문제를 피함
print(1.00%0.10)
print(sum([Decimal('0.1')]*10) == Decimal('1.0'))
print(sum([0.1]*10) ==1.0)

getcontext().prec  =36
#getcontext: 활성 스레드의 현재 컨텍스트를 돌려줌
print(Decimal(1) /Decimal(7))
반응형
LIST

댓글