Điện thoại/ Zalo
0389934723
Bài 14: Modules trong Python
Nếu như các bạn đã từng tìm hiểu qua một ngôn ngữ lập trình nào khác thì chắc hẳn các bạn cũng biết các ngôn ngữ đó nó đều có cơ chế load file và sử dụng lại. Ví dụ như PHP chúng ta sử dụng include,require,… Và hôm nay chúng ta hãy cùng tìm hiểu xem trong Python thì cách thức đó gọi là gì nhé!
1, Modules là gì?
Modules là cách mà chúng ta phân hóa chương trình ra các nhánh nhỏ cho dễ quản lý và gọi lại chúng khi nào cần, như thế chương trình của chúng ta sẽ có tính tái sử dụng, bảo trì cao.
VD: Như mô hình MVC cũng được coi như một cách modules hóa hệ thống.
2, Modules trong Python.
Import
Để import một module có vào trong file hiện tại thì mọi người sử dụng từ khóa import với cú pháp như sau:
import module1, module2,...
Trong đó: module1, module2,...
là các modules mà các bạn muốn import vào file hiện tại.
Để xem danh sách các module mặc định của python mọi người click vào đây.
VD: Mình sẽ import models math và gọi thử một số phương thức trong module math (xem danh sách các phương thức).
import math
a = 3.2
# làm tròn lên 1 số
print(math.ceil(a)) # 4
# làm tròn xuống 1 số
print(math.floor(a)) # 3
from – import
Giả sử trong một trường hợp nào đó khi bạn không muốn sử dụng hết toàn bộ module mà chỉ muốn sử dụng một số thứ trong đó mà thôi thì sẽ phải làm sao? Trong trường hợp này chúng ta sử dụng từ khóa from...import
theo cú pháp như sau:
from modules import something, something2,...
Trong đó:
modules
là tên của module mà các bạn muốn import.something1,somthing2,...
là những thứ mà các bạn muốn sử dụng ở trongmodules
. Nếu như bạn muốn import tất cả những gì trong modules có và cho phép thì bạn sử dụng keyword*
.
VD: Mình sẽ import mỗi phương thức ceil
ở trong module math
.
from math import ceil
a = 3.2
print(ceil(a))
# kết quả: 4
print(floor(a))
# Kết quả: name 'floor' is not defined
VD: Mình sẽ import tất cả mọi thứ được cho phép từ module math.
from math import *
a = 3.2
print(ceil(a))
# kết quả: 4
print(floor(a))
# Kết quả: 3
Build module
Ngoài sử dụng các module có sẵn trong python ra thì chúng ta cũng có thể viết ra các module của riêng mình và import nó khi muốn sử dụng.
VD: Mình sẽ hướng dẫn mọi người build một module đơn giản.
Đầu tiên các bạn tạo cho mình 2 file main.py
và math_plus.py
ở cùng cấp thư mục.
Bây giờ mọi người mở file mathplus.py
lên và viết cho mình hàm get_sum
– tính tổng 2 số nguyên bất kỳ do người dùng truyền vào.
Ai lười thì copy nhé!
# file math.py
def get_sum (a, b):
return a + b
Tiếp đó khi bạn muốn sử dụng được hàm get_sum này trong file main.py thì chúng ta chỉ cần import nó vào và sử dụng thôi.
import mathplus
print(mathplus.get_sum(4,7))
# Kết quả: 11
Chú ý: Tên file chứa code chúng ta muốn import chính là tên modules.
Tương tự với trường hợp from-import thì mọi người tự làm nhé!
Định danh cho modules
Nếu như trong trường hợp modules của chúng ta rất khó nhớ hay dài hay vì một lý do nào khác mà bạn không muốn gọi module như thế thì với Python bạn cũng có thể gán định danh mới cho modules khi import chúng bằng cách sử dụng keyword as
. với cú pháp như sau:
import modules as newname
# hoặc đối với from import
from modules import something as newname
Trong đó:
modules
là các modules mà chúng ta muốn import.newname
là định danh mới cho module đó.
VD: Mình sẽ import mathplus
modules và gán định danh cho nó thành ma
.
import mathplus as ma
print(ma.get_sum(4,7))
# Kết quả: 11
Nếu như các bạn sử dụng cú pháp from … import thì cũng dùng tương tự.
from mathplus import get_sum as sum
print(sum(4,7))
# Kết quả: 11
3, Chú ý.
Đối với trường hợp các bạn sử dụng from … import * thì mặc định python nó sẽ không import được các đối tượng có tên được bắt đầu bằng ký tự _ . Trong trường hợp này, nếu như bạn muốn import được các đối tượng đó thì bạn sẽ phải chỉ đích danh các đối tượng đó.
VD: Bây giờ mình sẽ đổi tên của phương thức get_sum
trong mathply.py
thành _get_sum()
.
# file mathplus.py
def _get_sum (a, b):
return a + b
Bây giờ ở trong file main mình sẽ import mathplus theo cách dùng ký tự *.
from mathplus import *
print(_get_sum(5,7))
# kết quả: name '_get_sum' is not defined
Như các bạn đã thấy nó đã báo lỗi là _get_sum() chưa được định nghĩa. Bây giờ chúng ta chuyển sang import đích danh _get_sum xem sao nhé.
from mathplus import _get_sum
print(_get_sum(5,7))
# kết quả: 12
Như các bạn thấy đó, nó đã ok.
4, import module trong thư mục.
Cũng với ví dụ về module mathplus ở phía trên, bây giờ bạn tạo thêm 1 thư mục có tên là modules hoặc tên bất kỳ và copy file mathplus.py vào thư mục đó. Lúc này cấu trúc thư mục sẽ thành như sau:
| modules/mathplus.py
| main.py
Và bạn thử import module mathplus vào trong main như cũ xem nó có chạy không? Chắc chắn là không chạy và nó sẽ trả về lỗi là “module mathplus chưa được đặt tên“. Điều này xảy ra là do chúng ta chưa thiết lập thư mục load modules cho python hiểu.
Mặc định thì python nó sẽ chỉ load các module hệ thống của nó và các module ở cùng cấp với file hiện tại. Nếu như bạn muốn chỉ cho python biết là nó cần load module ở những thư mục nào nữa thì bạn phải cấu hình ở trong sys.path và để thêm thư mục cần load thì bạn sử dụng phương thức append()
ở trong module sys.path
.
VD: Mình sẽ báo có python biết là phải load thêm thư mục modules
ở trong project hiện tại, và đồng thời mình sẽ import luôn thư mục mathplus.py
.
import os, sys
# lấy ra đường dẫn đến thư mục modules ở trong projetc hiện hành
lib_path = os.path.abspath(os.path.join('modules'))
# thêm thư mục cần load vào trong hệ thống
sys.path.append(lib_path)
# import
from mathplus import get_sum
print(get_sum(1,4));
# kết quả: 5
5, Lời kết.
Phần này cực kỳ quan trọng, nếu như bạn không biết đến nó bạn sẽ không thể nào đi vào các bài sau được.