images
23/09/2020 04:03 am

Python với hàm Main

Trong các ngôn ngữ lập trình (C, C++, JAVA, Golang,..), hàm main() sẽ được chạy mặc định khi chương trình được gọi. Vậy trong Python có điểm gì khác biệt?

Hàm main


Trong các ngôn ngữ lập trình (C, C++, JAVA, Golang,..), hàm main() sẽ được chạy mặc định khi chương trình được gọi. Vậy trong Python có điểm gì khác biệt. Chúng ta hãy cùng tìm hiểu!

Ta hãy cùng xem 3 đoạn code sau. Khá nhiều bạn lần đầu code Python sẽ thực sự bối rối.


example1.py:

print("Hello fb.com/techzonefun")

print("Welcome to Python. Happy coding!")


example2.py:

def print_hello():

   print("Hello fb.com/techzonefun")

   print("Welcome to Python. Happy coding!")


print_hello()


example3.py:

def print_hello():

   print("Hello fb.com/techzonefun")

   print("Welcome to Python. Happy coding!")


if __name__ == "__main__":

   print_hello()


Giờ ta hãy thử chạy 3 lệnh sau:

python3 example1.py

python3 example2.py

python3 example3.py


Ta sẽ cùng được 1 kết quả:

Hello fb.com/techzonefun

Welcome to Python. Happy coding!


Vậy sao phải viết thành 3 cách khác nhau làm gì. Viết 1 cách cho đơn giản.


__name__ là gì?


Python sử dụng __name__  để đánh tên cho module được thực thi vào lúc chạy chương trình. Trong Python, bạn có 2 cách thực thi một module:

- Module được chạy dưới dạng script: Tập hợp các lệnh hoặc các hàm được thực thi tuần tự.

- Module được import hay nhúng vào một module khác: Bạn import code từ một file sang một file khác để thực thi.


* Mọi chuyện thật đơn giản nếu bạn chỉ chạy Python dạng script. 

* Sẽ phức tạp hơn -và cũng hay ho hơn nhiều nếu bạn nhúng code (thư viện…) từ một module có sẵn logic sang sử dụng ở một file khác. Tại sao?

* Khi viết code chúng ta thường tách biệt logic thành các file riêng lẻ. Do đó để có thể reuse được logic cũ, thống nhất cách xử lý thì ta sẽ import logic từ nhiều file khác.


Trường hợp này, Python sinh ra một biến đặc biệt là __name__ mà giá trị của nó là kiểu xâu - String để cho biết thông tin về cách mà module đó đang được thực thi.


Quay lại 3 file trên, chúng ta sẽ thêm vào dòng code như sau:


print("Hello fb.com/techzonefun")

print("Welcome to Python. Happy coding!")

print("This is execution mode: ",__name__)


Tiếp theo ta sẽ thêm file show_info.py. 


import example1

print("Show info")


Trong file này ta sẽ lần lượt thay dòng lệnh import example1 bằng import example2 và example3 rồi tiến thành chạy lệnh:


python3 show_info.py


Trường hợp import example1:

Hello fb.com/techzonefun

Welcome to Python. Happy coding!

This is execution mode: example1

Show info


Trường hợp import example2:

Hello fb.com/techzonefun

Welcome to Python. Happy coding!

This is execution mode: example2

Show info


Trường hợp import example3:

Show info


Trong lần này bạn thấy các dòng print trong example3.py lúc này không được chạy.


* Khi bạn import một module khác để chạy, biến __name__ trong các module thể hiện tên của module. 

* Biến __name__ lưu giữ cách thức module được thực thi.

trường hợp bạn chạy python3 example1.py hoặc python3 example2.py hoặc python3 example3.py, bạn sẽ có cùng một kết quả sau:


Hello fb.com/techzonefun

Welcome to Python. Happy coding!

This is execution mode: __main__


Các trường hợp này, biến __name__ = “__main__”


* Lưu ý: Khi bạn import thì các câu lệnh print chỉ chạy 1 lần dù bạn có import nhiều lần.


Như vậy, chúng ta thấy rằng, nếu muốn kiểm soát một module chạy độc lập hoặc chạy dạng được import sang một module khác, chúng ta nên sử dụng biến __name__ để kiểm soát, giống như trong file example3.py. Nhờ đó ta có thể điều khiển luồng chạy với trường hợp chạy độc lập và trường hợp chạy khi ta import thư viện.


Best Pratices


Qua bài này chúng ta có thể rút ra được vài kinh nghiệm như sau:

* Thay vì viết dạng script với các câu lệnh, chúng ta nên để code trong hàm (function).

* Khi import module, trình thông dịch của Python sẽ thực thi các câu lệnh trong module đó theo trình tự được viết trong file.

* Việc gọi các hàm trong file nên được đặt trong hàm main. Bạn sử dụng biến __name__ như ví dụ ở trên để chạy logic chính. Logic của của luồng chính nên để trong hàm main(). Dù Python không bắt buộc điều đó nhưng theo convention này bạn sẽ rất dễ theo dõi logic. Vì cơ bản Developer thường hay quên. Tuân theo convention là một cách giúp bạn vượt qua trở ngại đó.


Mời các bạn xem thêm bài Python với các con số.


Bạn muốn học Python, cùng tham khảo khóa học này nhé Python cơ bản và ứng dụng thực tế.


- Tech Zone -

Thư giãn chút nào!!!

Bài viết liên quan