Tại sao code trên không chạy được?
Là vì bạn indent, hay nói cách khác là cách đầu dòng, vào bị sai rồi. Phải viết lại như thế này. Đạt chạy ổn
import socket
def print_machine_info():
host_name = socket.gethostname()
ip_address = socket.gethostbyname(host_name)
print "Host name: %s" % host_name
print "IP address: %s" % ip_address
if __name__ == '__main__':
print_machine_info()
Kết quả trả ra:
Host name: DatAsus
IP address: 192.168.56.101
Tại sao nên sử dụng điều kiện if này?
Về ý nghĩa của nó thì nó giống như các C và các ngôn ngữ khác bắt đầu một chương trình. Ta cần có một điểm để bắt đầu. Thì khi ta viết if __name__ == '__main__':
thì Python sẽ thực thi phần lệnh phía sau của lệnh if
nếu file này được thực thi bằng lệnh python
. Đây là một phong cách lập trình của Python mà ta nên sử dụng.
Tại sao ta làm được như thế?
Lý do bên dưới của kỹ thuật này là khi Python interpreter đọc qua code Python thì nó sẽ chạy tất cả những lệnh mà nó thấy, từ trên xuống dưới.
Ví dụ nếu ta viết như sau thì nó sẽ in ra day nhau hoc
print "day",
print "nhau",
print "hoc"
Nhưng trước khi chạy những dòng code này Python Interpreter sẽ định nghĩa một số biến đặc biệt, trong đó có biến __name__
. Nếu biến __name__
này thuộc về một module mà ta include, trong ví dụ dưới đây Đạt có một file daynhauhoc.py
và file này include module whileloop
, thì biến __name__
này sẽ được gán bằng tên của module đó.
Trong file daynhauhoc.py
ta include whileloop
import whileloop
Trong file whileloop.py
ta có dòng này
print "__name__ of whileloop.py is %s" % __name__
Thì kết quả khi chạy file daynhauhoc.py
ta sẽ được
__name__
of whileloop.py is whileloop
Nếu biến __name__
này nằm trong file mà ta chạy trực tiếp bằng lệnh python. Thì Python Interpreter, tức trình thông dịch của Python, sẽ gán __name__
bằng __main__
. Nếu ta thêm dòng này vào file daynhauhoc.py
print "__name__ of daynhauhoc.py is %s" % __name__
Thì ta sẽ có toàn bộ output là
__name__
of whileloop.py is whileloop
__name__
of daynhauhoc.py is __main__
Tham khảo: http://stackoverflow.com/a/419185/1989112