Khái niệm về module trong Python càng nâng cao tính mô-đun. Bạn có thể định nghĩa nhiều hàm liên quan cùng nhau và tải các hàm cần thiết. Một mô-đun là một tệp chứa định nghĩa của các hàm, classes , variables , hằng số hoặc bất kỳ đối tượng Python nào khác. Nội dung của tệp này có thể được cung cấp cho bất kỳ chương trình nào khác. Python có từ khóa import cho mục đích này.
A function is a block of organized, reusable code that is used to perform a single, related action. Functions provide better modularity for your application and a high degree of code reusing.
import math print ("Square root of 100:", math.sqrt(100))
Nó sẽ tạo ra output sau đây −
Square root of 100: 10.0
Thư viện chuẩn của Python đi kèm với một số lượng lớn các mô-đun. Chúng được gọi là mô-đun tích hợp sẵn. Hầu hết các mô-đun tích hợp sẵn này được viết bằng C (vì phiên bản tham chiếu của Python được viết bằng C) và được biên dịch trước vào thư viện. Các mô-đun này cung cấp các chức năng hữu ích như quản lý hệ điều hành cụ thể, IO đĩa, mạng, v.v.
Dưới đây là danh sách chọn lọc các mô-đun tích hợp sẵn −
Sr.No. | Name & Brief Description |
---|---|
1 | os This module provides a unified interface to a number of operating system functions. |
2 | string This module contains a number of functions for string processing |
3 | re This module provides a set of powerful regular expression facilities. Regular expression (RegEx), allows powerful string search and matching for a pattern in a string |
4 | math This module implements a number of mathematical operations for floating point numbers. These functions are generally thin wrappers around the platform C library functions. |
5 | cmath This module contains a number of mathematical operations for complex numbers. |
6 | datetime This module provides functions to deal with dates and the time within a day. It wraps the C runtime library. |
7 | gc This module provides an interface to the built-in garbage collector. |
8 | asyncio This module defines functionality required for asynchronous processing |
9 | Collections This module provides advanced Container datatypes. |
10 | functools This module has Higher-order functions and operations on callable objects. Useful in functional programming |
11 | operator Functions corresponding to the standard operators. |
12 | pickle Convert Python objects to streams of bytes and back. |
13 | socket Low-level networking interface. |
14 | sqlite3 A DB-API 2.0 implementation using SQLite 3.x. |
15 | statistics Mathematical statistics functions |
16 | typing Support for type hints |
17 | venv Creation of virtual environments. |
18 | json Encode and decode the JSON format. |
19 | wsgiref WSGI Utilities and Reference Implementation. |
20 | unittest Unit testing framework for Python. |
21 | random Generate pseudo-random numbers |
22 | sys Provides functions that acts strongly with the interpreter. |
23 | requests It simplifies HTTP requests by offering a user-friendly interface for sending and handling responses. |
Bất kỳ tệp văn bản nào với phần mở rộng .py và chứa mã Python về cơ bản là một mô-đun. Nó có thể chứa định nghĩa của một hoặc nhiều hàm, biến, hằng số cũng như các lớp. Bất kỳ đối tượng Python nào từ một mô-đun có thể được cung cấp cho phiên thông dịch hoặc một tập tin Python khác bằng câu lệnh import. Một mô-đun cũng có thể bao gồm mã có thể chạy.
Tạo một module chỉ đơn giản là lưu mã Python với sự trợ giúp của bất kỳ trình biên soạn nào. Hãy lưu đoạn mã sau dưới dạng mymodule.py .
def SayHello(name): print ("Hi {}! How are you?".format(name)) return
Bạn có thể bây giờ nhập mymodule trong terminal Python hiện tại.
>>> import mymodule >>> mymodule.SayHello("Harish") Hi Harish! How are you?
Bạn cũng có thể nhập một mô-đun trong một tập tin Python khác. Lưu đoạn mã sau dưới dạng example.py.
import mymodule mymodule.SayHello("Harish")
Chạy kịch bản này từ terminal lệnh.
Hi Harish! How are you?
Trong Python, từ khóa import được cung cấp để tải một đối tượng Python từ một module. Đối tượng có thể là một hàm, lớp, biến, v.v. Nếu một module chứa nhiều định nghĩa, tất cả chúng sẽ được tải vào không gian tên.
Hãy lưu đoạn mã sau có ba hàm dưới dạng mymodule.py. .
def sum(x,y): return x+y def average(x,y): return (x+y)/2 def power(x,y): return x**y
Câu lệnh import mymodule tải tất cả các hàm trong mô-đun này vào không gian tên hiện tại. Mỗi hàm trong mô-đun được nhập khẩu là một thuộc tính của đối tượng mô-đun này.
>>> dir(mymodule) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'average', 'power', 'sum']
Để gọi bất kỳ hàm nào, hãy sử dụng tham chiếu của đối tượng module. Ví dụ, mymodule.sum().
import mymodule print ("sum:",mymodule.sum(10,20)) print ("average:",mymodule.average(10,20)) print ("power:",mymodule.power(10, 2))
Nó sẽ tạo ra output sau đây −
sum:30 average:15.0 power:100
Câu lệnh import sẽ tải tất cả các tài nguyên của mô-đun vào không gian tên hiện tại. Có thể nhập các đối tượng cụ thể từ một mô-đun bằng cách sử dụng cú pháp này. Ví dụ −
Trong ba hàm trong mymodule , chỉ có hai hàm được nhập vào trong đoạn mã thực thi sau example.py .
from mymodule import sum, average print ("sum:",sum(10,20)) print ("average:",average(10,20))
Nó sẽ tạo ra đầu ra sau đây −
sum: 30 average: 15.0
Lưu ý rằng hàm không cần phải được gọi bằng cách thêm tiền tố tên của mô-đun vào nó.
Cũng có thể import tất cả các tên từ một module vào không gian tên hiện tại bằng cách sử dụng câu lệnh import sau −
from modname import *
Điều này cung cấp một cách dễ dàng để nhập tất cả các mục từ một mô-đun vào không gian tên hiện tại; tuy nhiên, câu lệnh này nên được sử dụng một cách tiết kiệm.
Bạn có thể gán một tên bí danh cho mô-đun đã nhập.
from modulename as alias
alias nên được thêm vào trước hàm khi gọi.
Hãy xem xét đoạn sau example −
import mymodule as x print ("sum:",x.sum(10,20)) print ("average:", x.average(10,20)) print ("power:", x.power(10, 2))
Khi bạn nhập một mô-đun, trình thông dịch Python sẽ tìm kiếm mô-đun trong các chuỗi sau:
Thư mục hiện tại.
Nếu mô-đun không được tìm thấy, Python sẽ tìm kiếm từng thư mục trong biến shell PYTHONPATH.
Nếu tất cả các phương án khác đều thất bại, Python sẽ kiểm tra đường dẫn mặc định. Trên UNIX, đường dẫn mặc định này thường là /usr/local/lib/python/.
Đường dẫn tìm kiếm mô-đun được lưu trữ trong mô-đun hệ thống sys dưới dạng biến sys.path . Biến sys.path chứa thư mục hiện tại, PYTHONPATH và giá trị mặc định phụ thuộc vào cài đặt.
PYTHONPATH là một biến môi trường, bao gồm một danh sách các thư mục. Cú pháp của PYTHONPATH giống như cú pháp của biến shell PATH.
Dưới đây là một PYTHONPATH điển hình từ hệ thống Windows −
set PYTHONPATH = c:\python20\lib;
Và đây là một PYTHONPATH điển hình từ hệ thống UNIX −
set PYTHONPATH = /usr/local/lib/python
Biến là tên (định danh) ánh xạ đến các đối tượng. Một không gian tên là một từ điển chứa tên biến (khóa) và các đối tượng tương ứng của chúng (giá trị).
Một câu lệnh Python có thể truy cập các biến trong một không gian tên cục bộ và trong một không gian tên toàn cục . Nếu một biến cục bộ và một biến toàn cục có cùng tên, biến cục bộ sẽ che khuất biến toàn cục.
Mỗi hàm có không gian tên cục bộ riêng của nó. Các phương thức của lớp tuân theo quy tắc phạm vi giống như các hàm thông thường.
Python đưa ra những phỏng đoán có căn cứ về việc các biến là cục bộ hay toàn cục. Nó giả định rằng bất kỳ biến nào được gán giá trị trong một hàm đều là cục bộ.
Để gán giá trị cho một biến toàn cục trong một hàm, bạn phải sử dụng câu lệnh global trước tiên.
Câu lệnh global VarName cho Python biết rằng VarName là một biến toàn cục. Python sẽ ngừng tìm kiếm trong không gian tên cục bộ cho biến này.
Ví dụ, chúng ta định nghĩa một biến Money trong không gian tên toàn cục. Trong hàm Money , chúng ta gán cho Money một giá trị, do đó Python coi Money là một biến cục bộ. Tuy nhiên, chúng ta đã truy cập giá trị của biến cục bộ Money trước khi gán giá trị cho nó, vì vậy kết quả là một lỗi UnboundLocalError. Việc bỏ chú thích câu lệnh global sẽ khắc phục vấn đề này.
Money = 2000 def AddMoney(): # Uncomment the following line to fix the code: # global Money Money = Money + 1 print (Money) AddMoney() print (Money)
Trong Python, một mô-đun là một đối tượng của lớp mô-đun, do đó nó được đặc trưng bởi các thuộc tính.
Các thuộc tính của mô-đun như sau −
__file__ trả về tên vật lý của mô-đun.
__package__ trả về gói mà mô-đun thuộc về.
__doc__ trả về chuỗi tài liệu ở đầu module nếu có.
__dict__ trả về toàn bộ phạm vi của mô-đun.
__name__ trả về tên của module.
Giả sử rằng đoạn mã sau được lưu dưới dạng mymodule.py
"The docstring of mymodule" def sum(x,y): return x+y def average(x,y): return (x+y)/2 def power(x,y): return x**y
Hãy kiểm tra các thuộc tính của mymodule bằng cách nhập nó vào đoạn mã sau −
import mymodule print ("__file__ attribute:", mymodule.__file__) print ("__doc__ attribute:", mymodule.__doc__) print ("__name__ attribute:", mymodule.__name__)
Nó sẽ tạo ra output sau đây −
__file__ attribute: C:\math\examples\mymodule.py __doc__ attribute: The docstring of mymodule __name__ attribute: mymodule
Thuộc tính __name__ của một mô-đun Python có ý nghĩa rất quan trọng. Hãy cùng khám phá nó một cách chi tiết hơn.
Trong một shell tương tác, thuộc tính __name__ trả về '__main__'.
>>> __name__ '__main__'
Nếu bạn nhập bất kỳ mô-đun nào trong phiên trình thông dịch, nó sẽ trả về tên của mô-đun đó dưới thuộc tính __name__ của mô-đun đó.
>>> import math >>> math.__name__ 'math'
Từ bên trong một script Python, thuộc tính __name__ trả về '__main__'
#example.py print ("__name__ attribute within a script:", __name__)
Chạy lệnh này trong terminal lệnh −
__name__ attribute within a script: __main__
Thuộc tính này cho phép một script Python được sử dụng như một tệp thực thi hoặc như một module. Khác với C++, Java, C# v.v., trong Python, không có khái niệm về hàm main(). Script chương trình Python với phần mở rộng .py có thể chứa định nghĩa hàm cũng như các câu lệnh có thể thực thi.
Lưu mymodule.py và với mã sau −
"The docstring of mymodule" def sum(x,y): return x+y print ("sum:",sum(10,20))
Bạn có thể thấy rằng hàm sum() được gọi trong cùng một kịch bản mà nó được định nghĩa.
sum: 30
Bây giờ, hãy nhập hàm này vào một tập lệnh khác example.py .
import mymodule print ("sum:",mymodule.sum(10,20))
Nó sẽ tạo ra output sau đây −
sum: 30 sum: 30
Đầu ra "sum:30" xuất hiện hai lần. Một lần khi mô-đun mymodule được nhập. Các câu lệnh thực thi trong mô-đun đã nhập cũng được chạy. Đầu ra thứ hai đến từ kịch bản gọi, tức là chương trình example.py .
Điều chúng ta muốn xảy ra là khi một module được nhập vào, chỉ có hàm được nhập, các câu lệnh thực thi của nó không nên chạy. Điều này có thể được thực hiện bằng cách kiểm tra giá trị của __name__. Nếu nó là __main__, có nghĩa là nó đang được chạy và không phải được nhập vào. Bao gồm các câu lệnh thực thi như gọi hàm một cách có điều kiện.
Thêm câu lệnh if vào mymodule.py như được hiển thị −
"The docstring of mymodule" def sum(x,y): return x+y if __name__ == "__main__": print ("sum:",sum(10,20))
Bây giờ, nếu bạn chạy chương trình example.py , bạn sẽ thấy rằng tổng: 30 chỉ xuất hiện một lần.
sum: 30
Hàm tích hợp dir() trả về một danh sách chuỗi đã được sắp xếp chứa các tên được định nghĩa bởi một mô-đun.
Danh sách chứa tên của tất cả các mô-đun, biến và hàm được định nghĩa trong một mô-đun. Dưới đây là một ví dụ đơn giản −
# Import built-in module math import math content = dir(math) print (content)
Khi đoạn mã trên được thực thi, nó sẽ tạo ra kết quả sau −
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
Đôi khi bạn có thể cần phải tải lại một mô-đun, đặc biệt là khi làm việc với phiên tương tác của trình thông dịch Python.
Giả sử rằng chúng ta có một mô-đun kiểm tra (test.py) với hàm sau −
def SayHello(name): print ("Hi {}! How are you?".format(name)) return
Chúng ta có thể nhập mô-đun và gọi hàm của nó từ prompt Python như sau −
>>> import test >>> test.SayHello("Deepak") Hi Deepak! How are you?
Tuy nhiên, giả sử bạn cần sửa đổi hàm SayHello(), chẳng hạn như −
def SayHello(name, course): print ("Hi {}! How are you?".format(name)) print ("Welcome to {} Tutorial by TutorialsPoint".format(course)) return
Ngay cả khi bạn chỉnh sửa tệp test.py và lưu lại, hàm đã được nạp trong bộ nhớ sẽ không được cập nhật. Bạn cần phải nạp lại nó, sử dụng hàm reload() trong module imp.
>>> import imp >>> imp.reload(test) >>> test.SayHello("Deepak", "Python") Hi Deepak! How are you? Welcome to Python Tutorial by TutorialsPoint
Một gói (package) là một cấu trúc thư mục tệp phân cấp định nghĩa một môi trường ứng dụng Python duy nhất bao gồm các mô-đun, các gói con (subpackages) và các gói con của gói con (sub-subpackages), và tiếp tục như vậy.
Xem xét một tệp Pots.py có sẵn trong thư mục Phone. Tệp này có dòng mã nguồn sau −
def Pots(): print "I'm Pots Phone"
Theo cách tương tự, chúng ta có hai tệp khác có chức năng khác nhau nhưng cùng tên như trên −
Tập tin Phone/Isdn.py có hàm Isdn()
Tập tin Phone/G3.py có hàm G3()
Bây giờ, hãy tạo một tệp __init__.py nữa trong thư mục Phone −
Để làm cho tất cả các hàm của bạn có sẵn khi bạn đã nhập Phone, bạn cần đặt các câu lệnh nhập khẩu rõ ràng trong __init__.py như sau −
from Pots import Pots from Isdn import Isdn from G3 import G3
Sau khi bạn thêm những dòng này vào __init__.py, bạn sẽ có tất cả các lớp này có sẵn khi bạn nhập gói Phone.
# Now import your Phone Package. import Phone Phone.Pots() Phone.Isdn() Phone.G3()
Khi đoạn mã trên được thực thi, nó sẽ tạo ra kết quả sau −
I'm Pots Phone I'm 3G Phone I'm ISDN Phone
Trong ví dụ trên, chúng ta đã lấy ví dụ về một hàm đơn trong mỗi tệp, nhưng bạn có thể giữ nhiều hàm trong các tệp của mình. Bạn cũng có thể định nghĩa các lớp Python khác nhau trong những tệp đó và sau đó bạn có thể tạo các gói từ những lớp đó.