1. Biến __name__ và cách Python xác định nó [0]

thumbnail Biến `__name__` là một biến đặc biệt trong Python, có giá trị thay đổi tùy thuộc vào cách tệp Python được thực thi, giúp xác định xem tệp đó đang chạy trực tiếp hay được nhập vào một tệp khác.

1.1. Giá trị của __name__ khi chạy trực tiếp [14]

  1. Khi một tệp Python được chạy trực tiếp từ dòng lệnh, giá trị của biến __name__ sẽ là chuỗi __main__ [16].
  2. Điều này tương tự như cách các ngôn ngữ như C hoặc C++ có một điểm bắt đầu chương trình là hàm main [17].

1.2. Giá trị của __name__ khi được nhập (import) [28]

  1. Khi một tệp Python được nhập (import) vào một tệp khác, giá trị của biến __name__ sẽ là tên của chính tệp đó (tên module) [28].
  2. Ví dụ, nếu tệp sub_module.py được nhập vào main_module.py, thì trong sub_module.py, __name__ sẽ có giá trị là "sub_module" [28].

1.3. Minh họa sự khác biệt về giá trị __name__ [14]

  1. Khi chạy tệp main_module.py trực tiếp, biến __name__ trong tệp này có giá trị là __main__ [15].
  2. Nếu có một tệp sub_module.py và nó được nhập vào main_module.py, thì khi main_module.py chạy, __name__ trong sub_module.py sẽ có giá trị là sub_module [28].
  3. Ngược lại, nếu chạy sub_module.py trực tiếp, __name__ trong sub_module.py sẽ là __main__, và nếu main_module.py được nhập vào sub_module.py, thì __name__ trong main_module.py sẽ là main_module [31].

2. Cấu trúc if __name__ == "__main__": và vai trò của nó [37]

thumbnail

<gen-svg-visual description="A flowchart illustrating the conditional execution of Python code. The main path shows a Python script being executed directly, leading to the 'name' variable being set to 'main'. This triggers the code block inside the 'if name == "main":' statement. A secondary path shows the same Python script being imported as a module into another script. In this case, the 'name' variable is set to the module's name, and the code block inside the 'if' statement is skipped. The visual should clearly differentiate between direct execution and import scenarios." /> Cấu trúc if __name__ == "__main__": là một quy ước lập trình chuẩn trong Python, cho phép kiểm soát code nào sẽ chạy khi tệp được thực thi trực tiếp, ngăn chặn việc thực thi không mong muốn khi tệp được nhập như một module.

2.1. Mục đích của if __name__ == "__main__": [37]

  1. Cấu trúc này được sử dụng để đảm bảo rằng một khối mã chỉ được thực thi khi tệp Python đó là tệp chính đang chạy, chứ không phải khi nó được nhập vào một tệp khác. [70].
  2. Điều này ngăn chặn các hàm hoặc code trong khối if chạy một cách tự động khi module được nhập, chỉ cho phép các hàm được định nghĩa trong module đó được sử dụng. [71].

2.2. Minh họa cách if __name__ == "__main__": hoạt động [38]

  1. Trong một tệp Python, nếu có các hàm được định nghĩa và sau đó được gọi trong một hàm main, khối main này thường được đặt bên trong câu lệnh if __name__ == "__main__": [39].
  2. Khi tệp này được chạy trực tiếp, __name__ là __main__, điều kiện if đúng, và hàm main sẽ được gọi, thực thi các lệnh bên trong nó [54].
  3. Tuy nhiên, nếu tệp này được nhập vào một tệp khác, __name__ sẽ không phải là __main__, điều kiện if sai, và hàm main (cùng với các lệnh bên trong nó) sẽ không được thực thi [66].
  4. Điều này cho phép các hàm được định nghĩa trong module (ví dụ: welcome và function_one) vẫn có thể được nhập và sử dụng bởi tệp khác mà không kích hoạt các hành động không mong muốn từ hàm main của module đó [60].

2.3. Lợi ích của việc sử dụng if __name__ == "__main__": [77]

  1. Việc đặt các hàm hoặc code chỉ nên chạy khi tệp là chính vào trong khối if __name__ == "__main__": giúp tạo ra các module Python chuẩn, có thể tái sử dụng. [77].
  2. Khi một module được nhập vào tệp khác, chỉ những gì được định nghĩa (như các hàm) mới có sẵn, còn các hành động thực thi chính (như gọi hàm main) sẽ bị bỏ qua, đảm bảo tính module hóa và tránh xung đột. [77].

3. Xây dựng chương trình Email Slicer [78]

thumbnail

3.1. Mục tiêu của chương trình Email Slicer [78]

  1. Chương trình Email Slicer được tạo ra để tách lấy username và email domain từ một địa chỉ email do người dùng nhập vào. [80].

3.2. Cấu trúc chương trình Python chuẩn [82]

  1. Một chương trình Python chuẩn thường bao gồm một hàm main để chứa logic chính và một khối if __name__ == "__main__": để gọi hàm main khi tệp được chạy trực tiếp [83].
  2. Ví dụ:
    def main(): print("Hello World") if __name__ == "__main__": main() 
    Khi chạy tệp này, nó sẽ in ra "Hello World" [87].

