본문 바로가기
#단편모음/낱 장

[혼공파] C07 함수-230601木

by taeni 2024. 4. 16.

C07 모듈

07-1 표준 모듈

07-2 외부 모듈

07-3 모듈 만들기


07-1 표준 모듈     (p.329 마무리)

표준 모델은 파이썬이 기본적으로 제공하는 모듈입니다.

import 구문은 모듈을 읽어 들일 때 사용하는 구문입니다.

as 키워드는 모듈을 읽어 들이고 별칭을 붙일 때 사용하는 구문입니다.

파이썬 문서는 모듈의 자세한 사용 방법이 들어있는 문서입니다.

 

07-2 외부 모듈   (p.347 마무리)

외부 모듈external module은 파이썬이 기본적으로 제공하지 않는, 다른 사람들이 만들어 제공하는 모듈을 의미합니다.

pip install은 외부 모듈을 설치할 때 사용하는 명령어입니다.

제어 역전IoC; Inverse of Control은 개발자가 모듈의 함수를 호출하는 것이 일반적인 제어 흐름이나, 이와 반대로 개발자가 만든 함수를 모듈이 실행하는 것을 말합니다.

라이브러리library는 개발자가 모듈의 기능을 호출하는 형태와 같이 정상적인 제어를 하는 모듈입니다.

프레임워크framework는 모듈이 개발자가 작성한 코들르 실행하는 형태의 모듈입니다.

 

07-3 모듈 만들기    (p.366 마무리)

엔트리 포인트entry point는 python 명령어를 사용해서 첫 진입 파일을 엔트리 포인트라고 부릅니다.

__name__ == "__main__"는 현재 파일이 엔트리 포인트인지 활인할 때 사용하는 코드입니다.

패키지package는 모듈이 모인 것을 말합니다.


07-1 표준 모델

파이썬은 모듈module이라는 기능을 활용해 코드르 분리하고 공유한다.

모듈은 모듈은 여러 변수와 함수를 가지고 있는 집합체로, 크게 표준 모듈과 외부 모듈로 나뉜다.

표준 모듈 파이썬에 기본적으로 내장되어 있는 모듈을 '표준 모듈'
외부 모듈 다른 사람들이 만들어서 공개한 모듈
import 모듈 이름

 

(좌)math모듈 (중)from구문 (우)as구문

모듈 사용의 기본: math 모듈

math 모듈은 수학과 관련된 기능을 가지고 있다.

import math

● 모듈 문서

math 모듈의 함수

변수 또는 함수 설명
sin(x) 사인값을 구합니다.
cos(x) 코사인값을 구합니다.
tan(x) 탄젠트값을 구합니다.
log(x[, base]) 로그값을 구합니다.
ceil(x) 올림합니다.
foor(x) 내림합니다.

표준 모듈 등의 정보가 궁금할 때 먼저 확인해야 하는 것은 파이썬 공식 문서이다.

https://docs.python.org/ko/3/library/index.html

 

● from 구문

모듈에는 많은 변수와 함수가 들어있다. 하지만 그중에서 우리가 활용하고 싶은 기능은 극히 일부일 수 있고, math.cos(), math.sin(), math.pi처럼 math.를 계속 입력하는 것이 귀찮다고 느껴질 수 있다.

 

이때는 다음과 같이 from구문을 사용한다.

from 모듈 이름 import 가져오고 싶은 변수 또는 함수

● as 구문

모듈을 가져올 때 이름 충돌이 발생하는 경우가 있을 수 있다.

추가로 모듈의 이름이 너무 길어서 짧게 줄여 사용하고 싶은 경우도 있다.

이럴 때는 다음과 같은 as구문을 사용한다.

import 모듈 as 사용하고 싶은 식별자

이를 활용하면 이전의 코드에서 math로 사용하던 math모듈을 m이라는 이름 등으로 사용할 수 있다.

random 모듈

random 모듈은 랜덤한 값을 생성할 때 사용하는 모듈이다.

import random

random 모듈 문서의 예시  ( 스크롤 - 중후반부에 위치)

