Bài 8.6. Python - Lưu trữ hàm trong module

Bài 8.6. Python - Lưu trữ hàm trong module
Một lợi thế của hàm là cách chúng tách các khối mã khỏi chương trình chính của bạn. Khi bạn sử dụng tên mô tả cho các hàm của mình, các chương trình của bạn trở nên dễ theo dõi hơn. Bạn có thể tiến thêm một bước bằng cách lưu trữ các hàm của mình trong một tệp riêng gọi là module và sau đó nhập module đó vào chương trình chính của bạn. Một lệnh nhập (import) cho Python biết để làm cho mã trong một module có sẵn trong tệp chương trình hiện đang chạy.
Lưu trữ các hàm của bạn trong một tệp riêng cho phép bạn ẩn các chi tiết của mã chương trình và tập trung vào logic cấp cao hơn của nó. Nó cũng cho phép bạn tái sử dụng các hàm trong nhiều chương trình khác nhau. Khi bạn lưu trữ các hàm trong các tệp riêng, bạn có thể chia sẻ các tệp đó với các lập trình viên khác mà không cần chia sẻ toàn bộ chương trình của bạn. Biết cách nhập các hàm cũng cho phép bạn sử dụng các thư viện hàm mà các lập trình viên khác đã viết.
Có một số cách để nhập một module, và tôi sẽ chỉ cho bạn từng cách một cách ngắn gọn.
Nhập toàn bộ module
Để bắt đầu nhập các hàm, trước tiên chúng ta cần tạo một module. Một module là một tệp kết thúc bằng .py
chứa mã bạn muốn nhập vào chương trình của mình. Hãy tạo một module chứa hàm make_pizza()
. Để tạo module này, chúng ta sẽ loại bỏ mọi thứ khỏi tệp pizza.py
ngoại trừ hàm make_pizza()
:
# filepath: /f:/blog/python-vy/8/pizza.py
def make_pizza(size, *toppings):
"""Tóm tắt chiếc pizza chúng ta sắp làm."""
print(f"\nMaking a {size}-inch pizza with the following toppings:")
for topping in toppings:
print(f"- {topping}")
Bây giờ chúng ta sẽ tạo một tệp riêng gọi là making_pizzas.py
trong cùng thư mục với pizza.py
. Tệp này nhập module mà chúng ta vừa tạo và sau đó gọi hai lần hàm make_pizza()
:
# filepath: /f:/blog/python-vy/8/making_pizzas.py
import pizza
pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
Khi Python đọc tệp này, dòng import pizza
cho Python biết mở tệp pizza.py
và sao chép tất cả các hàm từ đó vào chương trình này. Bạn không thực sự thấy mã được sao chép giữa các tệp vì Python sao chép mã phía sau hậu trường, ngay trước khi chương trình chạy. Tất cả những gì bạn cần biết là bất kỳ hàm nào được định nghĩa trong pizza.py
sẽ có sẵn trong making_pizzas.py
.
Để gọi một hàm từ một module đã nhập, nhập tên của module bạn đã nhập, pizza
, theo sau là tên của hàm, make_pizza()
, được ngăn cách bằng một dấu chấm. Mã này tạo ra cùng một đầu ra như chương trình gốc không nhập module:
Making a 16-inch pizza with the following toppings:
- pepperoni
Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese
Cách tiếp cận đầu tiên này để nhập, trong đó bạn chỉ cần viết import
theo sau là tên của module, làm cho mọi hàm từ module có sẵn trong chương trình của bạn. Nếu bạn sử dụng loại lệnh nhập này để nhập toàn bộ module có tên module_name.py
, mỗi hàm trong module có sẵn thông qua cú pháp sau:
module_name.function_name()
Nhập các hàm cụ thể
Bạn cũng có thể nhập một hàm cụ thể từ một module. Đây là cú pháp chung cho cách tiếp cận này:
from module_name import function_name
Bạn có thể nhập bao nhiêu hàm tùy thích từ một module bằng cách ngăn cách tên của từng hàm bằng dấu phẩy:
from module_name import function_0, function_1, function_2
Ví dụ making_pizzas.py
sẽ trông như thế này nếu chúng ta muốn nhập chỉ hàm mà chúng ta sẽ sử dụng:
from pizza import make_pizza
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
Với cú pháp này, bạn không cần sử dụng ký hiệu dấu chấm khi bạn gọi một hàm. Vì chúng ta đã nhập rõ ràng hàm make_pizza()
trong lệnh nhập, chúng ta có thể gọi nó bằng tên khi chúng ta sử dụng hàm.
Sử dụng as
để đặt bí danh cho hàm
Nếu tên của một hàm bạn đang nhập có thể xung đột với một tên hiện có trong chương trình của bạn, hoặc nếu tên hàm dài, bạn có thể sử dụng một bí danh ngắn, duy nhất - một tên thay thế tương tự như biệt danh cho hàm. Bạn sẽ đặt biệt danh đặc biệt này khi bạn nhập hàm.
Ở đây chúng ta đặt bí danh cho hàm make_pizza()
là mp()
, bằng cách nhập make_pizza
dưới tên mp
. Từ khóa as
đổi tên một hàm bằng cách sử dụng bí danh bạn cung cấp:
from pizza import make_pizza as mp
mp(16, 'pepperoni')
mp(12, 'mushrooms', 'green peppers', 'extra cheese')
Lệnh nhập được hiển thị ở đây đổi tên hàm make_pizza()
thành mp()
trong chương trình này. Bất cứ khi nào chúng ta muốn gọi make_pizza()
, chúng ta chỉ cần viết mp()
thay thế, và Python sẽ chạy mã trong make_pizza()
trong khi tránh bất kỳ sự nhầm lẫn nào với một hàm make_pizza()
khác mà bạn có thể đã viết trong tệp chương trình này.
Cú pháp chung để cung cấp một bí danh là:
from module_name import function_name as fn
Sử dụng as
để đặt bí danh cho module
Bạn cũng có thể cung cấp một bí danh cho tên module. Đặt một bí danh ngắn cho module, như p
cho pizza
, cho phép bạn gọi các hàm của module nhanh hơn. Gọi p.make_pizza()
ngắn gọn hơn gọi pizza.make_pizza()
:
import pizza as p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
Module pizza
được đặt bí danh là p
trong lệnh nhập, nhưng tất cả các hàm của module giữ nguyên tên gốc của chúng. Gọi các hàm bằng cách viết p.make_pizza()
không chỉ ngắn gọn hơn pizza.make_pizza()
, mà còn chuyển hướng sự chú ý của bạn khỏi tên module và cho phép bạn tập trung vào các tên mô tả của các hàm của nó. Những tên hàm này, rõ ràng cho bạn biết mỗi hàm làm gì, quan trọng hơn đối với khả năng đọc mã của bạn so với việc sử dụng tên module đầy đủ.
Cú pháp chung cho cách tiếp cận này là:
import module_name as mn
Nhập tất cả các hàm trong module
Bạn có thể yêu cầu Python nhập mọi hàm trong một module bằng cách sử dụng toán tử dấu hoa thị (*):
from pizza import *
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
Dấu hoa thị trong lệnh nhập cho Python biết sao chép mọi hàm từ module pizza
vào tệp chương trình này. Vì mọi hàm đều được nhập, bạn có thể gọi từng hàm bằng tên mà không cần sử dụng ký hiệu dấu chấm. Tuy nhiên, tốt nhất là không sử dụng cách tiếp cận này khi bạn đang làm việc với các module lớn mà bạn không viết: nếu module có một tên hàm trùng với một tên hiện có trong dự án của bạn, bạn có thể nhận được kết quả không mong muốn. Python có thể thấy nhiều hàm hoặc biến có cùng tên, và thay vì nhập tất cả các hàm riêng biệt, nó sẽ ghi đè các hàm.
Cách tiếp cận tốt nhất là nhập hàm hoặc các hàm bạn muốn, hoặc nhập toàn bộ module và sử dụng ký hiệu dấu chấm. Điều này dẫn đến mã rõ ràng, dễ đọc và hiểu. Tôi bao gồm phần này để bạn nhận ra các lệnh nhập như sau khi bạn thấy chúng trong mã của người khác:
from module_name import *
Comments