5.9.2 程序入口

5.9.2 程序入口

学过Java、C、C++的程序员应该都知道,每次开启一个程序,都必须写一个主函数作为程序的入口,也就是我们常说的main()函数。

与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始的,逐行进行翻译并执行,所以最顶层(没有被缩进)的代码都会被执行,Python中并不需要一个统一的main()作为程序的入口。

相信大家在看别人的Python程序时,可能会在大部分的程序后看到这样一句代码:

在某种意义上讲,“if__name__=='__main__':”像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if__name__=='__main__':”这条代码的意义之一。

在Python中,如果代码写得规范一些,通常会写上“if__name__=='__main__':”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行。

总的来说,这句代码的作用是既能保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入。

下面通过几个例子帮助大家理解这句代码。

通过输出__name__得到__main__。这说明__name__本身其实就是一个变量,不过比较特殊。实际上,它是在程序执行前就被创建并赋值的,而赋值的机制是这里的关键。在当前程序被当作主程序运行时,__name__被自动赋值为固定的字符串__main__;当它被当作模块被其他文件调用时,自动被赋值为模块所在的文件名。

定义一个函数,并保存为文件hello.py:

输出结果:

将上例hello.py中的判断语句“if__name__=='__main__':”去掉,保存为hello2.py,发现程序照样可以运行,且输出与带有判断语句的程序一样:

输出结果:

但当它不要判断语句“if__name__=='__main__':”且它作为模块导入时,输出的结果可能就与大家想象中的有点偏差了。

下面同样将hello.py和hello2.py作为模块导入,来查看结果的区别。

运行结果:

运行结果:

从两个模块导入后运行的结果可以看出,有判断语句“if__name__=='__main__':”,函数模块只运行一次,而没有判断语句,函数模块则运行了两次。

原因在于当不带判断语句的hello2.py文件作为模块被引入时,printhello()函数已经自动执行了一次(from hello2 import printhello),之后在被主动调用时执行了一次〔printhello()〕,所以一共执行了两次。

可见这句判断代码的作用就是既能保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入,所以它可以在当前文件被当作一个模块,导入时发挥关键作用。