https://docs.python.org/ko/3/library/random.html?highlight=random%20%EB%AA%A8%EB%93%88#module-random 

 

random — Generate pseudo-random numbers

Source code: Lib/random.py This module implements pseudo-random number generators for various distributions. For integers, there is uniform selection from a range. For sequences, there is uniform s...

docs.python.org

 

 

# 위의 코드처럼 일일이 random.random()처럼 random을 계속 입력하려면 귀찮기 때문에 
# 이전 절에서 배웠던 from 구문을 호라용해서 임포트하는 것이 일반적이다.

from random import random, randrange, choice

sys 모듈 

sys모듈은 시스템과 관련된 정보를 가지고 있는 모듈이다.

명령 매개변수를 받을 때 많이 사용된다.

os 모듈

os모듈은 운영체제와 관련된 기능을 가진 모듈이다.

새로운 폴더를 만들거나 폴더 내부의 파일 목록을 보는 일도 모두 os  시스템과 관련된 정보를 가지고 있는 모듈이다.

명령 매개변수를 받을 때 많이 사용된다.

datetime 모듈

datetime 모듈은 date(날짜), time(시간)과 관련된 모듈로, 날짜 형식을 만들 때 자주 사용되는 코드들로 구성되어 있다.

(참고, 외우지x, 필요할 때 검색할 정도)

timedelta() 함수를 사용하면 특정한 시간의 이전 또는 이후를 구할 수 있다.

다만 timedelta()함수는 1년 후, 2년 후 등으이 몇 눈 후를 구하는 기능이 없다.

그래서 1년 후를 구할 떄는 replace()함수르 사용해 아예 날짜 값을 교체하는 것이 일반적이다.

 

time 모듈

시간과 관련된 기능을 다룰 때는 time 모듈을 사용한다. time 모듈로도 날짜와 관련된 처리를 할 수 있지만, 그런 처리는 datetime 모듈을 사용하는 경우가 더 많다.

 

time 모듈은 4장에서 살펴보았던 것처럼 유닉스 타임(1970년 1월 1시 0시 0분 0초를 기준으로 계산한 시간 단위)을 구할 때, 특정 시간 동안 코드 진행을 정지할 때 많이 사용한다. 

import time

(오른쪽 사진 , 암기추천) =>코드를 실행함녀 "지금부터 5초 동안 정지합니다!"를 출력하고 5초 동안 정지한다. 그리고 5초 후에 "프로그램을 종료합니다."를 출력한다.

매우 자주 사용하는 기능인데다가 어렵지 않으므로 외워두면 좋다. 

 

urllib 모듈

urllib 모듈은 'URL을 다루는 라이브러리'라는 의미이다. 이때 URL이란 'Uniform Resource Locator'를 의미하는 말로, 어렵게 표현하면 네트워크의 자원Resource이 어디에 위치Locate하는지 확인할 때 사용하는 것이다.

 

간단하게는 '웹 브라우저의 주소창에 입력하는 주소'라고 이해하면 된다. 즉, urllib 모듈은 인터넷 주소를 활용할 때 사용하는 라이브러리이다.

일단 from urllib import request를 사용해 urllib 모듈에 있는 request를 가져온다. 이때 request도 모듈이라 이후의 코드에서 request 모듈 내부에 있는 urlopen()함수를 request, uropen()형태로 사용했다.

 

urlopen()함수는 URL 주소의 페이지를 열어주는 함수이다.

구글의 메인 페이지 주소를 넣어 보았는데, 이렇게 입력력하면 웹 브라우저에 'https://google.com'를 입력해서 접속하는 것처럼 파이썬이 'https://google.com'에 들어가 준다.

 

이어서 read()함수를 호출하면 해당 웹 페이지에 있는 내용을 읽어서 가져온다.

실행결과를 보면 문자열처럼 보이지만, 앞에 'b'라는 글자가 붙어 있다. 이는 바이너리 데이터binary data를 의미한다.

 

지금까지여러 보듈을 사용하면서 import 구문을 활용했다. 이번 장에서 중요한 것은 모듈의 함수를 암기하는 것이 아니라, 모듈은 이런 형태와 종류를 눈도장이랃 찍어 두는 것이 좋다.

