Mô-đun
Tạo một mô-đun đơn giản:
# mo_dun_fibo.py
# Mô-đun tính dãy Fibonacci
def tinh_fibo_den_n(n): # In dãy Fibonacci đến n
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a + b
print()
def lay_danh_sach_fibo_den_n(n): # Trả về danh sách dãy Fibonacci đến n
danh_sach = []
a, b = 0, 1
while a < n:
danh_sach.append(a)
a, b = b, a + b
return danh_sach
Thay đổi thư mục làm việc của trình thông dịch:
>>> import os
>>> os.getcwd()
'/duong/dan/hien/tai'
>>> os.chdir("/duong/dan/moi")
Nạp mô-đun mo_dun_fibo:
>>> import mo_dun_fibo
>>> mo_dun_fibo.tinh_fibo_den_n(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> mo_dun_fibo.lay_danh_sach_fibo_den_n(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> from mo_dun_fibo import tinh_fibo_den_n, lay_danh_sach_fibo_den_n
>>> tinh_fibo_den_n(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> from mo_dun_fibo import *
>>> tinh_fibo_den_n(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> import mo_dun_fibo as mf
>>> mf.tinh_fibo_den_n(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
>>> from mo_dun_fibo import tinh_fibo_den_n as tfn
>>> tfn(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
- Mô-đun có thể chứa các câu lệnh thực thi, chỉ được chạy khi lần đầu tiên được nhập.
- Mô-đun có thể nhập các mô-đun khác, sử dụng cú pháp
tên_mô_đun.tên_hàm. - Có thể nhập các hàm từ mô-đun khác vào mô-đun hiện tại.
- Khi sử dụng dấu sao (*), tên mô-đun không được nhập, cũng như các tên bắt đầu bằng dấu gạch dưới (_).
- Có thể đổi tên mô-đun hoặc tên hàm khi nhập.
Tải lại mô-đun đã nhập:
>>> import mo_dung_bar
>>> import importlib
>>> importlib.reload(mo_dung_bar)
Mô-đun Chuẩn
>>> import mo_dun_fibo, sys
>>> dir(mo_dun_fibo)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'tinh_fibo_den_n', 'lay_danh_sach_fibo_den_n']
>>> ds_so = [1, 2, 3, 4, 5]
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'ds_so', 'mo_dung_bar', 'mo_dun_fibo', 'os', 'sys']
Xử Lý Ngoại Lệ
Sử dụng try ... except để xử lý ngoại lệ:
>>> while True:
try:
x = int(input("Nhập một số: "))
break
except ValueError:
print("Không phải là số hợp lệ. Hãy thử lại...")
Nhập một số: a
Không phải là số hợp lệ. Hãy thử lại...
Nhập một số: 3
Kế thừa của lớp ngoại lệ:
>>> class LoaiB(Exception):
pass
>>> class LoaiC(LoaiB):
pass
>>> class LoaiD(LoaiC):
pass
>>> for loai in [LoaiB, LoaiC, LoaiD]:
try:
raise loai()
except LoaiD:
print("LoaiD")
except LoaiC:
print("LoaiC")
except LoaiB:
print("LoaiB")
LoaiB
LoaiC
LoaiD
Thông tin kèm theo ngoại lệ:
>>> try:
raise Exception('spam', 'eggs')
except Exception as thong_tin:
print(type(thong_tin)) # loại ngoại lệ
print(thong_tin.args) # thông số lưu trữ trong .args
print(thong_tin) # __str__ cho phép in trực tiếp thông số,
# nhưng có thể bị ghi đè trong các lớp con của ngoại lệ
x, y = thong_tin.args # giải nén thông số
print('x =', x)
print('y =', y)
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
Sử dụng else và finally:
>>> def chia_so(x, y):
try:
ket_qua = x / y
except ZeroDivisionError:
print("Chia cho không!")
else:
print("Kết quả là", ket_qua)
finally:
print("Đang thực thi khối finally")
>>> chia_so(2, 1)
Kết quả là 2.0
Đang thực thi khối finally
>>> chia_so(2, 0)
Chia cho không!
Đang thực thi khối finally
>>> chia_so("2", "1")
Đang thực thi khối finally
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in chia_so
TypeError: unsupported operand type(s) for /: 'str' and 'str'