Chào mừng đến với ngày thứ 21 của loạt bài 30 Days of Python. Hôm nay chúng ta sẽ tìm hiểu về cách [và lý do tại sao] chia mã Python của chúng ta thành nhiều tệp
Tuy nhiên, trước tiên, chúng ta sẽ nhanh chóng tóm tắt cách thức hoạt động của quá trình nhập trong Python. Bắt đầu nào
Tóm tắt các lần nhập trong Python
Thực hiện một bản tóm tắt nhanh là đáng giá trong trường hợp này, vì điều quan trọng là chúng ta phải hiểu một số điểm trước khi bắt đầu và tạo nhiều tệp cho chương trình của mình
Nếu bạn muốn một cái gì đó toàn diện hơn một chút, vui lòng đọc lại bài đăng ngày 18 nơi chúng tôi lần đầu tiên đề cập đến hàng nhập khẩu
Nhập thêm tên vào import math
print[math.pi] # 3.14
7
import math
print[math.pi] # 3.14
Nếu bạn có một tệp Python và bạn gõ cái này
import json
print[globals[]]
Sau đó, nó sẽ hiển thị các tên hiện có trong không gian tên chung. Tên mô-đun sẽ nằm trong không gian tên chung, sẵn sàng để bạn sử dụng
Nhập cho phép chúng tôi truy cập các phần tử của mô-đun đã nhập
Sau khi nhập, chúng ta có thể làm như thế này để truy cập thứ gì đó bên trong mô-đun
import math
print[math.pi] # 3.14
Chúng tôi đã truy cập tên
import math
print[math.pi] # 3.14
8 bên trong mô-đun import math
print[math.pi] # 3.14
9. Trong trường hợp này, đó là giá trị của hằng số toán học, piCác cách khác để nhập khẩu
Bạn có thể sử dụng từ khóa
import myfile
0 để đặt tên khác cho mô-đun đã nhập trong mã của mình. Tôi không khuyên bạn nên làm điều này, mặc dù thỉnh thoảng bạn sẽ thấy nó được thực hiệnBạn cũng có thể sử dụng
import myfile
1 để thêm hầu hết mọi thứ từ mô-đun vào không gian tên chung của mình. Điều này có thể "làm ô nhiễm" không gian tên toàn cầu, lấp đầy nó bằng các biến. Hầu hết thời gian, nó không được khuyến khích mạnh mẽTại sao phải chia mã của bạn thành các tệp?
Bây giờ chúng tôi đã nhanh chóng tóm tắt lại chủ đề nhập, hãy nói về lý do tại sao chúng tôi có thể muốn chia mã của mình thành nhiều tệp
Câu hỏi đầu tiên chúng tôi nhận được khi bắt đầu thảo luận về vấn đề này là. "không dễ dàng hơn để giữ mã trong một tệp sao?"
Rốt cuộc, sau đó bạn không phải đối phó với hàng nhập khẩu
Giữ mã của bạn trong một tệp có thể giúp viết dễ dàng hơn [bắt đầu bằng. ], nhưng khi bạn viết nhiều hơn, nó sẽ khiến việc đọc và sửa đổi trở nên khó khăn hơn nhiều
Trong lập trình, khả năng đọc và khả năng bảo trì vượt trội hơn tốc độ viết bất kỳ ngày nào
Tách mối quan tâm và dễ tổ chức
Khi chúng tôi tách mã thành các tệp, điều quan trọng là chúng tôi có lý do để đặt một số mã vào một tệp nhất định. Thông thường, chúng ta đi theo mối quan tâm. Mã thực hiện một việc đi vào một tệp và mã thực hiện việc khác đi vào một tệp khác
Ví dụ: chúng tôi có thể có một tệp để tương tác với người dùng [bản in và đầu vào] và một tệp khác để lưu trữ dữ liệu [lưu và truy xuất mọi thứ từ một tệp]
Hiện tại, các mối quan tâm khác nhau của ứng dụng Python có thể không rõ ràng đối với bạn. Đó là bình thường. Theo thời gian, bạn sẽ tìm hiểu thêm về điều này. Với nhiều kinh nghiệm hơn, mọi thứ sẽ trở nên rõ ràng hơn khi mọi thứ sẽ được hưởng lợi từ việc chia thành các tệp
Tách các tệp theo mối quan tâm, giả sử chúng tôi đặt cho các tệp tên tốt, cũng giúp chúng tôi tìm mã dễ dàng hơn. Nếu bạn có hai bộ phim có tên là ________ 52 và ________ 53, bạn sẽ biết mình sẽ tìm thấy gì trong mỗi bộ phim.
Sử dụng tệp và thư mục cũng mang lại điều kỳ diệu cho tổ chức. Ví dụ, bạn có thể đặt các tệp liên quan đến làm việc với các loại lưu trữ dữ liệu khác nhau vào một thư mục
Cải thiện khả năng đọc
Khi các tệp của bạn phát triển, chúng bắt đầu khó đọc hơn. Bạn có thể có nhiều hàm và biến, và việc tìm kiếm mọi thứ có thể cần phải cuộn nhiều lần
Các trình soạn thảo hiện đại có các tính năng giúp dễ dàng tìm thấy nơi mọi thứ được xác định, nhưng đây không phải là một giải pháp hoàn hảo
Chia mã của bạn thành nhiều tệp là một cách tuyệt vời để tạo các tệp nhỏ hơn, tập trung hơn. Điều hướng các tệp nhỏ hơn sẽ dễ dàng hơn và do đó sẽ hiểu được nội dung của từng tệp này
Dễ sử dụng lại mã hơn
Khi bạn có nhiều tệp nhỏ hơn, tập trung, việc sử dụng lại nội dung của một tệp trong nhiều tệp khác sẽ dễ dàng hơn bằng cách nhập
Quá nhiều tệp
Cũng có thể có quá nhiều tệp. Đừng đặt mục tiêu làm cho các tệp của bạn càng nhỏ càng tốt. Thay vào đó, hãy khiến họ tập trung
Nếu mỗi tệp liên quan đến một khía cạnh của ứng dụng của bạn và mọi tệp đều có tên hay, thì việc điều hướng dự án của bạn sẽ dễ dàng
Làm việc với hai tệp
Hãy bắt đầu bằng cách đi vào một dự án Python mới [hoặc thay thế. nó thay thế] và tạo hai tệp. Hãy gọi chúng là
import myfile
4 và import myfile
5Hãy nhớ rằng thay thế. nó sẽ luôn chạy
import myfile
4 khi bạn nhấn nút "Chạy", như chúng tôi đã đề cập trong bài đăng ngày 0Vì cả hai tệp đều nằm trong cùng một thư mục nên bạn có thể nhập tệp này từ tệp kia
Hãy nhập cái này vào
import myfile
4chính. py ______5
Lưu ý rằng chúng tôi không nhập
import myfile
5 mà chỉ nhập import myfile
9. Python làm phần còn lạiĐiều gì xảy ra khi bạn nhập
Khi chúng tôi nhập tệp, Python sẽ chạy tệp. Nó phải làm điều đó để xác định tên nào tồn tại trong tệp đó
Sau đó, nó cung cấp tệp đó cho chúng tôi trong
import myfile
4 bằng cách đặt tham chiếu đến mô-đun trong không gian tên chungHãy thêm một
import json
print[globals[]]
71 trong import myfile
5tệp của tôi. py ______17
Và một cái khác trong
import myfile
4chính. py ______21
Hãy thử chạy nó
Bạn sẽ thấy rằng chúng tôi nhận được hai điều được in ra
import math
print[math.pi] # 3.14
2Đó là vì tệp
import myfile
5 đã được thực thi. Nó chứa một cuộc gọi import json
print[globals[]]
71, vì vậy Python đã in nội dung raThật hiếm khi bạn viết mã như thế này. Thay vào đó, các tệp bạn nhập thường sẽ chứa các biến và hàm, vì vậy khi bạn nhập chúng, không có gì thực sự xảy ra cho đến khi bạn thực sự sử dụng các biến và hàm đó
Hãy thêm điều gì đó thực tế hơn một chút vào
import myfile
5. Có lẽ một cái gì đó như thế nàytệp của tôi. py ______26
Bây giờ trong
import myfile
4, chúng ta có thể sử dụng hàm import json
print[globals[]]
78 mà chúng ta đã xác định trong import myfile
5chính. py ______30
Tuyệt quá
Đó là ý chính của nó. tách mọi thứ thành các tệp và nhập chúng
Cái gì [không] để đặt tên cho tệp của bạn
Không đặt tên cho các tệp của bạn giống như các mô-đun tích hợp
Ví dụ: nếu bạn tạo một tệp mới và đặt tên là
import math
print[math.pi] # 3.14
10, bạn sẽ gặp rắc rốiĐó là bởi vì nếu một tệp khác cố gắng chuyển sang
import math
print[math.pi] # 3.14
11, thì bạn sẽ không nhập mô-đun import math
print[math.pi] # 3.14
12 tích hợp sẵn cho phép chúng tôi nói chuyện với các tệp JSON. Thay vào đó, bạn sẽ nhập tệp import math
print[math.pi] # 3.14
10 của mìnhPython luôn tìm trong thư mục dự án để nhập trước khi xem các gói tích hợp hoặc đã cài đặt
Các tệp của bạn hoạt động giống như các mô-đun
Mọi thứ chúng tôi có thể làm với các mô-đun bên ngoài, chúng tôi có thể làm với các tệp của riêng mình
- Nhập toàn bộ tệp bằng
14 và sau đó gọi mọi thứ làimport math print[math.pi] # 3.14
15import math print[math.pi] # 3.14
- Nhập những thứ cụ thể với
16import math print[math.pi] # 3.14
- Nhập bí danh
- Chúng ta có thể làm
17 [mặc dù điều đó không được khuyến khích]import math print[math.pi] # 3.14
Sử dụng tệp và thư mục
Bạn có thể tạo các thư mục cho các tệp của mình nếu bạn nghĩ rằng điều đó sẽ giúp ích cho việc tổ chức. Theo kinh nghiệm của tôi, nó thường làm
Ví dụ: tạo một thư mục trong dự án của bạn có tên là
import math
print[math.pi] # 3.14
18 và chuyển import myfile
5 vào đó. Bây giờ cấu trúc tệp/thư mục của bạn sẽ trông như thế nàyimport math
print[math.pi] # 3.14
1Từ
import myfile
4, bây giờ bạn phải sử dụng cú pháp hơi khác để nhập import myfile
5chính. py ______44
Khi nhập, dấu chấm [
import math
print[math.pi] # 3.14
22] có nghĩa là "bên trong"Trong ví dụ trên, do đó, chúng tôi đang nhập
import myfile
9 từ bên trong import math
print[math.pi] # 3.14
18Nếu bạn có nhiều thư mục con, bạn sẽ cần sử dụng nhiều
import math
print[math.pi] # 3.14
22 để phân tách các cấp độ khác nhau của thư mục và tệp, như thế nàyimport math
print[math.pi] # 3.14
0Khi bạn đang nhập như thế này, bạn sẽ nhập những thứ cụ thể như chúng tôi đã thực hiện hoặc bạn sẽ sử dụng nhập bí danh. Một trong hai cái này đều tốt [cái đầu tiên thường tốt hơn]
26import math print[math.pi] # 3.14
27import math print[math.pi] # 3.14
Bạn thường sẽ không làm bất cứ điều gì như trong ví dụ dưới đây, bởi vì có thể mất khá nhiều thời gian để gõ ra
import math
print[math.pi] # 3.14
1Bạn cần tham khảo phần nhập hoàn chỉnh khi muốn sử dụng thứ gì đó, vì vậy bạn sẽ phải nhập rất nhiều vào mã của mình
import math
print[math.pi] # 3.14
28Bạn có thể làm điều đó nếu bạn không sử dụng tệp nhiều
Chế độ tập lệnh so với. chế độ mô-đun
Khi chúng tôi chạy một tệp [e. g. thay thế. nó, đó là
import myfile
4], chúng tôi nói rằng tệp đó được chạy ở "chế độ tập lệnh"Khi chúng tôi nhập một tệp, tệp đó sẽ chạy ở "chế độ mô-đun"
Hiện tại cấu trúc dự án của chúng tôi là như thế này
import math
print[math.pi] # 3.14
1Tôi sẽ xóa nội dung của cả hai tệp và tôi sẽ đặt tệp này vào
import myfile
5tệp của tôi. py ______03
Và tôi sẽ làm điều này trong
import myfile
4chính. py ______04
Bạn sẽ thấy đầu ra này
import math
print[math.pi] # 3.14
5Hãy nhớ rằng khi chúng tôi nhập, chúng tôi chạy tệp. Do đó, dòng đầu tiên thuộc về
import myfile
5 và dòng thứ hai thuộc về import myfile
4Tệp mà chúng tôi chạy luôn có biến
import math
print[math.pi] # 3.14
64 với giá trị là import math
print[math.pi] # 3.14
65. Đó đơn giản là cách Python cho chúng tôi biết rằng chúng tôi đã chạy tệp đóBất kỳ tệp nào không có
import math
print[math.pi] # 3.14
64 bằng với import math
print[math.pi] # 3.14
65 đã được nhậpHãy thử di chuyển mọi thứ xung quanh và xem đầu ra được tạo bởi
import myfile
5 thay đổi như thế nàoChỉ chạy mã trong chế độ tập lệnh
Đôi khi chúng tôi muốn đưa một số mã vào một tệp, nhưng chúng tôi chỉ muốn mã đó chạy nếu chúng tôi thực thi tệp đó trực tiếp—chứ không phải nếu chúng tôi đã nhập tệp
Vì chúng tôi biết rằng
import math
print[math.pi] # 3.14
64 phải bằng import math
print[math.pi] # 3.14
65 để tệp được chạy, chúng tôi có thể sử dụng câu lệnh ifChúng ta có thể gõ cái này vào
import myfile
5tệp của tôi. py ______06
Điều đó có thể cho phép chúng tôi chạy
import myfile
5 [chúng tôi không thể làm điều đó thay thế. nó mà không cần một số cấu hình bổ sung] và xem chức năng import math
print[math.pi] # 3.14
03 có hoạt động khôngĐó là một trong những trường hợp sử dụng chính của cấu trúc này. để giúp chúng tôi xem nội dung trong tệp có hoạt động hay không khi chúng tôi thường không muốn nó chạy
Một trường hợp sử dụng khác dành cho các tệp mà bạn thường không tự chạy. Đôi khi bạn có thể ghi một tệp để chương trình khác sử dụng, chẳng hạn
Sử dụng cấu trúc này sẽ cho phép bạn chạy tệp của mình để thử nghiệm, đồng thời không ảnh hưởng đến chức năng của tệp khi tệp được nhập bởi một chương trình khác
bài tập
Đối với bài tập [chỉ] hôm nay, chúng tôi sẽ cung cấp cho bạn một loạt mã tất cả trong một tệp
Truy cập mã tại đây
Nhiệm vụ của bạn là chia đoạn code đó thành nhiều file. Bạn có thể chọn số lượng và tệp nào bạn muốn chia mã thành, nhưng hãy nghĩ về lý do tại sao bạn đặt từng đoạn mã trong mỗi tệp
Sau đó, khi bạn hoàn tất, hãy xem giải pháp bài tập của chúng tôi để xem cách chúng tôi chia mã và tại sao
Dự định
Đối với dự án hôm nay, chúng tôi sẽ sử dụng thư viện Python để tạo một số biểu đồ. Là một phần của dự án này, bạn sẽ phải cấu trúc tốt mã của mình để nó không trở thành một mớ hỗn độn không thể đọc được