■ 외장함수
외장함수는 라이브러리 함수로, import해서 쓰는 함수를 말한다.
■ 표준 라이브러리
(1) datetime.date
datetime.date는 연, 월, 일로 날짜를 표현할 때 사용하는 함수이다.
(1) 날짜 차이 계산
>>> import datetime
>>> day1 = datetime.date(2021, 12, 14)
>>> day2 = datetime.date(2023, 4, 5)
>>> diff = day2 - day1
>>> print(diff)
477 days, 0:00:00
(2) 요일 구하기 (0:월, 1:화 ...., 6:일)
>>> import datetime
>>> day1 = datetime.date(2021, 12, 14)
>>> day2 = datetime.date(2023, 4, 5)
>>> print(day1.weekday())
>>> print(day2.weekday())
1
2
(2) time
(1) time.time (UTC를 사용해 현재 시간을 실수 형태로 리턴, 1970년 1월 1일 0:0:0을 기준으로 지난 시간을 초 단위로 리턴)
>>> import time
>>> print(time.time())
1691392290.7660508
(2) time.localtime (time.time()이 리턴한 실숫값을 사용해 연,월,일,시,분,초 의 형태로 바꾸어 주는 함수)
>>> import time
>>> print(time.localtime())
time.struct_time(tm_year=2023, tm_mon=8, tm_mday=7, tm_hour=16, tm_min=13, tm_sec=41, tm_wday=0, tm_yday=219, tm_isdst=0)
(3) time.asctime (time.localtime이 리턴된 튜플 형태 값을 받아 알아보기 쉬운 형태로 리턴)
>>> import time
>>> print(time.asctime())
Mon Aug 7 16:15:31 2023
(4) time.ctime (time.asctime과 거의 비슷 but 항상 현재 시간 만을 리턴)
>>> import time
>>> print(time.ctime())
Mon Aug 7 16:16:22 2023
(5) time.strftime (시간에 관계된 것을 세밀하게 표현하는 여러 가지 포멧 코드 제공)
>>> import time
>>> time.strftime('%x', time.localtime(time.time()))
08/07/23
(6) time.sleep (주로 루프 안에서 사용, 일정한 시간 간격을 두고 루프를 실행 할 수 있음)
>>> import time
>>> for i in range(10):
print(i)
time.sleep(1)
0
1
2
...
9 (1초 간격으로 숫자가 출력)
(3) math.gcd
math.gcd 함수를 이용하면 최대 공약수를 쉽게 구할 수 있음
>>> import math
>>> print(math.gcd(60, 100, 80))
20
(4) math.lcm
math.lcm은 최소 공배수를 쉽게 구할 수 있음
>>> import math
>>> print(math.lcm(15, 25))
75
(5) random
random은 난수(규칙이 없는 임의의 수)를 발생시키는 모듈이다.
(1) 0.0~1.0 사이 실수 중 난수 값을 리턴
>>> import random
>>> print(random.random())
0.7864705046998923
(2) 1~10 사이 정수 중 난수 값을 리턴
>>> import random
>>> print(random.randint(1,10))
2
(6) itertools.zip_longest
itertools.zip_longest 함수는 같은 개수의 자료형을 묶는 자료형을 묶는 파이썬 내장 함수인 zip 함수와 똑같이 작동한다. 하지만 zip은 대응하는 요소 개수가 다르면 대응하는 요소까지만 출력이 된다. itertools를 사용하면 대응하는 요소까지는 대응시키고 나머지는 fillvalue를 사용해 어떤 값을 출력시켜줄 수 있다.
(1) zip 사용
>>> students = ['park', 'kim', 'lee', 'choi', 'lim']
>>> snacks = ['candy', 'choco', 'jelly']
>>> result = zip(students, snacks)
>>> print(list(result))
[('park', 'candy'),('kim', 'choco'),('lee', 'jelly')]
(2) itertools.zip_longest 사용
>>> import itertools
>>> students = ['park', 'kim', 'lee', 'choi', 'lim']
>>> snacks = ['candy', 'choco', 'jelly']
>>> result = itertools.zip_longest(students, snacks, fillvalue='beer')
>>> print(list(result))
[('park', 'candy'), ('kim', 'choco'), ('lee', 'jelly'), ('choi', 'beer'), ('lim', 'beer')]
(7) itertools.permutation / itertools.combination
itertools.permutation은 반복 가능 객체 중에서 r개를 선택한 순열을 이터레이터로 리턴하는 함수이다.
1, 2, 3 숫자 중 2개를 선택해 만들 수 있는 숫자의 경우의 수는 6가지이다.(순서에 상관없는 경우는 3가지이다.) 이걸 파이썬으로 구현할 수 있다.
- permutation
>>> import itertools
>>> print(list(itertools.permutations(['1','2','3'], 2)))
[('1', '2'), ('1', '3'), ('2', '1'), ('2', '3'), ('3', '1'), ('3', '2')]
- combination
>>> import itertools
>>> list(itertools.combinations(['1', '2', '3'], 2))
[('1', '2'), ('1', '3'), ('2', '3')]
(8) functools.reduce
functools.reduce은 함수를 반복 가능한 객체의 요소에 차례대로 누적 적용해 이 객체를 하나의 값으로 줄이는 함수이다.
- 입력 인수 add의 요소를 모두 더하여 리턴한 add 함수 사용
>>> def add(data):
result = 0
for i in data:
result += i
return result
>>> data = [1,2,3,4,5]
>>> result = add(data)
>>> print(result)
15
- functools.reduce()를 사용해 add와 마찬가지로 동작하는 코드
>>> import functools
>>> data = [1,2,3,4,5]
>>> result = functools.reduce(lambda x, y : x + y, data)
>>> print(result)
15
(9) operator.itemgetter
operator.itemgetter는 주로 sorted와 같은 함수의 key 매개변수에 적용해 다양한 기준으로 정렬할 수 있도록 도와주는 모듈이다.
- 기존의 데이터
>>> students = [
("kim", 22, 'A'),
("lee", 32, 'B'),
("park", 17, 'B')
]
- 나이 순으로 정렬
>>> from operator import itemgetter
>>> students = [
("kim", 22, 'A'),
("lee", 32, 'B'),
("park", 17, 'B')
]
>>> result = sorted(students, key=itemgetter(1))
>>> print(result)
[('park', 17, 'B'), ('kim', 22, 'A'), ('lee', 32, 'B')]
(10) shutil
shutil은 파일을 복사하거나 이동할 때 사용하는 모듈이다.
- 작업 중인 파일을 자동으로 백업
>>> import shutil
>>> shutil.copy("C:/doit/a.txt", "C:/temp/a.txt.bak")
(11) glob
glob 모듈은 디렉터리 안의 파일들을 읽어서 리턴한다. 특정 디렉터리 안에 있는 파일 중 공통된 이름의 파일들을 찾을 수 있다.
>>> import glob
>>> glob.glob("C:/doit/mark*")
['c:/doit\\marks1.py', 'c:/doit\\marks2.py', 'c:/doit\\marks3.py']
(12) pickle
pickle은 객체의 형태를 그대로 유지하면서 파일에 저장하고 불러올 수 있게 하는 모듈이다.
- pickle 모듈의 dump 함수를 사용해 딕셔너리 객체인 data를 그대로 파일에 저장
>>> import pickle
>>> f = open("test.txt", 'wb')
>>> data = {1: 'python', 2: 'you need'}
>>> pickle.dump(data, f)
>>> f.close()
- pickle.dump로 저장한 파일을 pickle.load를 사용해 기존의 딕셔너리 객체(data) 상태 그대로 불러오는 방법
>>> import pickle
>>> f = open("test.txt", 'rb')
>>> data = pickle.load(f)
>>> print(data)
{2:'you need', 1:'python'}
(13) OS
OS모듈은 환경변수나 디렉터리, 파일 등의 OS 자원을 제어할 수 있게 하는 모듈이다.
(1) os.environ - 내 시스템의 환경 변숫값을 알고 싶을때
>>> import os
>>> os.environ
environ({'PROGRAMFILES': 'C:\\Program Files', 'APPDATA': … 생략 …})
(2) os.chdir - 디렉터리 위치 변경
>>> os.chdir("C:\WINDOWS")
(3) os.getcwd - 디렉터리 위치 돌려받기
>>> os.getcwd()
'C:\WINDOWS'
(4) os.system - 시스템 명령어 호출
>>> os.system("dir")
(5) os.popen - 실행한 시스템 명령어 결괏값 돌려받기
>>> f = os.popen("dir")
(14) zipfile
zipfile은 여러 개의 파일을 zip 형식으로 합치거나 이를 해제할 때 사용하는 모듈이다. ZipFile 객체의 write() 함수로 개별 파일을 추가할 수 있고 extreactall() 함수를 사용하면 된다.
>>> import zipfile
# 파일 합치기
>>> with zipfile.ZipFile('mytext.zip', 'w') as myzip:
myzip.write('a.txt')
myzip.write('b.txt')
myzip.write('c.txt')
# 해제하기
>>> with zipfile.ZipFile('mytext.zip') as myzip:
myzip.extractall()
(15) threading
컴퓨터에서 동작하고 있는 프로그램을 프로세스(process)라고 한다. 보통 1개의 프로세스는 1가지 일만 수행하지만, 스레드(thread)를 사용하면 한 프로세스 안에서 2가지 또는 그 이상의 일을 동시에 수행할 수 있다.
- "long_task" 함수 총 5번 반복하는 프로그램
>>> import time
>>> def long_task(): # 5초의 시간이 걸리는 함수
for i in range(5):
time.sleep(1) # 1초간 대기한다.
print("working:%s\n" % i)
>>> print("Start")
>>> for i in range(5): # long_task를 5회 수행한다.
long_task()
>>> print("End")
- "long_task" 함수 동시에 작업하는 프로그램 (but 프로그램 실행 시 "Start"와 "End"가 먼저 출력되고 그 이후 스레드의 결과가 출력됨. 그리고 프로그램이 정상 종료되지 않음)
>>> import time
>>> import threading # 스레드를 생성하기 위해서는 threading 모듈이 필요하다.
>>> def long_task():
for i in range(5):
time.sleep(1)
print("working:%s\n" % i)
>>> print("Start")
>>> threads = []
>>> for i in range(5):
t = threading.Thread(target=long_task) # 스레드를 생성한다.
threads.append(t)
>>> for t in threads:
t.start() # 스레드를 실행한다.
>>> print("End").
- "Start"가 출력되고 그 다음 스레드의 결과가 출력된 후 마지막으로 "End"가 출력되는 경우
>>> import time
>>> import threading
>>> def long_task():
for i in range(5):
time.sleep(1)
print("working:%s\n" % i)
>>> print("Start")
>>> threads = []
>>> for i in range(5):
t = threading.Thread(target=long_task)
threads.append(t)
>>> for t in threads:
t.start()
>>> for t in threads:
t.join() # join으로 스레드가 종료될때까지 기다린다.
>>> print("End")
위 소스코드에 나와있는 long_task는 수행하는 데 5초의 시간이 걸리는 함수이다. 위 프로그램은 이 함수를 총 5번 반복해서 수행하는 프로그램이다. 이 프로그램은 5초가 5번 반복되므로 총 25초의 시간이 걸린다. 하지만 스레드를 사용하면 5초의 시간이 걸리는 long_task 함수를 동시에 실행할 수 있으므로 시간을 줄일 수 있다.
(16) tempfile
파일을 임시로 만들어서 사용할 때 유용한 모듈이다. tempfile.mkstemp()는 중복되지 않는 임시 파일의 이름을 무작위로 만들어서 리턴한다.
>>> import tempfile
>>> filename = tempfile.mkstemp()
>>> filename
'C:\WINDOWS\TEMP\~-275151-0'
- tempfile.TemporaryFile()은 임시저장공간으로 사용할 파일 객체를 리턴한다. f.close()가 호출되면 이 파일은 자동으로 삭제된다.
>>> import tempfile
>>> f = tempfile.TemporaryFile()
>>> f.close()
(17) traceback
traceback은 프로그램 실행 중 발생한 오류를 추적하고자 할 때 사용하는 모듈이다.
>>> def a():
return 1/0
>>> def b():
a()
>>> def main():
try:
b()
except:
print("Error!")
>>> main()
Error!
위 소스코드는 main() 함수가 시작되면 b() 함수가 시작되고, b()함수로 인해 a()함수가 작동되는데, 0으로 나누는 error가 발생했으므로 except 뒤의 print("Error!")에 의해 "Error!" 가 출력된다.
이러한 경우 이 코드에서 오류가 발생한 위치와 원인을 정확히 판단할 수 있도록 코드를 업그레이드하려면 traceback을 사용하면된다. 그럼 출력값으로 오류 추척을 통해 main() 함수에서 b()함수를 호출하고 b()함수에서 다시 a()함수를 호출하여 1/0을 실행하려 하므로 0으로 나눌수 없다는 ZeroDivisionError가 발생했다는 것을 로그를 통해 정확하게 확인할 수 있다.
>>> import traceback
>>> def a():
return 1/0
>>> def b():
a()
>>> def main():
try:
b()
except:
print("Error!")
print(traceback.format_exc())
>>> main()
Error!
Traceback (most recent call last):
File "c:\Users\seonb\OneDrive\바탕 화면\박준수\파이썬\hello.py", line 11, in main
b()
File "c:\Users\seonb\OneDrive\바탕 화면\박준수\파이썬\hello.py", line 7, in b
a()
File "c:\Users\seonb\OneDrive\바탕 화면\박준수\파이썬\hello.py", line 4, in a
return 1/0
~^~
ZeroDivisionError: division by zero
(18) json
json은 JSON 데이터를 쉽게 처리하고자 사용하는 모듈이다.
위 사진처럼 "myinfo.json"이라는 파일이 있다고 가정하자. 이 파일을 읽어 파이썬에서 처리할 수 있도록 딕셔너리 자료형으로 만드는 방법은(JSON 파일을 읽어 딕셔너리로 변환하려면) json 모듈을 사용하면 된다.
>>> import json
>>> with open('myinfo.json') as f:
data = json.load(f)
>>> print(type(data))
>>> print(data)
<class 'dict'>
{'name': 'park', 'birth': '1010', 'age': 26}
(19) urllib
urllib은 URL을 읽고 분석할 때 사용하는 모듈이다.
>>> import urllib.request
>>> def get_wikidocs(page):
resource = 'https://wikidocs.net/{}'.format(page)
with urllib.request.urlopen(resource) as s:
with open('wikidocs_%s.html' % page, 'wb') as f:
f.write(s.read())
(20) webbrowser
webbrowser는 파이썬에서 시스템 브라우저를 호출할 때 사용하는 모듈이다.
>>> import webbrowser
>>> webbrowser.open_new('https://python.org')
■ 외부 라이브러리
파이썬 설치 시 기본으로 설치되는 라이브러리를 '파이썬 표준 라이브러리'라고 한다. 외부 라이브러리를 사용하려면 먼저 pip 도구를 이용해 설치해야 한다.
● pip
PyPI(python package index)는 파이썬 소프트웨어가 모인 저장공간이다. 이곳에는 10만 건 이상의 파이썬 패키지가 등록되어 있으며 이곳에 등록된 파이썬 패키지는 누구나 내려받아 사용할 수 있다.
- 패키지 설치
>>> pip install SomePackage(특정패키지)
- 패키지 삭제
>>> pip uninstall SomePackage
- 특정 버전 설치
>>> pip install SomePackage==1.0.4
- 최신 버전 업그레이드
>>> >>> pip install --upgrade SomePackage
- 설치된 패키지 확인
>>> pip list
'Python > 파이썬 기초' 카테고리의 다른 글
[5-5] 내장함수 (0) | 2024.12.21 |
---|---|
[5-4] 예외 처리 (0) | 2024.12.21 |
[5-3] 패키지 (0) | 2024.06.30 |
[5-2] 모듈 (0) | 2024.06.30 |
[5-1] 클래스 (0) | 2024.06.30 |