Trong phần này chúng ta sẽ tìm hiểu về module trong Python.
Module trong Python rất đơn giản, đó là các file chứa code python có đuôi mở rộng là .py
. Dùng module là một cách tuyệt vời để quản lý code Python, ngoài module ra thì chúng ta còn có các cách sau:
- Dùng Hàm
- Dùng Lớp
- Dùng Module
- Dùng Package
Trong đó quy mô nhỏ nhất là hàm và lớn nhất là Package. Bạn có thể hình dung chúng ta viết hàm để chia nhỏ các công việc ra, sau đó gộp các hàm liên quan với nhau vào một lớp cụ thể, các lớp có liên quan với nhau lại được gộp vào một file làm một module, cứ thế chương trình lớn dần và chúng ta lại gộp các module thành một package. Chúng ta sẽ tìm hiểu về package ở bài sau.
Đặt tên module
Tên module là tên file có phần mở rộng là .py.
Ví dụ như chúng ta có file empty.py
thì empty
là tên module. Mặc nhiên module này có một biến tên là __name__,
biến này lưu trữ tên của module đang được sử dụng. Khi chúng ta viết một file Python rồi chạy thì biến thì tên module của file này được gọi là __main__
.
Trong ví dụ dưới đây chúng ta có 2 file: empty.py
và modulename.py
. Khi chúng ta chạy từ file modulename.py
thì file này được gọi là module main. Module main sử dụng module của file empty.py.
Để sử dụng một module thì chúng ta dùng từ khóa import.
""" An empty module """
import empty import sys print (__name__) print (empty.__name__) print (sys.__name__)
Trong đoạn code trên chúng ta sử dụng 2 module, thứ nhất là module sys
có sẵn trong Python và thứ hai là module empty
do chúng ta tự tạo ra. Chúng ta in tên của các module này ra màn hình
__main__ empty sys
Tên của module main sẽ luôn luôn là __main__.
Các module khác sẽ là tên file.
Thư mục chứa module
Khi chúng ta import một module nào đó. Trình thông dịch sẽ tìm các module có sẵn trong Python. Nếu không thấy, nó sẽ tìm trong biến sys.path
, biến này lưu trữ một list các chuỗi đường dẫn bao gồm đường dẫn đến thư mục hiện tại của file và đường dẫn đến thư mục cài đặt Python cùng với một số thư mục con bên trong. Nếu không tìm thấy module thì báo lỗi ImportError
.
import sys import textwrap sp = sorted(sys.path) dnames = ', '.join(sp) print (textwrap.fill(dnames))
Đoạn code trên in ra tất cả các thư mục trong biến sys.path
.
import textwrap
Module textwrap
dùng để định dạng kiểu hiển thị.
sp = sorted(sys.path)
Dòng code trên lấy danh sách các đường dẫn thư mục và sắp xếp chúng.
dnames = ', '.join(sp)
Sau đó chúng ta nối chúng lại thành một chuỗi, ngăn cách bởi dấu phẩy.
C:\Users\PhoCode\, C:\Python, C:\Python\DLLs, C:\Python\lib, C:\Python\lib\site-packages, C:\Python\python35.zip
Từ khóa import
Như chúng ta đã biết từ khóa này được dùng để tích hợp một module vào chương trình.
from module import *
Cú pháp trên có ý nghĩa là tích hợp tất cả những gì có trong module vào chương trình của chúng ta ngoại trừ các đối tượng có tên bắt đầu bằng dấu gạch dưới _. Những đối tượng này được sử dụng với tên của module chứ không thể được gọi riêng như những đối tượng khác.
from math import * print (cos(3)) print (pi)
Đoạn code trên tích hợp tất cả các đối tượng có thể sử dụng trong module math vào chương trình. Chúng ta có thể gọi các hàm trong module này một cách trực tiếp chứ không cần phải thông qua tên module.
-0.9899924966 3.14159265359
Cách import kiểu này có thể làm rối loạn chương trình của chúng ta vì có thể có rất nhiều module trùng tên với nhau, do đó chúng sẽ bị ghi đè.
from math import * pi = 3.14 print (cos(3)) print (pi)
Đoạn code trên sẽ in ra con số 3.14. Vì trình thông dịch nghĩ rằng chúng ta muốn sử dụng biến pi
do chúng ta tự gán chứ không phải biến pi
có sẵn trong module math.
Ví dụ dưới đây kiểm nghiệm các hàm không được tích hợp vào chương trình bằng cách sử dụng kiểu import trên.
""" names is a test module """ _version = 1.0 names = ["Paul", "Frank", "Jessica", "Thomas", "Katherine"] def show_names(): for i in names: print (i) def _show_version(): print (_version)
from names import * print (locals()) show_names()
Biến _version
và hàm _show_version()
sẽ không được tích hợp vào module private vì tên của chúng có dấu gạch dưới ở đầu. Chúng ta dùng hàm locals()
để in ra các module đã được tích hợp.
{'__builtins__': <module '__builtin__' (built-in)>, '__file__': './private.py', 'show_names': <function show_names at 0xb7dd233c>, 'names': ['Paul', 'Frank', 'Jessica', 'Thomas', 'Katherine'], '__name__': '__main__', '__doc__': None} Paul Frank Jessica Thomas Katherine
from module import fun, var
Kiểu cú pháp trên chỉ tích hợp một số đối tượng được chỉ định vào module của chúng ta.
from math import sin, pi print (sin(3)) print (pi)
Trong ví dụ trên chúng ta tích hợp 2 đối tượng sin
và pi
từ module math.
from names import _version, _show_version print (_version) _show_version()
Với kiểu cú pháp này chúng ta có thể tích hợp các module có tên có dấu gạch dưới ở đầu.
1.0 1.0
import module
Cú pháp cuối cùng này là cú pháp được sử dụng nhiều nhất. Bạn có thể dùng tất cả các đối tượng có trong module và để sử dụng thì bạn phải ghi tên module cùng với dấu chấm rồi mới đến tên đối tượng. Nhờ đó mà chương trình của bạn không bị rối tung lên.
import math pi = 3.14 print (math.cos(3)) print (math.pi) print (math.sin(3)) print (pi)
Trong ví dụ trên chúng ta import module math
. Chúng ta có thể truy xuất được cả biến pi
của chúng ta và biến pi
trong module math
.
-0.9899924966 3.14159265359 0.14112000806 3.14
import math as m print (m.pi) print (m.cos(3))
Ngoài ra khi import một module nào đó, bạn có thể muốn dùng một cái tên khác ngắn gọn hơn bằng cách thêm từ khóa as
cùng với tên mà bạn muốn dùng. Tên này chỉ có hiệu lực trong file mà bạn đang viết.
3.14159265359 -0.9899924966
Nếu bạn import sai tên module thì lỗi ImportError
sẽ nảy sinh.
try: import empty2 except ImportError, e: print ('Failed to import:', e)
Trong ví dụ trên, chúng ta không có module nào tên là empty2 do đó trình thông dịch báo lỗi.
Failed to import: No module named empty2
Thực thi module
Để sử dụng module thì chúng ta import nó từ chương trình của chúng ta nhưng chúng ta cũng có thể chạy chính nó. Ngoài các module có sẵn trong Python còn có rất nhiều lập trình viên viết các module khác cho Python. Thường thì sau khi viết xong họ hay viết những đoạn code để kiểm tra module của mình ở cuối file.
Chúng ta sẽ kiểm chứng điều này bằng cách viết module in dãy số fibonacci. Dãy số fibbonacci là dãy số mà số thứ i bằng tổng của số thứ i-1
và i-2,
ngoại trừ hai số đầu tiên có giá trị là 1.
""" A module containing the fibonacci function. """ def fib(n): a, b = 0, 1 while b < n: print (b,) (a, b) = (b, a + b) # testing if __name__ == '__main__': fib(500)
Chúng ta sẽ chạy module này từ command prompt.
1 1 2 3 5 8 13 21 34 55 89 144 233 377
Trong đoạn code trên chúng ta có câu lệnh if để kiểm tra, nếu module được chạy từ trình biên dịch thì nó sẽ tự thực thi câu lệnh fib(500)
. Còn nếu được import từ module khác thì không.
>>> import fibonacci as fib >>> fib.fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377