刚接触python,看到好多案例都有这句代码if __name__ == "__main__":,试着去掉后,结果依然能出来,好像没啥用似的。经查阅调试,总算搞清了缘由,顺带着还搞懂了两种模块导入的用法区别。
if __name__ == "__main__":代码作用:当.py文件被当做模块被其他文件引用时,文件里的if __name__ == "__main__":代码能使其内部的代码避免被执行。举例来说:上篇介绍乘法口诀对齐的代码,文件名为:kj.py,具体代码为:
def cfkj(num1, num2): for i in range(num1, num2 1): print() print('%*d: ' % (len(str(num2)), i), end="") for j in range(num1, i 1): print('%-d*%-d=%-*d' % (j, i, len(str(num2*num2)), i*j), end=' '*(len(str(num2)) 2-len(str(i)))) if __name__ == "__main__": strer = input('输入起止数字,中间用"-"隔开:') beginer = int(strer[:strer.find("-")]) ender = int(strer[strer.find("-") 1:]) cfkj(beginer, ender) print()
上面的代码中,最后5条代码即为if __name__ == "__main__":内部的代码,如果只是使用这个文件生成乘法口诀,其中的if __name__ == "__main__":代码确实没什么用,删掉也不受影响。
但是,当我在另外的文件里,也想得到乘法口诀时(比如得到1到6之间的乘法口诀)。我们不必重新写一遍上面的代码,而是直接用import将上面kj.py文件导入,就可以了。代码为:
import kj kj.cfkj(1,6)
第一句import kj,是导入kj.py文件的意思,其中后缀.py省略不写。
第二句kj.cfkj.(1,6),是使用kj.py文件里的cfkj(1,6)模块,执行得到乘法口诀。程序运行全部完成。
但是,如果我们kj.py文件里删掉了if __name__ == "__main__":代码,同样的代码运行效果为:
说明,由于缺少了if __name__ == "__main__":代码,则程序首先执行kj文件里cfkj模块下面的代码,然后再执行kj.cfkj(1,6),于是得到了上面的两遍结果。所以,在代码被其他文件引用时,if __name__ == "__main__":语句能避免不必要的代码运行,是很有用的。
import导入和from** import **导入python提供了强大的导入功能,通过import可轻松将标准库、他人写的文件或自己写的文件导入到当前文件,省去重复写码的麻烦。比如上面的例子,通过import,2句代码就实现了乘法口诀。
但是,我们也经常看到,导入其他模块库时,除了用import,还有from openpyxl import Workbook这种样式。他们之间有有什么区别呢?我们还是用上面的例子来看。
我们把上面的生成1-6乘法表的代码改为下面的代码,效果是一样的。
from kj import cfkj cfkj(1, 6)
意思就是,从kj.py文件里导入cfkj模块,文件内其他的模块不进行导入。可以理解为:用from ** import **进行导入是当我们明确知道需用到模块名时,采用的针对性导入,避免将文件全部导入,提高效率。
当用from ** import **导入时,使用模块时模块前面不用再加上文件名。比如上面如果还写成:
from kj import cfkj kj.cfkj(1, 6)
则会报错,删掉kj.就可以了。这样一看,导入模块时,最好采用from ** import **方式,至少还可以避免后面用到模块时总要加上文件名。
学习打卡第2篇,欢迎大侠指点!
,