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.org

    • conda 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

Author#

S.C.

Change Log#

Date

Version

Change Description

25-12-2021

0.1

First edition