다만 import, from, as 키워드를 사용하는 방법을 확실하게 기억해 주자.

 

확인문제 3 

os모듈의  os.listdir()함수와 os.path.isdir()함수를 사용하면 특정 디렉터리를 읽어 파일 디렉터리인지를 확인해보자.

+ 실행하는 위치에 따라서 출력 결과가 달라진다.

 

그리고 이를 활용해서 '폴더라면 또 탐색하기'라는 재귀 구성으로 현재 폴더 내부에 있는 모든 파일을 탐색하도록 코드를 작성하기(下 右 code ↘️)


07-2 외부 모듈

외부모듈 종류 : 사이킷-런scikit-learn, 텐서플로우Tensorflow, 장고Django, 플라스크Flask, 넘파이NumPy  etc...

 

모듈 설치하기

외부모듈은 [window + R 키]를 눌러 프로그램 실행창을 띄우고 [cmd]를 입력하면 나타나는 명령 프롬프트 창에서 실행해야 한다.

pip install 모듈 이름

pip은 정말 많은 기능을 가지고 있다. 특정 버전의 모듈을 설치하거나 설치한 모듈을 제거하는 기능 등을 모두 지원하는데, 이와 관련된 내용은 pip문서를 참고한다.

 pip은 많은 기능을 가지고 있다. 특정 버전의 모듈을 설치하거나 설치한 모듈을 제거하는 기능 등을 모두 지원하는데, 이와 관련된 내용은 pip문서를 참고하도록 한다.(아래주소)

https://pip.pypa.io/en/stable/user_guide/#installing-packages

 

 

모듈 찾아보기

BeautifulSoup 모듈
두 BeautifulSooup은 유명한 파이썬의 웹 페이지 분석 모듈이다. 책을 사서 사용 방법을 알아보는 방법도 있지만, 만약 책 없이 살펴보고 싶으면 해당 모듈의 공식 홈페이지를 참고하면 된다.

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

 

Beautiful Soup Documentation — Beautiful Soup 4.12.0 documentation

Beautiful Soup Documentation Beautiful Soup is a Python library for pulling data out of HTML and XML files. It works with your favorite parser to provide idiomatic ways of navigating, searching, and modifying the parse tree. It commonly saves programmers h

www.crummy.com

그럼 BeautifulSoup을 사용해서 기상청의 날씨 정보를 가져와 추출해보자

 

(아래주소) 기상청의 전국 날씨 정보

https://devweather.kma.go.kr/weather/lifenindustry/sevice_rss.jsp

 

RSS > 인터넷 > 서비스 > 생활과 산업 > 날씨

홈 > 생활과 산업 > 서비스 > 인터넷 > RSS |날씨|생활과 산업|서비스|인터넷|RSS

devweather.kma.go.kr

bs4 모듈의 BeautifulSoup 함수의 매개변수로 HTML 문자열과 "html.parser"라는 문자열을 넣으면 BeautifulSoup이라는 특수한 객체를 리턴한다.

이를 기반으로 태그를 여러 개 선택할 때는 select()함수, 하나만 선택할 때는 select_one()함수를 사용해서 원하는 값을 추출한다. (오른쪽사진) 현재 기상청의 XML파일을 확인하면 위와 같다.

 

이를 기반으로 (아래의 코드)태그를 여러 개 선택할 때는 select()함수, 하나만 선택할 때는 select_one()함수를 사용해서 원하는 값을 추출한다.

여기에서 지역이 표기된 location을 찾고, location 내부에 있는 city, wf, tmn, tmx태그의 내용을 추출한다. 

코드를 실행하면 (아래 왼쪽)과 같이 출력된다.          - - - 이러한 형태로 웹 페이지의 정보를 수집할 수 있다.

BeautifulSoup을 사용해 웹 페이지를 분석한 결과

