Python 혼공노트 6.
- 혼자 공부하는 파이썬(개정판) 청강하며... (그외 파이썬 강의도 …)
모듈: 관심/목적에 따라 묶음
- 파일 또는 폴더를 활성하여 활용/구성
라이브러리: 정상 제어를 하는 모듈
정상제어 > 필요에 따라, 모듈의 기능을 개발자가 직접 호출 (e.g.) math, beautifulsoup, etc..)
프레임워크: 제어 역전이 발생하는 모듈
제어역전 > 필요한 경우, 모듈이 개발자가 만든/만들 기능을 스스로(?) 호출 (e.g.) flask, etc..)
기본적인 활용방법
a. 목적 인지 - 무엇을 하고자 하는지 (가장 주요한 포인트)
b. 관련 검색 - 목적을 수행하고자 할 때 필요한 것에 대한 구글링
c. 코드 참조 – 확인된/검색된 코드 활용
d. 반복 사용 – 자주 사용하게 되는 코드는 재활용/암기
파이썬 모듈 문서: 모듈에 대한 정보를 열람 가능
파이썬 표준 라이브러리:
https://docs.python.org/ko/3/library/index.html
아래 3가지 방법으로, import 키워드를 통해 가장 뒤에 명시된 항목을 읽어 들여 활용함.
import module_name # “모듈”을 식별자로 읽어들임
import module_name as 닉 # 모듈을 “닉”이라는 별도의 식별자로 읽어들임
from module_name import 변수/함수/클래스 # 변수/함수/클래스를 식별자로 읽어들임
# 읽어들일 대상은 ‘,’로 구분하여 여러 개를 한번에 읽을 수 있음
- 현재 실행 중인 파일과 같은 위치에서 “모듈이름”이라는 파일 또는 폴더가 존재하는 지 확인
> 존재하지 않는 경우, 환경 변수에 등록되어 있는 경로 중 위치에서 확인
> 활용하고자 하는 특정 모듈과 동일한 다른 용도의 같은 이름의 파일이 존재하는 경우, 의도하지 않은 오류를 경험할 수 있음에, 파일명 작성 시, 모듈 이름을 사용하지 않도록 유의 필요.
e.g.)
import math
import pandas as pd
import numpy as np
import tensorflow as tf
from bs4 import BeautifulSoup
알아두면 피가되고 살이되는 많이 사용되는 모듈 및 함수
import random
print(random.uniform(10, 20)) # 10~20 사이의 float 형 난수를 생성
print(random.randrange(10, 20)) # 10~20 사이의 int 형 난수를 생성
print(random.choice([1,2,3,4,5,6])) # 주어진 범위(리스트) 중 하나를 임의로 선택
import sys
sys.argv
sys.path
import os
os.name
os.listdir(“.”)
os.mkdir(“directory_name”)
os.rmdir(“directory_name”)
os.rename(“old_directory_name”, “new_directory_name”)
os.remove(“directory_name”)
os.system(“system_command”)
import time
time.sleep(sec) # n sec 동안 코드 실행을 임시 정지
from urllib import request
target = request.urlopen(https://google.com)
print(target.lead())
모듈 예제
---------------------------------------------------------------
Hellomodule.py:
class Circle:
def __init__(self, 반지름):
if 반지름 < 0:
raise ValueError()
self.__PI = 3.14
self.__반지름 = 반지름
def 넓이(s):
return s.__PI * s.__반지름 ** 2
def 둘레(s):
return 2 * s.__PI * s.__반지름
If __name__ = “__name__” # hellomodule이 모듈이 아닌 main으로 실행될 때만 수행되는 코드
print(“넓이() 검증”)
if Circle(10).넓이() – 314 < 10 ** -7: # 부동소수점 연산은 연산 결과가 정확히 떨어지지 않아 “==”로 확인불가
print(“넓이() 검증 완료: Success”)
print(“둘레() 검증”)
else:
print(“검증실패: fail”)
if Circle(10).둘레() – 62.8 < 10 ** -7:
print(“둘레() 검증 완료: Success”)
else:
print(“검증실패: fail”)
main.py:
# ------------------------------------
# from hellomodule import Circle
# c = Circle(10)
# ------------------------------------
Import hellomodule as h
c = h.Circle(10)
print(c.넓이())
print(c.둘레())
cf. __name__ # 모듈인지 확인 가능
print(__name__)
모듈인 경우: 모듈명을 반환 – hellomodule
메인인 경우: “__name__”을 반환
Note. 모듈 내용이 변경되는 경우, 해당 모듈의 변경이 정상인지 결과 및 영향도 등을 확인하고자 할 때 활용가능
패키지: 모듈의 규모가 커졌을 때, 모듈을 나누는 방법 / 덩치 큰 클래스들을 별도 파일로 구분하는 경우가 많음
- 폴더 내부에 존재하는 모듈을 로드
from .foldername.class_filename import Classname
from .foldername.class_filename import * #단일 Class만 존재하는 경우 ‘*’로 대체 가능
Note. ‘.’로 상대경로를 지정
- 폴더 자체를 모듈로 로드
폴더 내부에 “__init__.py”를 구현
__init__.py:
__all__ = [접근허용할_Class명을 list로 나열] # 외부에서 대상 모듈에 접근 시 사용/접근을 허용할 항목들.
Note. 명시되지 않은 것은 접근되지 않음.
기본내장모듈(built-in module)
e.g.)
Math
Sys
Time
외부 모듈(external module): # 추가 설치 필요
pip install module_name
e.g)
Web dev
Flask, Django
Web scraping
beautifulsoup4, requests
machine learning
tensorflow, scikit-learn
video analyze
cv2, pillow, webcam-streamer
music
python-midi, midi, Mido
기상청 예보를 통한 BeautifulSoup 연습
from urllib import request
from bs4 import BeautifulSoup
kma_url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"
def get_text(kma_url):
try:
res = request.urlopen(kma_url)
soup = BeautifulSoup(res, 'html.parser')
for location in soup.select("location"):
city = location.select_one("city").string
print(city)
for data in location.select("data"):
time = data.select_one("tmEf").string
status = data.select_one("wf").string
min_temp = data.select_one("tmn").string
max_temp = data.select_one("tmx").string
#print(time)
#print(status)
#print(min_temp)
#print(max_temp)
except:
print("failed crawling")
get_text(kma_url)
기상청 예보를 통한, Flask, BeautifulSoup 연습
from urllib import request
from bs4 import BeautifulSoup
from flask import Flask
# 기상청 홈페이지의 RSS 정보 얻기
kma_url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"
res = request.urlopen(kma_url)
app = Flask(__name__)
@app.route("/")
def weather():
output = ""
soup = BeautifulSoup(res, 'html.parser')
for location in soup.select("location"):
city = location.select_one("city").string
for data in location.select("data"):
time = data.select_one("tmEf").string
status = data.select_one("wf").string
min_temp = data.select_one("tmn").string
max_temp = data.select_one("tmx").string
output += f"<h3>{city} {time} {status} {min_temp} {max_temp}</h3>"
return output
- 완강 -