12/08/2018, 14:49

[Python Yêu lại từ đầu] Sơ lược về module python

KHÁI NIỆM VÀ CÁCH SỬ DỤNG MODULE TRONG PYTHON Python cho phép chia chương trình thành modules để có thể sử dụng lại trong các chương trình khác. Nó cũng có sẵn một tập hợp các modules chuẩn mà ta có thể sử dụng lại trong chương trình của ta. Các thư viện này cung cấp nhiều thứ, như file I/O, các ...

KHÁI NIỆM VÀ CÁCH SỬ DỤNG MODULE TRONG PYTHON

Python cho phép chia chương trình thành modules để có thể sử dụng lại trong các chương trình khác. Nó cũng có sẵn một tập hợp các modules chuẩn mà ta có thể sử dụng lại trong chương trình của ta. Các thư viện này cung cấp nhiều thứ, như file I/O, các lời gọi hệ thống, sockets,…Trong phần này chúng ta sẽ tìm hiểu các kỹ thuật, đặc điểm của các module.

Nếu thoát khỏi trình thông dịch Python và vào lại nó, những định nghĩa (các hàm và biến) đã viết sẽ bị mất. Vì thế, nếu muốn viết chương trình tồn tại được lâu, tốt nhất là sử dụng một trình soạn thảo để viết một file làm đầu vào cho trình biên dịch rồi chạy file đó. Cái này được gọi là một script (kịch bản). Hoặc khi muốn sử dụng một hàm đã xây dựng trong một vài chương trình mà không muốn copy định nghĩa của nó vào từng chương trình.

Để hỗ trợ điều này, Python có một cách đặt các định nghĩa hàm trong một file và sử dụng chúng như một kịch bản hoặc trong một instance tương tác của trình thông dịch. Một file như vậy gọi là một module. Các định nghĩa từ một module có thể được nhập vào một module khác hoặc vào module chính (tập hợp các biến mà có thể truy nhập đến một script được thi hành tại mức cao nhất và trong chế độ tính toán).

Một module là một file chứa các định nghĩa và câu lệnh Python. Tên file là tên module với phần mở rộng là .py. Trong một module, tên của module (như là một xâu) là sẵn có như giá trị của biến toàn cục name. Ví dụ, dùng trình soạn thảo, soạn file fibo.py với nội dung như sau:

. # Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a+b

def fib2(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

Bây giờ mở trình thông dịch Python và nhập module này bằng lệnh dưới đây:

>>> import fibo

Thao tác này không nhập tên của các hàm đã được định nghĩa trong fibo trực tiếp vào trong bảng kí hiệu hiện thời; nó chỉ nhập tên của module fibo vào đó. Sử dụng tên module này để có thể truy nhập vào các hàm:

>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

Để thuận tiện, một hàm trong module định sử dụng thường được đăng kí với một tên cục bộ:

>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Một module có thể chứa các câu lệnh thực thi cũng như các định nghĩa hàm. Các câu lệnh đó được dùng để khởi tạo module đó. Chúng được thực hiện chỉ lần đầu tiên module đó được nhập. Mỗi một module có bảng kí hiệu riêng của nó, cái mà được sử dụng như một bảng kí hiệu toàn cục cho tất cả các hàm được định nghĩa trong module đó. Vì thế, các biến toàn cục trong module có thể sử dụng mà không lo lắng về sự xung đột xảy ra với các biến toàn cục của người sử dụng module đó. Module cũng có thể được nhập vào một module khác. Nó như là một thông lệ nhưng không yêu cầu phải đặt tất cả các câu lệnh import tại vị trí bắt đầu của một module (hoặc script). Tên module được nhập vào đó được đặt trong bảng kí hiệu toàn cục của module nhập module đó. Để sử dụng modules trong Python, phải nhập nó bằng câu lệnh import. Ví dụ:

import math

Thao tác này sẽ nhập module chuẩn math. Tất cả các hàm trong module này được gọi bằng cách sử dụng qua tên module, ví dụ:

import math
print math.sqrt(10)

Có một biến thể của câu lệnh import mà nhập các tên từ một module trực tiếp vào bảng kí hiệu của module chứa module nhập đó. Ví dụ:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Cũng có một biến thể để nhập tất cả các tên mà một module định nghĩa:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

Thao tác này nhập tất cả các tên ngoại trừ những tên bắt đầu bằng dấu gạch dưới _

ĐƯỜNG DẪN TÌM KIẾM MODULE KHI MỘT MODULE TÊN LÀ SPAM ĐƯỢC NHẬP, TRÌNH THÔNG DỊCH SẼ TÌM MỘT FILE TÊN LÀ SPAM.PY TRONG THƯ MỤC HIỆN HÀNH, VÀ SAU ĐÓ TRONG DANH SÁCH CÁC THƯ MỤC XÁC ĐỊNH BỞI BIẾN MÔI TRƯỜNG PYTHONPATH. KHI BIẾN PYTHONPATH CHƯA ĐƯỢC THIẾT LẬP HOẶC KHI FILE ĐÓ KHÔNG ĐƯỢC TÌM THẤY, VIỆC TÌM KIẾM ĐƯỢC TIẾP TỤC TRONG MỘT ĐƯỜNG DẪN MẶC ĐỊNH PHỤTHUỘC KHI CÀI ĐẶT.

Thực tế, các module được tìm kiếm trong danh sách các thư mục được đưa ra bởi biến sys.path cái mà được khởi tạo từ thư mục chứa script vào ( hoặc thư mục hiện hành), PYTHONPATH và thư mục đường dẫn mặc định phụ thuộc vào cài đặt. Điều này cho phép chương trình Python biết cái mà chúng đang làm để sửa đổi hoặc thay thế đường dẫn tìm kiếm module.

Các module chuẩn

Python cung cấp một thư viện các module chuẩn. Một số module quan trọng được cài sẵn vào trình thông dịch. Có một module cụ thể đáng để chú ý là: sys, module này được cài sẵn vào mọi trình thông dịch Python. Các biến sys.ps1 và sys.ps2 định nghĩa các xâu được sử dụng như dấu nhắc sơ cấp và thứ cấp:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print 'Yeah!'
Yeah!
C>

Hai biến trên chỉ được định nghĩa nếu trình thông dịch ở chế độ tương tác. Biến sys.path là một danh sách các xâu mà xác định đường dẫn tìm kiếm module của trình thông dịch. Nó được khởi tạo một đường dẫn mặc định từ biến môi trường PYTHONPATH, hoặc từ một giá trị mặc định được cài sẵn nếu PYTHONPATH không được thiết lập. Có thể sửa đổi nó sử dụng thao tác danh sách chuẩn:

>>> import sys
>>> sys.path.append('/ufs/guido/lib/python)
0