+ 지금까지 파이썬 프로그래밍을 하면서 단 한 번도 알파벳 대문자를 사용하지 않았는데, 위의 코드에서는 BeautifulSoup에 대문자를 사용했다. 이것이 만약 함수라면 'beautiful soup'이라는 단어를 합쳐서 beautiful_soup()이라는 형태로 사용했을 것이다. 그런데 각 단어의 앞글자를 대문자로 만들고 이를 합쳐서 BeautifulSoup()과 같은 형태로 사용했다.

 

왜 그랬을? 이는 BeautifulSoup()이 단순한 함수가 아니라 클래스의 생성자이기 때문이다.  관련 내용은 8장클래스에서배우도록 하자.

 

++ BeautifulSoup과 관련된 자세한 내용이 궁금하다면 스크레이핑 관련 책을 읽으면 좋다.

 

Flask 모듈

일반적으로 파이썬으로 웹 개발을 할 때는 Django(장고) 또는 Flask(플라스크) 등의 모듈을 사용한다.

Django는 매우 다양한 기능을 제공하는 웹 개발 프레임워크이고,

Flask는 작은 기능만을 제공하는 웹 개발 프레임워크이다.

 

Flask 모듈 설치  - cmd창

pip install flask

아래는 Flask 모듈의 공식홈페이지

https://flask.palletsprojects.com/en/2.3.x/

 

Welcome to Flask — Flask Documentation (2.3.x)

 

flask.palletsprojects.com

ㄴ📝책이랑 다르게 cmd 창 열어서 실행하지 않고 바로 app.run()으로 실행시켰음

참고사이트) https://m.blog.naver.com/21ahn/221830372908

 

@app.route()라고 되어 있느 부분은 데코레이터decorator라고 부른다, 이와 관련된 내용은 책p345d <좀 더 알아보기: 함수 데코레이터>에서 살펴볼 수 있다.

 

Flask는 코드를 실행하는 방법이 약간 특이한데, 아래와 같이 두 줄을 명령 창 또는 Powershell에 입력해서 실행한다. (윈도우기준)

set FLASK_APP=파일이름.py
flask run

이러한 형태로 모듈과 모듈을 결합하면서 원하는 프로그램을 만들어 나간다. pip 명령어로 설치할 수 있는 외부 모듈은 정말 많으니 이 책을 끝낸 후에 기계 학습, 웹 개발, 인공지능(머신러닝/딥러닝), IoT 개발 등을 진행한다며 모듈들을 더 알아 나가는 과정의 연속이 될 것이다.

 

라이브러리와 프레임워크

모듈을 살펴보면 라이브러리library와 프레임워크framework라는 말을 많이 듣게 된다.

최근에는 큰 구분 없이 사용하는데, 그랟 확실하게 구분하자면 제어 역전IoC:Inversion of Control 여부에 따라서 달라진다.

구분 설명
라이브러리(library) 정상적인 제어를 하는 모듈
프레임워크(framework) 제어 역전이 발생하는 모듈

 

 

 

 라이브러리

제어 역전이란 수비게 말해 제어가 역전되어 있다는 뜻이다.

따라서 '역전되지 않은 정상적인 제어'가 무엇인지 알아야 제어 역전을 이해할 수 있을 것이다.

지금까지 사용했던 모듈들을 생각해보자.

 

math 모듈은 모듈 내부의 기능 '개발자'가 직접 호출했다.

이처럼 개발자가 모듈의 기능을 호출하는 형태의 모듈을 라이브러리library라고 한다.

 

 

 

 

 

 

 프레임워크

아래의 코드를 보면 내부에 함수만 정의했지 직접적으로 무언가 진행하는 코드는 단 하나도 없다.

 

Flask 모듈이 제공하는 명령어를 실행하게 된다.

이처럼 모듈이 개발자가 작성한 코드를 실행하는 형태의 모듈을 프레임워크framework라고 부른다.

 

개발자가 모듈의 함수를 호출하는 것이 일반적인 제어 흐름이다. 그런데 이와 반대로 개발자가 만든 함수를 모듈이 실행하는 것은 제어가 역전된 것이다. 이것이 바로 제어 역전IoC:Inverse of Control이다.

 

이러한 제어 역전의 여부로 라이브러리와 프레임워크를 구분한다.

 

 