3.3. Lấy input email từ người dùng [88]

  1. Chương trình yêu cầu người dùng nhập địa chỉ email của họ bằng hàm input() [89].
  2. Giá trị nhập vào được lưu trữ trong biến email [91].
  3. Sau đó, email này được in ra để xác nhận đã nhận đúng [92].

3.4. Xử lý tách email thành username và domain [96]

  1. Một hàm process_email được định nghĩa để nhận địa chỉ email làm đầu vào và trả về username cùng email domain [97].
  2. Tách username:
    • Username là phần của email từ đầu cho đến ký tự @ [100].
    • Hàm email.index('@') tìm vị trí của ký tự @ [103].
    • Phần chuỗi từ đầu đến vị trí @ (không bao gồm @) được gán cho biến username [104].
  3. Tách email domain:
    • Domain là phần của email bắt đầu từ ký tự ngay sau @ cho đến hết chuỗi [114].
    • Vị trí bắt đầu của domain là vị trí của @ cộng thêm 1 [115].
    • Phần chuỗi từ vị trí này đến cuối cùng được gán cho biến domain [117].
  4. Hàm process_email trả về cả username và domain dưới dạng một danh sách (list) [120].

3.5. Hiển thị kết quả username và domain [125]

  1. Trong hàm main, kết quả trả về từ process_email (username và domain) được gán vào hai biến tương ứng: user_name và email_domain [126].
  2. Một hàm print_message được tạo ra để hiển thị username và domain một cách rõ ràng [131].
  3. Hàm main gọi print_message với hai biến user_name và email_domain làm đối số [137].

3.6. Ví dụ chạy chương trình Email Slicer [139]

  1. Khi chạy chương trình và nhập email youtube@codeXplore.net, kết quả hiển thị là:
    • Username: YouTube
    • Email domain: codeXplore.net [141].
  2. Chương trình này có thể được mở rộng để xử lý nhiều địa chỉ email, ví dụ như khi nhập một danh sách các email từ một nguồn khác thay vì chỉ từ input người dùng [148].

4. Tái sử dụng module Email Slicer trong một chương trình khác [149]

thumbnail

4.1. Kịch bản sử dụng module Email Slicer [149]

  1. Giả sử có một danh sách các địa chỉ email cần xử lý, ví dụ: ["aodi@gmail.com", "youtube@codeXplore.net", "liverpool@winner.com"] [150].
  2. Các hàm xử lý email (như process_email và print_message) được định nghĩa trong một tệp riêng, ví dụ codeXplore.py.
  3. Một tệp chính khác, ví dụ main_module.py, sẽ nhập (import) các hàm này từ codeXplore.py để xử lý danh sách email [152].

4.2. Cấu trúc tệp main_module.py [152]

  1. Tệp main_module.py cũng tuân theo cấu trúc chuẩn với if __name__ == "__main__": và một hàm main [152].
  2. Nó nhập các hàm cần thiết từ module codeXplore: process_email và print_message [154].
  3. Trong hàm main của main_module.py, một vòng lặp for sẽ duyệt qua từng email trong danh sách [158].
  4. Với mỗi email, hàm process_email được gọi để lấy username và domain, sau đó hàm print_message được dùng để hiển thị kết quả [158].

4.3. Kết quả khi chạy main_module.py [160]

  1. Khi chạy main_module.py, chương trình sẽ xử lý từng email trong danh sách và hiển thị kết quả tách username và domain cho mỗi email.
    • aodi@gmail.com -> Username: aodi, Domain: gmail.com
    • youtube@codeXplore.net -> Username: youtube, Domain: codeXplore.net
    • liverpool@winner.com -> Username: liverpool, Domain: winner.com [160].

4.4. Vấn đề khi không sử dụng if __name__ == "__main__": trong module [165]

  1. Nếu hàm main trong module codeXplore.py (hàm thực hiện việc nhập input và in ra kết quả) không được đặt bên trong if __name__ == "__main__":, nó sẽ tự động chạy khi module được nhập [165].
  2. Ví dụ, nếu chạy main_module.py và nó nhập codeXplore.py, thì hàm main của codeXplore.py sẽ chạy, yêu cầu nhập email, mặc dù mục đích của main_module.py chỉ là xử lý danh sách email đã có sẵn [171].
  3. Điều này dẫn đến việc chương trình yêu cầu nhập liệu không cần thiết và gây ra hành vi không mong muốn, làm mất đi tính module hóa của code [174].

4.5. Tầm quan trọng của if __name__ == "__main__": [175]

  1. Bằng cách đặt hàm main của module vào trong khối if __name__ == "__main__":, chúng ta đảm bảo rằng code đó chỉ chạy khi module được thực thi trực tiếp, không chạy khi bị nhập vào module khác [175].
  2. Điều này rất quan trọng để xây dựng các chương trình Python lớn và có cấu trúc chuẩn, cho phép tái sử dụng code một cách hiệu quả và tránh các xung đột không đáng có [177].