You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 6.-modules.md
+51-51Lines changed: 51 additions & 51 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@ Nếu bạn thoát khỏi trình thông dịch Python và quay lại nó, các
7
7
8
8
Một mô-đun là một file chứa các định nghĩa và câu lệnh Python. Tên file là tên mô-đun có thêm hậu tố `.py`. Trong mô-đun, tên của mô-đun \ (dưới dạng chuỗi \) được lưu sẵn trong giá trị của biến toàn cục`__name__`. Ví dụ, sử dụng trình soạn thảo văn bản yêu thích của bạn để tạo một file có tên là `fibo.py` trong thư mục hiện tại với các nội dung sau:
9
9
10
-
```text
10
+
```text
11
11
# Mô-đun số Fibonacci
12
12
13
13
def fib (n): # viết chuỗi Fibonacci lên đến n
@@ -24,13 +24,13 @@ def fib2 (n): # trả về dãy Fibonacci đến n
24
24
result.append (b)
25
25
a, b = b, a + b
26
26
return result
27
-
```
27
+
```
28
28
29
29
Bây giờ vào trình thông dịch Python và import mô-đun này bằng lệnh sau: & gt; & gt; & gt;
30
30
31
31
```text
32
32
>>> import fibo
33
-
```
33
+
```
34
34
35
35
Chỗ này không đưa 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 tại; nó chỉ đưa tên mô-đun 'fibo` thôi. Sau đó sử dụng tên mô-đun, bạn có thể truy cập các hàm: & gt; & gt; & gt;
36
36
@@ -41,15 +41,15 @@ Chỗ này không đưa tên của các hàm được định nghĩa trong `fibo
41
41
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
42
42
>>> fibo .__ name__
43
43
'fibo'
44
-
```
44
+
```
45
45
46
46
Nếu bạn định sử dụng hàm thường xuyên, bạn có thể gán nó cho một tên cục bộ: & gt; & gt; & gt;
47
47
48
48
```text
49
49
>>> fib = fibo.fib
50
50
>>> fib (500)
51
51
1 1 2 3 5 8 13 21 34 55 89 144 233 377
52
-
```
52
+
```
53
53
54
54
### 6.1. Thông tin thêm về Mô-đun
55
55
@@ -65,39 +65,39 @@ Có một biến thể của câu lệnh [`import`] (https://docs.python.org/3/r
65
65
>>> from fibo import fib, fib2
66
66
>>> fib (500)
67
67
1 1 2 3 5 8 13 21 34 55 89 144 233 377
68
-
```
68
+
```
69
69
70
70
Cách này không đưa tên mô-đun vào những thứ được import vào bảng symbol cục bộ \ (ví dụ, trong ví dụ, `fibo` không được sẽ không được thêm vào bảng \).
71
71
72
72
Thậm chí còn có một biến thể để import tất cả các tên mà mô-đun đã định nghĩa nữa: & gt; & gt; & gt;
73
73
74
-
```text
74
+
```text
75
75
>>> from fibo import *
76
76
>>> fib (500)
77
77
1 1 2 3 5 8 13 21 34 55 89 144 233 377
78
-
```
78
+
```
79
79
80
80
Đoạn này sẽ nhập tất cả các định nghĩa trừ các tên bắt đầu bằng dấu gạch dưới \ (`_`\). Trong hầu hết các trường hợp, các lập trình viên Python không sử dụng cách này vì nó sẽ đưa một số tên không được hiểu rõ vào trình thông dịch, dẫn đến có nguy cơ một số tên trùng bị ghi đè giá trị hay mất giá trị được gán lúc trước.
81
81
82
82
Lưu ý rằng nói chung, việc import sử dụng `*` từ một mô-đun hoặc gói được không được khuyến khích, vì nó làm cho code trở nên khó đọc. Tuy nhiên, bạn có thể sử dụng nó để đỡ phải gõ nhiều khi làm việc ở chế độ tương tác.
83
83
84
84
Nếu tên mô-đun được theo sau bởi [`as`] (https://docs.python.org/3/reference/compound_stmts.html#as), thì tên phía sau [` as`] (https: // docs. python.org/3/reference/compound_stmts.html#as) được liên kết trực tiếp với mô-đun đã nhập. & gt; & gt; & gt;
85
85
86
-
```text
86
+
```text
87
87
>>> import fibo như fib
88
88
>>> fib.fib (500)
89
89
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
90
-
```
90
+
```
91
91
92
92
Điều này là để import các mô-đun như cách mà `import fibo` làm, chỉ có sự khác biệt duy nhất giờ có một cái tên là ` fib` được định nghĩa thôi.
93
93
94
94
Nó cũng có thể dùng được khi sử dụng [`from`] (https://docs.python.org/3/reference/simple_stmts.html#from) với các tác dụng tương tự: & gt; & gt; & gt;
95
95
96
-
```text
96
+
```text
97
97
>>> từ fibo import fib là fibonacci
98
98
>>> fibonacci (500)
99
99
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
100
-
```
100
+
```
101
101
102
102
Chú thích
103
103
@@ -107,31 +107,31 @@ Vì lý liên quan đến tính hiệu quả, mỗi mô-đun chỉ được impo
107
107
108
108
Khi bạn chạy một mô-đun Python với
109
109
110
-
```text
110
+
```text
111
111
python fibo.py <arguments>
112
-
```
112
+
```
113
113
114
114
code trong mô-đun sẽ được thực hiện, sẽ giống như khi bạn import nó, nhưng với giá trị `__name__` được gán là ` "__main __" `. Điều đó có nghĩa là bằng cách thêm mã này vào cuối mô-đun của bạn:
115
115
116
-
```text
116
+
```text
117
117
nếu __name__ == "__main__":
118
118
import sys
119
119
fib (int (sys.argv [1]))
120
-
```
120
+
```
121
121
122
122
bạn có thể làm cho file vừa có thể được sử dụng làm script cũng vừa là một mô-đun, bởi vì code cái đọc giá trị từ dòng lệnh chỉ chạy nếu mô-đun được thực thi dưới dạng file "main":
123
123
124
-
```text
124
+
```text
125
125
$ python fibo.py 50
126
126
1 1 2 3 5 8 13 21 34
127
-
```
127
+
```
128
128
129
129
Nếu mô-đun được import, thì code sẽ không chạy: & gt; & gt; & gt;
130
130
131
-
```text
131
+
```text
132
132
>>> import fibo
133
133
>>>
134
-
```
134
+
```
135
135
136
136
Điều này thường được sử dụng cho việc hoặc là cung cấp một giao diện người dùng thuận tiện cho một mô-đun, hoặc cho mục đích kiểm thử \ (chạy mô-đun như một scrip thực hiện một loạt test case \).
137
137
@@ -168,7 +168,7 @@ Một số mẹo cho các chuyên gia:
168
168
169
169
Python đi kèm với một thư viện các mô-đun chuẩn, được mô tả trong một tài liệu riêng biệt, Tham khảo Thư viện Python \ ("Tham khảo Thư viện" sau đây \). Một số mô-đun được tích hợp vào trình thông dịch; chúng cung cấp quyền truy cập vào các hoạt động không phải là một phần cốt lõi của ngôn ngữ nhưng vẫn được tích hợp sẵn, hoặc để có hiệu quả hoặc cung cấp quyền truy cập vào các nguyên bản của hệ điều hành như các cuộc gọi hệ thống. Tập hợp các mô-đun như vậy là một tùy chọn cấu hình cũng phụ thuộc vào nền tảng cơ bản. Ví dụ, mô-đun [`winreg`] (https://docs.python.org/3/library/winreg.html#module-winreg) chỉ được cung cấp trên các hệ thống Windows. Một mô-đun đặc biệt đáng chú ý: [`sys`] (https://docs.python.org/3/library/sys.html#module-sys), được xây dựng trong mọi trình thông dịch Python. Các biến `sys.ps1` và` sys.ps2` xác định các chuỗi được sử dụng làm lời nhắc chính và phụ: & gt; & gt; & gt;
170
170
171
-
```text
171
+
```text
172
172
>>> import sys
173
173
>>> sys.ps1
174
174
'>>>'
@@ -178,22 +178,22 @@ Python đi kèm với một thư viện các mô-đun chuẩn, được mô tả
178
178
C> in ('Yuck!')
179
179
Kinh quá!
180
180
C>
181
-
```
181
+
```
182
182
183
183
Hai biến này chỉ được xác định nếu trình thông dịch ở chế độ tương tác.
184
184
185
185
Biến `sys.path` là một danh sách các chuỗi xác định đường dẫn tìm kiếm của trình thông dịch cho các mô-đun. Nó được khởi tạo cho một đường dẫn mặc định được lấy từ biến môi trường [`PYTHONPATH`] (https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH), hoặc từ một mặc định dựng sẵn nếu [`PYTHONPATH`] (https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH) chưa được đặt. Bạn có thể sửa đổi nó bằng cách sử dụng các hoạt động danh sách chuẩn: & gt; & gt; & gt;
Hàm dựng sẵn [`dir ()`] (https://docs.python.org/3/library/functions.html#dir) được sử dụng để tìm ra tên mà mô-đun xác định. Nó trả về danh sách các chuỗi được sắp xếp: & gt; & gt; & gt;
Lưu ý rằng nó liệt kê tất cả các loại tên: biến, mô-đun, chức năng, v.v.
231
231
232
232
[`dir ()`] (https://docs.python.org/3/library/functions.html#dir) không liệt kê tên của các hàm và biến tích hợp sẵn. Nếu bạn muốn một danh sách, chúng được định nghĩa trong mô-đun chuẩn [`builtins`] (https://docs.python.org/3/library/builtins.html#module-builtins): & gt; & gt; & gt;
Các gói là một cách để cấu trúc không gian tên mô-đun của Python bằng cách sử dụng "tên mô-đun chấm chấm". Ví dụ, tên module `AB` chỉ định một mô-đun con có tên là` B` trong một gói có tên `A`. Cũng giống như việc sử dụng các mô-đun tiết kiệm cho các tác giả của các mô-đun khác nhau phải lo lắng về tên biến toàn cục của nhau, việc sử dụng tên mô-đun chấm chấm lưu các tác giả của các gói đa mô-đun như NumPy hoặc Pillow khỏi phải lo lắng về các tên mô-đun của nhau .
271
271
272
272
Giả sử bạn muốn thiết kế một tập hợp các mô-đun \ (một "gói" \) để xử lý thống nhất các file âm thanh và dữ liệu âm thanh. Có nhiều định dạng file âm thanh khác nhau \ (thường được nhận dạng bởi phần mở rộng của chúng, ví dụ: `.wav`,` .aiff`, `.au`\), vì vậy bạn có thể cần tạo và duy trì một tập hợp các mô-đun ngày càng tăng cho chuyển đổi giữa các định dạng file khác nhau. Cũng có nhiều thao tác khác nhau mà bạn có thể muốn thực hiện trên dữ liệu âm thanh \ (chẳng hạn như trộn, thêm echo, áp dụng hàm cân bằng, tạo hiệu ứng stereo nhân tạo \), ngoài ra bạn sẽ viết luồng mô-đun không bao giờ kết thúc để thực hiện các hoạt động này. Đây là một cấu trúc có thể cho gói của bạn \ (được biểu thị bằng hệ thống file phân cấp \):
273
273
274
-
```text
274
+
```text
275
275
Gói âm thanh / cấp cao nhất
276
276
__init__.py Khởi tạo gói âm thanh
277
277
định dạng / Gói con để chuyển đổi định dạng file
@@ -295,47 +295,47 @@ Gói âm thanh / cấp cao nhất
295
295
vocoder.py
296
296
karaoke.py
297
297
...
298
-
```
298
+
```
299
299
300
300
Khi nhập gói, Python tìm kiếm thông qua các thư mục trên `sys.path` để tìm thư mục con của gói.
301
301
302
302
Các file `__init __. Py` được yêu cầu để làm cho Python xử lý các thư mục có chứa các gói; điều này được thực hiện để ngăn các thư mục có tên chung, chẳng hạn như `chuỗi`, từ vô tình ẩn các mô-đun hợp lệ xảy ra sau này trên đường dẫn tìm kiếm mô-đun. Trong trường hợp đơn giản nhất, `__init __. Py` chỉ có thể là một file rỗng, nhưng nó cũng có thể thực thi mã khởi tạo cho gói hoặc đặt biến` __all__`, được mô tả sau.
303
303
304
304
Người dùng của gói có thể nhập các mô-đun riêng lẻ từ gói, ví dụ:
305
305
306
-
```text
306
+
```text
307
307
import sound.effects.echo
308
-
```
308
+
```
309
309
310
310
Điều này tải submodule `sound.effects.echo`. Nó phải được tham chiếu với tên đầy đủ của nó.
311
311
312
-
```text
312
+
```text
313
313
sound.effects.echo.echofilter (đầu vào, đầu ra, độ trễ = 0,7, atten = 4)
314
-
```
314
+
```
315
315
316
316
Một cách khác để nhập mô-đun con là:
317
317
318
-
```text
318
+
```text
319
319
từ sound.effects import echo
320
-
```
320
+
```
321
321
322
322
Điều này cũng nạp submodule `echo`, và làm cho nó có sẵn mà không có tiền tố gói của nó, vì vậy nó có thể được sử dụng như sau:
323
323
324
-
```text
324
+
```text
325
325
echo.echofilter (đầu vào, đầu ra, độ trễ = 0,7, atten = 4)
326
-
```
326
+
```
327
327
328
328
Tuy nhiên, một biến thể khác là nhập hàm hoặc biến mong muốn trực tiếp:
329
329
330
-
```text
330
+
```text
331
331
từ echofilter import sound.effects.echo
332
-
```
332
+
```
333
333
334
334
Một lần nữa, điều này nạp submodule `echo`, nhưng điều này làm cho hàm của nó` echofilter () `có sẵn trực tiếp:
335
335
336
-
```text
336
+
```text
337
337
echofilter (đầu vào, đầu ra, độ trễ = 0,7, atten = 4)
338
-
```
338
+
```
339
339
340
340
Lưu ý rằng khi sử dụng `từ mục nhập gói`, mục có thể là một mô-đun con (hoặc gói con \) của gói, hoặc một số tên khác được định nghĩa trong gói, như một hàm, lớp hoặc biến. Câu lệnh `import` đầu tiên kiểm tra xem mục được định nghĩa trong gói; nếu không, nó giả định nó là một mô-đun và cố gắng tải nó. Nếu nó không tìm thấy nó, một ngoại lệ [`ImportError`] (https://docs.python.org/3/library/exceptions.html#ImportError) được nâng lên.
341
341
@@ -347,21 +347,21 @@ Bây giờ điều gì sẽ xảy ra khi người dùng viết `từ sound.effec
347
347
348
348
Giải pháp duy nhất là dành cho tác giả gói để cung cấp chỉ mục rõ ràng về gói. Câu lệnh [`import`] (https://docs.python.org/3/reference/simple_stmts.html#import) sử dụng quy ước sau đây: nếu mã` __init __. Py` của một gói định nghĩa một danh sách có tên `__all__`, nó được lấy là danh sách các tên mô-đun cần được nhập khi `từ gói nhập * * gặp phải. Tùy thuộc vào tác giả gói để cập nhật danh sách này khi phiên bản mới của gói được phát hành. Tác giả gói cũng có thể quyết định không hỗ trợ nó, nếu họ không thấy sử dụng để nhập \ * từ gói của họ. Ví dụ, file `sound / effects / __ init __. Py` có thể chứa đoạn mã sau:
349
349
350
-
```text
350
+
```text
351
351
__all__ = ["echo", "surround", "reverse"]
352
-
```
352
+
```
353
353
354
354
Điều này có nghĩa là `from sound.effects import *` sẽ nhập ba tên con được đặt tên là `sound`package.
355
355
356
356
Nếu `__all__` không được định nghĩa, câu lệnh` from sound.effects import * `hiện _not_ import tất cả các submodules từ gói` sound.effects` vào không gian tên hiện tại; nó chỉ đảm bảo rằng gói `sound.effects` đã được nhập \ (có thể chạy bất kỳ mã khởi tạo nào trong` __init __. py`\) và sau đó import bất kỳ tên nào được định nghĩa trong gói. Điều này bao gồm bất kỳ tên được định nghĩa \ (và submodules được nạp một cách rõ ràng \) bởi `__init __. Py`. Nó cũng bao gồm bất kỳ mô-đun con nào của gói được tải một cách rõ ràng bằng các câu lệnh [`import`] (https://docs.python.org/3/reference/simple_stmts.html#import) trước đó. Hãy xem xét mã này:
357
357
358
-
```text
358
+
```text
359
359
import sound.effects.echo
360
360
import sound.effects.surround
361
361
từ import sound.effects *
362
-
```
362
+
```
363
363
364
-
Trong ví dụ này, các mô đun `echo` và` surround` được nhập vào không gian tên hiện tại vì chúng được định nghĩa trong gói `sound.effects` khi câu lệnh` from ... import` được thi hành. \ (Điều này cũng hoạt động khi ```` `` được xác định.\)
364
+
Trong ví dụ này, các mô đun `echo` và` surround` được nhập vào không gian tên hiện tại vì chúng được định nghĩa trong gói `sound.effects` khi câu lệnh` from ... import` được thi hành. \ (Điều này cũng hoạt động khi ```` `` được xác định.\)
365
365
366
366
Mặc dù các mô-đun nhất định được thiết kế để chỉ xuất các tên theo một số mẫu nhất định khi bạn sử dụng `import *`, nó vẫn được coi là thực hành không tốt trong mã sản xuất.
367
367
@@ -373,11 +373,11 @@ Khi các gói được cấu trúc thành các gói con \ (như với gói `soun
373
373
374
374
Bạn cũng có thể viết import tương đối, với dạng `from module import name` của câu lệnh import. Các mục nhập này sử dụng các dấu chấm đầu để chỉ ra các gói hiện tại và cha mẹ có liên quan đến việc nhập tương đối. Từ ví dụ `surround`module, bạn có thể sử dụng:
375
375
376
-
```text
376
+
```text
377
377
từ . import echo
378
378
từ .. định dạng nhập
379
379
từ bộ cân bằng import ..filters
380
-
```
380
+
```
381
381
382
382
Lưu ý rằng import tương đối dựa trên tên của mô-đun hiện tại. Vì tên của mô-đun chính luôn là `" __main __ "`, các mô-đun được sử dụng làm mô đun chính của ứng dụng Python phải luôn sử dụng import tuyệt đối.
0 commit comments