좀 더 알아보기) 함수 데코레이터

파이썬에는 데코레이터decorator라는 기능이 있다. 

@app.route()형태의 코드처럼 @로 시작하는 구문을 파이썬에서는 '데코레이터'라고 부른다.

데코레이터는 '꾸며 주는 것'이라는 의미인데, 프로그래밍에서 무엇을 꾸민다는 것일까?

 

데코레이터는 만드는 방법에 따라 크게 ①함수 데코레이터 클래스 데코레이터로 나눌 수 있다.

 

여기서는 함수 데코레이터를 살펴보도록 하자.

 

● 함수 데코레이터의 기본

함수 데코레이터는 함수에 사용되는 데코레이터이다. 이 말은 대상 함수의 앞뒤에 꾸밀 부가적인 내용을, 혹은 반복할 내용 데코레이터로 정의해서 손쉽게 사용할 수 있도로 한 것을 말한다. 

test()함수에서 wrapper()함수를 리턴하므로, 최종적으로 hello에 함수가 들어가 hello()형태로 호출할 수 있다.

 

간단한 내용을 굳이 왜 이렇게 복잡하게 작성하냐고 할 수 있겠지만, 데코레이터를 사용하면 functools라는 모듈을 사용할 수 이고, 함수 데코레이터를 사용할 때 매개변수 등을 전달할 수 이어 반복되는 구문이 많아질 때 소스의 가독성도 높이고 매우 유용하게 사용할 수 있다.

 

확인문제2 분아별 사용되는 모듈 정리

07-3 모듈 만들기 

파이썬은 모듈을 만드는 방법이 간단하다. 단순하게 파이썬 파일을 만들고, 이를 외부에서 읽어 들이면 모듈이 된다.

오히려 너무 간단하고 유연해서 모듈을 코드로 인식하고 실행해 버리는 문제가 발생할 수 있다. 그래서 파이썬은 이를 막기 위해 다양한 대처 방법도 제공해준다. 또한 모듈을 구조화해서 거대한 모듈(패키지)을 만드는 기능도 제공해 준다.

 

이번 절에서는 모듈을 만드는 방법, 모듈실행과 관련된 안전 장치를 설치하는 방법, 패키지를 만드는 방법에 대해서 알아보자.

 

먼저 module_basic 디렉터리를 만들어 다음 두 파일을 넣자. main.py가 메인 코드로 활용할 부분이다.

 

모듈 만들기

복잡하고 구조화된 모듈을 만들 때는 패키지package라는 기능을 사용한다.

 

_ _name_ _ =="_ _main_ _"

다른 사람들이 만든 파이썬 코드들을 보다 보면 _ _name_ _ =="_ _main_ _"이라는 코드를 많이 볼 수 있다.

이 의미가 무엇인지 자세하게 알아보자.

 _ _name_ _

파이썬 코드 내부에서는 _ _ name_ _이라는 변수를 사용할 수 있다. _ _ name_ _이라는 변수에 어떤 값이 들어있는지 확인해보자.

 

 프로그래밍 언어에서는 플그램의 진입점을 '엔트리 포인트 entry point' 또는 '메인 main'이라고 부른다.

그리고 이러한 엔트리 포인트 또는 메인 내부에서의 _ _name_ _ 은 "_ _ main_ _"이다.

 

 모듈의_ _name_ _

엔트리 포인트가 아니지만 엔트리 포인트 파일 내에서 import 되어씩 떄무넹 모듈 내 코드가 실행된다, 모듈 내부에서 _ _name_ _을 출력하면 모듈의 이름이 나타낸다.

 _ _name_ _활용하기

엔트리 포인트 파일 내부에서는 _ _name_ _이 "_ _main_ _"이라는 값을 갖는다. 이를 활용하면 현재 파일이 모듈로 실행되는지, 엔트리 포인트로 실행되는지 확인할 수 있다.

패키지

이 책에서는 쉬운 이해를 위해 import로 가져오는 모든 것을 모듈module이라고 설명했다. 그런데 원래 pip은 Python Package Index의 줄임말로 패키지 관리 시스템 Package Manage System이다.

