Python 3 - Mô-đun

Một mô-đun cho phép bạn tổ chức hợp lý mã Python của mình. Nhóm mã liên quan thành một mô-đun làm cho mã dễ hiểu và dễ sử dụng hơn. Mô-đun là một đối tượng Python với các thuộc tính được đặt tên tùy ý mà bạn có thể liên kết và tham chiếu.

Đơn giản, một mô-đun là một tệp bao gồm mã Python. Một mô-đun có thể xác định các hàm, lớp và biến. Một mô-đun cũng có thể bao gồm mã chạy được.

Thí dụ

Mã Python cho mô-đun có tên aname thường nằm trong tệp tênaname.py. Đây là ví dụ về một mô-đun đơn giản, support.py -

def print_func( par ):
   print "Hello : ", par
   return

Báo cáo nhập khẩu

Bạn có thể sử dụng bất kỳ tệp nguồn Python nào làm mô-đun bằng cách thực hiện câu lệnh nhập trong một số tệp nguồn Python khác. Cácimport có cú pháp sau:

import module1[, module2[,... moduleN]

Khi trình thông dịch gặp một câu lệnh nhập, nó sẽ nhập mô-đun nếu mô-đun có trong đường dẫn tìm kiếm. Đường dẫn tìm kiếm là danh sách các thư mục mà trình thông dịch tìm kiếm trước khi nhập mô-đun. Ví dụ: để nhập mô-đun hello.py, bạn cần đặt lệnh sau ở đầu tập lệnh:

#!/usr/bin/python3

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Hello : Zara

Mô-đun chỉ được tải một lần, bất kể số lần nó được nhập. Điều này ngăn không cho việc thực thi mô-đun diễn ra lặp lại, nếu nhiều lần nhập xảy ra.

Tuyên bố từ ... nhập khẩu

Python's fromcâu lệnh cho phép bạn nhập các thuộc tính cụ thể từ một mô-đun vào không gian tên hiện tại. Cácfrom...import có cú pháp sau:

from modname import name1[, name2[, ... nameN]]

Ví dụ: để nhập hàm fibonacci từ mô-đun fib, hãy sử dụng câu lệnh sau:

#!/usr/bin/python3

# Fibonacci numbers module

def fib(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
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Câu lệnh này không nhập toàn bộ mô-đun fib vào không gian tên hiện tại; nó chỉ giới thiệu mục fibonacci từ mô-đun fib vào bảng ký hiệu chung của mô-đun nhập.

Câu lệnh from ... import *

Cũng có thể nhập tất cả các tên từ một mô-đun vào không gian tên hiện tại bằng cách sử dụng câu lệnh nhập 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.

Thực thi mô-đun dưới dạng tập lệnh

Trong một mô-đun, tên của mô-đun (dưới dạng một chuỗi) có sẵn dưới dạng giá trị của biến toàn cục __name__. Mã trong mô-đun sẽ được thực thi, giống như khi bạn nhập nó, nhưng với __name__ được đặt thành "__main__".

Thêm mã này vào cuối mô-đun của bạn -

#!/usr/bin/python3

# Fibonacci numbers module

def fib(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
if __name__ == "__main__":
   f = fib(100)
   print(f)

Khi bạn chạy đoạn mã trên, kết quả sau sẽ được hiển thị.

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Định vị mô-đun

Khi bạn nhập một mô-đun, trình thông dịch Python sẽ tìm kiếm mô-đun theo các trình tự sau:

  • Thư mục hiện tại.

  • Nếu không tìm thấy mô-đun, Python sẽ tìm kiếm từng thư mục trong biến shell PYTHONPATH.

  • Nếu vẫn 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 / python3 /.

Đường dẫn tìm kiếm mô-đun được lưu trữ trong hệ thống mô-đun hệ thống dưới dạng sys.pathBiến đổi. 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.

Biến PYTHONPATH

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.

Đây là một PYTHONPATH điển hình từ hệ thống Windows -

set PYTHONPATH = c:\python34\lib;

Và đây là một PYTHONPATH điển hình từ hệ thống UNIX -

set PYTHONPATH = /usr/local/lib/python

Không gian tên và phạm vi

Các biến là tên (định danh) ánh xạ tới các đối tượng. Không gian tên là một từ điển của các tên biến (khóa) và các đối tượng (giá trị) tương ứng của chúng.

  • Một câu lệnh Python có thể truy cập các biến trong không gian tên cục bộ và trong không gian tên chung . Nếu một biến cục bộ và một biến toàn cục có cùng tên, thì biến cục bộ sẽ phủ bóng lên 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 lớp tuân theo quy tắc xác định phạm vi giống như các hàm thông thường.

  • Python đưa ra các phỏng đoán có họ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 là cục bộ.

  • Do đó, để gán giá trị cho một biến toàn cục trong một hàm, trước tiên bạn phải sử dụng câu lệnh toàn cục.

  • Câu lệnh global VarName cho Python biết rằng VarName là một biến toàn cục. Python ngừng tìm kiếm không gian tên cục bộ cho biến.

Ví dụ, chúng tôi xác định một biến Money trong không gian tên chung. Trong hàm Money, chúng tôi gán cho Money một giá trị, do đó Python giả định Money là một biến cục bộ.

Tuy nhiên, chúng tôi đã truy cập giá trị của biến cục bộ Money trước khi đặt nó, vì vậy kết quả là một UnboundLocalError. Bỏ chú thích câu lệnh chung sẽ khắc phục được sự cố.

#!/usr/bin/python3

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print (Money)
AddMoney()
print (Money)

Hàm dir ()

Hàm tích hợp dir () trả về một danh sách các chuỗi đã được sắp xếp có chứa các tên được xác định 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 xác định trong một mô-đun. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python3

# Import built-in module math
import math

content = dir(math)
print (content)

Khi đoạn mã trên được thực thi, nó 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']

Ở đây, biến chuỗi đặc biệt __name__ là tên của mô-đun và __file__ là tên tệp mà từ đó mô-đun được tải.

Các hàm global () và local ()

Các globals()locals() các hàm có thể được sử dụng để trả về tên trong không gian tên cục bộ và toàn cục tùy thuộc vào vị trí nơi chúng được gọi.

  • Nếu locals() được gọi từ bên trong một hàm, nó sẽ trả về tất cả các tên có thể được truy cập cục bộ từ hàm đó.

  • Nếu globals() được gọi từ bên trong một hàm, nó sẽ trả về tất cả các tên có thể được truy cập toàn cục từ hàm đó.

Kiểu trả về của cả hai hàm này là từ điển. Do đó, tên có thể được trích xuất bằng cách sử dụngkeys() chức năng.

Hàm reload ()

Khi một mô-đun được nhập vào một tập lệnh, mã trong phần cấp cao nhất của mô-đun chỉ được thực thi một lần.

Do đó, nếu bạn muốn thực thi lại mã cấp cao nhất trong một mô-đun, bạn có thể sử dụng hàm reload () . Hàm reload () nhập lại một mô-đun đã nhập trước đó. Cú pháp của hàm reload () là:

reload(module_name)

Ở đây, module_name là tên của mô-đun bạn muốn tải lại và không phải là chuỗi chứa tên mô-đun. Ví dụ: để tải lại mô-đun hello, hãy làm như sau:

reload(hello)

Các gói bằng Python

Gói là cấu trúc thư mục tệp phân cấp xác định một môi trường ứng dụng Python duy nhất bao gồm các mô-đun và gói con và gói con con, v.v.

Xem xét một tệp Pots.py có sẵn trong thư mục Điện thoại. Tệp này có dòng mã nguồn sau:

#!/usr/bin/python3

def Pots():
print ("I'm Pots Phone")

Tương tự, chúng ta có hai tệp khác có các chức năng khác nhau có cùng tên như trên. Họ là -

  • Tệp Phone / Isdn.py có hàm Isdn ()

  • Tệp điện thoại / G3.py có chức năng G3 ()

Bây giờ, hãy tạo thêm một tệp __init__.py trong thư mục Điện thoại -

  • Phone/__init__.py

Để cung cấp tất cả các chức năng của bạn khi bạn đã nhập Điện thoại, bạn cần đặt các câu lệnh nhập 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 các dòng này vào __init__.py, bạn có tất cả các lớp này khi nhập gói Điện thoại.

#!/usr/bin/python3

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

Khi đoạn mã trên được thực thi, nó 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 tôi đã lấy ví dụ về một hàm duy nhất trong mỗi tệp, nhưng bạn có thể giữ nhiều hàm trong tệp của mình. Bạn cũng có thể xác định các lớp Python khác nhau trong các tệp đó và sau đó bạn có thể tạo các gói của mình từ các lớp đó.