Python Modules - การอิมพอร์ต
Contents
Python Modules - การอิมพอร์ต#
10 minutes
วัตถุประสงค์
หลังจากทำทำแล็บ นศ.จะสามารถ
นำเข้าโมดูลด้วยรูปแบบต่างๆ ได้
Ref:
การ Import Module#
โดยทั่วไป การเขียนโปรแกรมที่สามารถนำใช้ประโยชน์ได้อย่างจริงจัง โปรแกรมจะมีขนาดใหญ่โดยอัตโนมัติ ดังนั้นจึงมีความจำเป็นต้องแยกโปรแกรมออกเป็นส่วนๆ (หลายๆ ไฟล์) เพื่อให้สามารถจัดการ แก้ไขโปรแกรม จนถึงพัฒนาต่อยอดโปรแกรม ทำได้ง่ายขึ้น
ในทางปฏิบัติเราจะแยกออกโปรแกรมแต่ละส่วนๆ ออกเป็นไฟล์ (Extension .py
) ซึ่งแต่ละไฟล์จะเรียกว่า โมดูล (module) เมื่อโปรแกรมถูกแยกออกมาเป็นโมดูลแล้ว โปรแกรมหลัก (Main program) ก็จะต้องนำเข้าข้อมูลหรือออบเจ็กต์ (ซึ่งรวมถึง คำสั่ง คลาส ฟังก์ชัน หรือตัวแปรต่างๆ) ที่อยู่ภายในไฟล์ของโมดูลนั้นๆ เข้ามาด้วยคำสั่ง import
ในภาษาไพธอน เราใช้คำสั่ง import นำเข้ามูลหรือออบเจ็กต์ที่อยู่ภายในโมดูลเข้ามายังโปรแกรม
import <module_name>
ยกตัวอย่างเช่น โมดูล math
ที่มีฟังก์ชันและค่าคงที่ทางคณิตศาตร์ที่พร้อมที่จะถูกใช้งานอยู่ หากต้องการใช้งานออบเจ็กต์ (ฟังก์ชัน) ต่างๆ ในโมดูล math
ก็ต้องอิมพอร์ตเข้ามาในโปรแกรมด้วยคำสั่ง import
หลังจากนั้นก็จะสามารถเรียกใช้ออบเจ็กต์ (ฟังก์ชัน) ในรูปแบบ math.function_name
math.object_name
ได้
(ในการอิมพอร์ตโมดูลเข้ามาในโปรแกรมนั้น Python (interpreter) จะทำการค้นหาโมดูลภายที่มีชื่อดังกล่าวใน Built-in module ก่อนเป็นอันดับแรก ถ้าไม่พบ จะทำการค้นหาไฟล์ module_name.py ในลิสต์ Directory ที่ถูกกำหนดโดยตัวแปร sys.path (ตัวแปร Path เก็บเส้นทางไดเร็กทอรีในรูปแบบของรายการสตริง) โดยจะเริ่มค้นหาใน Directory ที่กำลังใช้งานอยู่ในขณะนั้น และใน Directory ที่กำหนดในตัวแปร PYTHONPATH (Environment variable) ตามลำดับ (https://docs.python.org/3/tutorial/modules.html#the-module-search-path))
# sys.path เป็นตัวแปร Path เก็บเส้นทางไดเร็กทอรี (Directory) ในรูปแบบของลิสต์ของสตริง (List of String)
import sys
print(sys.path)
['/Users/tube.sc/Data_KMITL/Courses_onMac/2021_Python/PyHTML_v02(No_HW)_4std', '/Users/tube.sc/.pyenv/versions/3.8.13/lib/python38.zip', '/Users/tube.sc/.pyenv/versions/3.8.13/lib/python3.8', '/Users/tube.sc/.pyenv/versions/3.8.13/lib/python3.8/lib-dynload', '', '/Users/tube.sc/.pyenv/versions/3.8.13/lib/python3.8/site-packages']
☀︎โมดูล (Module) หรือ แพคเกจ (Package) หรือ ไลบรารี่ (Library) เปรียบเสมือนโปรแกรมสำเร็จรูป (อาจจะมีแค่หนึ่งไฟล์หรือสิบไฟล์หรือมากถึงร้อยไฟล์ก็ได้) ไว้เก็บฟังก์ชัน คลาส ตัวแปรและค่าพิเศษต่างๆ เฉพาะทางไว้
โมดูลของไพธอนมีทั้งที่ถูกพัฒนาโดยผู้พัฒนาหลัก (Core Developer) และผู้ใช้งานทั่วไป โดยจะถูกอัพโหลดขึ้นไปเก็บไว้ในเซอร์เวอร์ Python Package Index (เรียกย่อๆว่า “PyPI”; the official 3rd-party software repository!) หรือไม่ก็เซอร์เวอร์ของ Anaconda Cloud ประโยชน์ของโมดูล คือผู้ใช้งานไม่จำเป็นที่จะต้องสร้างโมดูล (ฟังก์ชันหรือคลาส) ขึ้นมาใหม่เองทั้งหมด แต่สามารถนำโมดูลที่ถูกพัฒนาไว้อยู่แล้วมาใช้งานได้เลย
โมดูลที่เป็น 3rd-party สามารถติดตั้ง (Install) ได้เองโดยใช้คำสั่งต่อไปนี้
pip install <module_name>
สำหรับคนที่ใช้ไพธอนของ Python.orgconda install <module_name>
สำหรับคนที่ใช้ไพธอนของ Anaconda
(ในการยกเลิกการติดตั้ง (Unininstall) ก็สามารถทำได้โดยใช้คำสั่ง uninstall
)
ตัวอย่างของโมดูลยอดนิยมที่ผู้เขียนไพธอนทั่วไปนิยมใช้ (แยกตามประเภทของการใช้งาน) มีดังต่อไปนี้
การจัดการข้อมูลและวิเคราะห์ข้อมูล (รูปแบบตาราง) (Data Manipulation): Pandas
การดึงข้อมูลจาก web (Web Scraping): Requests, Selenium, Beautiful Soup, lxml
การคำนวณทางคณิตศาสตร์และสถิติ (Mathematics and Statistics): NumPy (คำนวน Vector และ Matrix), SciPy
การสร้างแบบจำลองทางคณิตศาตร์สำหรับเรียนรู้ของเครื่องจักร (Machine Learning Framework): Scikit-Learn
การสร้างแบบจำลองสำหรับการเรียนรู้เชิงลึก(Deep learning): TensorFlow, Keras (High-level interface of TensorFlow), PyTorch
การแสดงผลข้อมูล/พล็อตกราฟ (Data Visualization): Matplotlib, Seaborn, ggplot
การสร้าง GUI (Graphical User Interface/Front-ends/User interface): TKinter (TKinter + ttk), Streamlit (Web Application)
import math # import ก่อนเรียกใช้เสมอ
print(math.sqrt(2)) # sqrt ฟังก์ชัน square root
print(math.pi) # ค่าของ π
print(math.sin(math.pi/4)) # ฟังก์ชัน sin
print(math.cos(0)) # ฟังก์ชัน cos
1.4142135623730951
3.141592653589793
0.7071067811865475
1.0
หากต้องการอิมพอร์ตหลายๆ โมดูลให้อยู่ในบรรทัดเดียวก็สามารถทำได้โดยใช้เครื่องหมายคอมมา ,
คั่น เช่น
import math, sys
from
#
การใช้งานคำสั่ง import
จะเป็นการนำทั้งโมดูลเข้ามายังโปรแกรม และการใช้งานข้อมูล (ออบเจ็กต์, ฟังก์ชัน) ในโมดูลจะต้องนำหน้าด้วยชื่อของโมดูลเสมอ ในภาษา Python มีคำสั่ง from
import สำหรับนำข้อมูลบางส่วนภายในโมดูลเข้ามา และสามารถใช้งานฟังก์ชันหรือออบเจ็กต์ต่างๆได้โดยตรงโดยไม่ต้องมีชื่อของโมดูลนำหน้า มาดูตัวอย่างการใช้งานกัน
from <module_name> import <name(s)>
ยกตัวอย่างเช่น
from math import sqrt
print(sqrt(2)) # sqrt ฟังก์ชัน square root
from math import pi
print(pi) # ค่าของ π
from math import sin
print(sin(math.pi/4)) # ฟังก์ชัน sin
from math import cos
print(cos(0)) # ฟังก์ชัน cos
1.4142135623730951
3.141592653589793
0.7071067811865475
1.0
หากต้องการอิมพอร์ตหลายๆ ออบเจ็กต์ (ฟังก์ชัน) ที่อยู่โมดูลเดียวกันก็สามารถทำได้โดยใช้เครื่องหมายคอมมา ,
เป็นตัวคั่น
from math import cos, sin, pi
sin(pi)/cos(pi)
-1.2246467991473532e-16
หรือนำเข้าทั้งหมดโดยการใช้เครื่องหมายสตาร์ *
(หรือเครื่องหมายดอกจันทร์ (asterisk)) เหมือนในตัวอย่างต่อไปนี้
from <module_name> import *
สัญลักษณ์ * จะใช้แทนตัวอักษรใด ๆ ก็ได้ กี่ตัวก็ได้ (wildcards) ของชื่อที่มีในโมดูลนั้นๆ (ไม่ว่าจะเป็นคำสั่ง คลาส ฟังก์ชัน ค่าคงที่ หรือตัวแปรต่างๆ) ยกเว้นชื่อที่ขึ้นต้นด้วยขีดล่าง _
ดังนั้นการนำเข้าด้วยวิธีนี้จึงไม่ต้องระบุชื่อตอนที่จะเรียกใช้
from math import *
print(factorial(5)) # แฟกทอเรียลของ 5 # ในกรณีที่ import math จะเขียนโค้ดเป็น math.factorial(5)
print(floor(2.31)) # ปัดเศษ 2.31 ลงเป็นจำนวนเต็มที่ใกล้ที่สุด # ในกรณีที่ import math จะเขียนโค้ดเป็น math.floor(2.31)
print(e) # Napier's constant # ในกรณีที่ import math จะเขียนโค้ดเป็น math.e
120
2
2.718281828459045
แต่อย่างไรก็ตาม ในการใช้เขียนโปรแกรมจริงๆ ควรหลีกเลี่ยงวิธีนี้ เนื่องจากวิธีดังกล่าวเป็นการนำเข้าออบเจ็กต์ทุกอย่าง (ตัวแปร ฟังก์ชัน คลาส ฯลฯ) ที่มีอยู่ในโมดูลเข้ามาในโปรแกรมหลัก ซึ่ง อาจจะมีชื่อของออบเจ็กต์ที่เราไม่รู้ว่ามีอยู่ในโมดูล และชื่อนั้นซ้ำกับชื่อในโปรแกรมหลัก ทำให้เกิดความขัดแย้งกัน (Name conflict/collision)
ตัวอย่างเช่น
pi = 'พาย' # กำหนดตัวแปร pi ให้เป็นสตริง "พาย"
print(pi)
from math import *
print(pi) # ถูกแทนที่ด้วยค่า pi ของโมดูล math (ชื่อซ้ำกัน ขัดแย้งกัน ชนกัน)
พาย
3.141592653589793
ดังนั้นการเรียกใช้งานในรูปแบบของ <module_nem>
.<function_name>
จึงเป็นวิธีฝึกปฏิบัติที่ดีสำหรับการ import โมดูลเข้ามาในโปรแกรม
as
#
เราสามารถนำเข้าโมดูลและตั้งชื่อให้เป็นแบบย่อได้โดยใช้สั่ง as
เมื่อมีการเรียกใช้โมดูลจะเรียกชื่อย่อแทน (Alternative name)
ยกตัวอย่างเช่น ไลบรารี่ numpy
มักจะถูกตั้งชื่อย่อเป็น np
, pandas
เป็น pd
และ matplotlib.pyplot
เป็น plt
เป็นต้น
import <module_name> as <alt_name>
from <module_name> import <name> as <alt_name>
import numpy
print(numpy.arange(0, 1.0, 0.1)) # สร้างชุดตัวเลขตั้งแต่ 0, 0.1, 0.2, ..., 0.9
import numpy as np
print(np.arange(0, 1.0, 0.1)) # ใช้ชื่อย่อ np แทน
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
นอกจากนี้ ยังสามารถตั้งชื่อให้แต่ละฟังก์ชันได้อีกด้วย
import math
print(math.factorial(5)) # แฟกทอเรียลของ 5
from math import factorial as fact # ใช้ชื่อย่อ fact แทน math.factorial
print(fact(5))
120
120
[Exercise]#
จงเขียนโค้ดต่อไปนี้ใหม่ ให้สามารถเรียกใช้งานได้โดยที่ไม่ต้องมีชื่อของโมดูล
import math
print(math.sqrt(2))
print(math.sin(math.pi))
# Write your code below and press Shift+Enter to execute
import ...
...
print(sqrt(2))
print(sin(pi))
Cell In [10], line 2
import ...
^
SyntaxError: invalid syntax