그럼 패키지와 모듈은 무엇이 다른 걸까? 모듈이 모여 구조를 이루면 패키지package라고 부른다.

 

 패키지 만들기

 _ _int_ _.py 파일 (위와 비교하며 공부하기. )

패키지를 읽을 때 어떤 처리르 수행해야 하거나 패키지 내부의 모듈들을 한꺼번에 가져오고 싶을 때가 있다. 이럴 때는 패키지 폴더 내부에 _ _ init_ _ .py파일을 만들어 사용한다.

 

좀 더 알아보기1) 텍스트 데이터

파이썬은 크게 텍스트 데이터text data와 바이너리 데이터binary data로 구분된다.

 

텍스트 데이터text data : 는 이전 05 - 3 <파일 처리>에서 '텍스트 읽기'와 '텍스트 쓰기'에 대해서 배웠는데, 여기서는 '텍스트 데이터'가 무엇인지 조금 더 자세하게 살펴보자.

 

컴퓨터는 내부적으로 모든 처리르 0과 1로 이루어진 이진 숫자binary로 수행한다. 따라서 원래 컴퓨터 내부에 있는 모든 것들은 이진 숫자 구성되어 있다.

 

(책 직접 보는 것이 좋음)

  • 이진 데이터
  • 이진 테이터를 10진수롤 표기한 형태

전부 24개의 숫자로 이루어져 있다. 각각의 숫자는 알파벳에 대응된다. 이렇나 숫자와 알파벳을 대응하는 방법을 인코딩incoding방식이라고 부른다. 다양한 인코딩 방식이 있는데, 지금 살펴보고 있는 예는 가장 기본적인 ASCII 인코딩 방식이다.

.....(중략)

우릭가 쉽게 읽을 수 있는 형태의 데이터를 '텍스트 데이터'라고 부른다. 텍스트 데이터는 쉽게 읽을 수 있는 것은 물론이고, 텍스트 에디터마 있으면 쉽게 편집할 수도 있다. 우리가 입력해 왔던 모든 코드 역시 텍스트 데이터이다.

 

좀 더 알아보기2) 바이너리 데이터

즉, 텍스트 데이터로 표현할 경우 의미를 알 수 없는 데이터가 되어 버린다. 컴퓨터에서는 이처럼 테긋트 에디터로 열었을 때 의미를 이해할 수 없는 데이터를 바이너리 데이터binary data라고 부른다.

 

바이너리 데이터의 대표적인 예는 이미지와 동영상이다. (텍스트 데이터로 표현할 수 없음)

 

 

                  텍스트 데이터와 바이너리 데이터 비교 
비교 항목 텍스트 데이터 바이너리 데이터
구분 방법 · 텍스트 에디터로 열었을 때 읽을 수 있다. · 텍스트 에디터로 열어도 읽을 수 없다.
장점 · 사람이 쉽게 읽을 수 있다.
· 텍스트 에디터로 쉽게 편집할 수 있다.
· 용량이 적다
단점 · 용량이 크다 · 사람이 쉽게 읽을 수 없다.
· 일반적으로 텍스트 에디터로 편집할 수 없다.

 

 인코딩과 디코딩

텍스트 데이터, 바이너리 데이터도 2진수의 집합일 뿐이다. 텍스트 데이터를 맞춰서 우리가 읽기 쉬운 글자로 보여 주려면, 그리고 바이너리 데이터를 읽어서 이미지로 보여 주려면 변환을 해야 한다. 이를 인코딩incoding방식이라고 부른다. 인코딩 방식에는 수많은 방법이 존재한다.

  • 텍스트 데이터의 경우 ASCII, UTF-8, UTF-16, EUC-KR, Shift-JIS 등이 있다.
  • 바이너리 데이터의 경우에는 이미지만 해도 JPEG, PNG, GIF 등이 있다.

인코딩 방식을 기반으로 A라는 형식을 B라는 형식으로 변환하는 것을 인코딩encoding이라고 부르고, 이렇게 인코딩된 데이터를 반대로 돌리는 것을 디코딩decoding이라고 부른다.