首页
学习
活动
专区
工具
TVP
发布

Python学习笔记(三)

点击一下关键词查看往期学习笔记:

一、从源码文件头说起

在检索相关代码的时候,总会发现别人家的源码上有下图所示的两行代码,因为本身是注释性的语言,就很容易被忽略而不解其意。实际上,这是非常重要的两行代码,作用很大。

--源码文件头部两行注释语言--

首先来看第一行代码:

乍一看,就是一串不会被执行的字符。实际上,一般情况下确实也不会执行。但是有Linux经验的老鸟会看出来,实际上这里指定了Python解释器的路径。这里不得不提到Linux,我们一般用的是windows操作系统,应用程序的路径一般是:C:\Program Files (x86)或者C:\Program Files之类的。而在Linux系统中,/usr存放各应用程序(可以理解为windows的Program Files 目录),子目录/bin存放二进制可执行文件(存放类似Windows的*.exe文件的目录)。

这一行文件头代码的作用就是指定了Python解释器的路径(在Linux中起作用)。两种写法的作用也有一些差异,#!/usr/bin/python为操作系统指定了唯一一条路径,就是从/usr/bin目录下寻找Python解释器。

而#!/usr/bin/env python略有不同,它为操作系统指定了环境变量中的路径去寻找Python解释器。这个路径就不局限于/usr/bin下,也包括了环境变量中的其他路径。

当然,在windows系统中这行代码是不起作用的,(如果我们没有在环境变量中设置Python解释器的路径,在cmd窗口中输入Python xxx.py还是会报错,找不到Python.exe,即便文件头中指定了正确的路径)。

但是从规范化的角度来看,加上这一段是很有必要的,比如这是一个协同开发项目,组内其他人可能处于Linux环境下开发,或者这个py文件作为模块组件被封装到Linux上运行,就可能带来比较大的麻烦(运行报错需要排查原因很费劲)。

来看第二行代码:

这里指定了编码方式,这里主要是为了支持中文输出。因为Python3解释器已经支持中文了,一般使用Python3的话,有没有这句话都无所谓,不会对程序运行造成影响。但是同理,为了规范化协作,为了可移植性考虑,还是需要加这么一句。

二、import xx 和from xx import xx ?

之前的推送提到,程序的运行需要导入各种标准包,导入方式也有很多讲究。经常会见到import xx 和from xx import xx,这两种方式导入有很大的不同。

import xx

这种方式导入包,在程序正文中使用该模块下面的类和方法时需要加上模块名。比如这里导入了jieba包,要使用jieba模块里面的cut方法需要在前面加上模块名:

如果不加上模块名,直接使用cut()将会报错

from A import B(导入A中的B)

from A import *(导入A中所有)

这种方式导入B或者所有类和方法以后,所有类和方法调用都不再需要加上前面的模块名,虽然看似简洁方便了许多,但是这种方法存在巨大风险,就是名称会冲突,因为在较大规模的程序中不会仅导入一个包,可能会导入N个包,包里面的命名难免冲突,因此非常不建议用这种方式导入。

三、if __name__ == "__main__"?

另一个经常看到的就是上面这串代码了。这行代码的理解需要知道.py文件的属性。在完成一个*.py文件以后,这个代码文件本身也会有一些属性,__name__就是其中一个。

该属性代表当前模块的名字,每个py文件默认的属性,如果当前模块是主程序,值为“__main__”,如果不是主程序,值为模块名。这个属性经常用来区分主程序和作为被导入模块的程序。

考虑下面这个程序:

def定义了一个函数main(),当这个py文件作为主程序执行的时候,

__name__属性就是“__main__”,那么,下一句“main()”就会被执行,在屏幕上打印出相应的文字。

如果这个.py不是主程序呢?

比如我在另外一个.py(test2.py)中引用这个py(test.py),那么test.py的__name__属性就变成了模块的名称而非“__main__”,那么if下面的代码块就不会被运行了。

这很重要。

比如我的test.py里面定义了函数main(),为了测试效果加入了执行了main():

结果为:

我在test2.py里面导入了test.py,使用了main()函数:

结果为:

为什么出现了两遍?

因为在导入test的时候,就运行了test.py,执行了main(),打印了结果,在test2.py执行到main()的时候又执行了一次,打印了结果。

而加入判断语句就可以在引用test.py的时候屏蔽if语句后面的代码块,避免重复:

再执行test2结果正常:

这种方法既不影响test的正常使用,也不影响test2的使用,应用效果非常好。

--End--

好看!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190102G1HF8J00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券