python程序中经常出现是干嘛的?

简单来说,这句话的作用就是判断你执行的是不是当前文件?如果是,则执行if块里面的,如果不是就不会执行。

是不是有些拗口,什么叫我执行的是不是当前文件?这就得从python的模块概念说起。

首先得先明白python是一个解释型语言,它与C不一样并不是先全部编译并链接好再进行执行的,而是从你运行的那个模块的最顶行开始,逐行解释执行。所以,最顶层(没有被缩进)的代码都会被执行,而我们import module的操作就是把module这个模块导入到当前模块里面,并且把它执行一遍。可以通过例子理解下:

1
2
3
4
5
6
7
# test1.py

def greet(name):
print("Hello, " + name + "!")

message = "Welcome to my module"
print(message)
1
2
3
4
5
6
7
8
9
10
11
12
# main_test.py

import test1

test1.greet("Alice") # 调用模块中的函数
print(test1.message) # 访问模块中的变量

'''
Welcome to my module
Hello, Alice!
Welcome to my module
'''

从输出结果判断我们可以看出,确实是导入module再执行module,然后继续往下执行。

[^tips]: 如此一来,我们也能理解在很多python项目中使用方法为什么一般都是from XXX import XXX,如果直接import,开销也就太大了。

每次import都会把导入的模块执行一遍,但又不是所有的模块都只有函数,如果里面有输出或者其他操作,这些又不是我需要的,怎么处理呢。简而言之,如何避免某些代码在模块被导入后被执行? — 这恰恰是 if __name__ == '__main__'的作用。

__name__ 是python的一个内置属性,其用于标识当前模块的名称。当一个模块被直接执行时,其名称被设置为 "__main__"。而当一个模块被导入到其他模块中时,其名称则被设置为模块的实际名称。这里可以举例理解

1
2
3
4
# main_test.py

print('这里是模块:', __name__)
# 这里是模块: __main__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# test1.py
print('这里是模块:', __name__)


# main_test.py

import test1

print('这里是模块:', __name__)


'''
这里是模块: test1
这里是模块: __main__
'''

了解了__name__是什么,那么if __name__ == '__main__'的作用就显而易见了。就是判断当前执行的模块是不是我,如果不是,我后面的程序就不执行,如果是就执行。

-------------已经到底啦!-------------

欢迎关注我的其它发布渠道