Python3学习笔记(18)----模块知识点总结

原创 2018年04月17日 20:32:13

1、Python 中的 if __name__ == '__main__'

对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样,Java 和 C# 必须要有一个包含 Main 方法的主类来作为程序入口。

而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。

举一个例子来说明一下,假设我们有一个 const.py 文件,内容如下:

PI = 3.14

def main():
    print "PI:", PI

main()

我们在这个文件里边定义了一些常量,然后又写了一个 main 函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python const.py),输出:

PI: 3.14

现在,我们有一个 area.py 文件,用于计算圆的面积,该文件里边需要用到 const.py 文件中的 PI 变量,那么我们从 const.py 中把 PI 变量导入到 area.py 中:

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print "round area: ", calc_round_area(2)

main()

运行 area.py,输出结果:

PI: 3.14
round area:  12.56

可以看到,const 中的 main 函数也被运行了,实际上我们是不希望它被运行,提供 main 也只是为了对常量定义进行下测试。这时,if name == ‘main’ 就派上了用场。把 const.py 改一下:

PI = 3.14

def main():
    print "PI:", PI

if __name__ == "__main__":
    main()

然后再运行 area.py,输出如下:

round area:  12.56

再运行下 const.py,输出如下:

PI: 3.14

if __name__ == '__main__' 就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。

2、作用域

在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。

正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;

类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,我们自己的变量一般不要用这种变量名;

类似_xxx__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;

private函数或变量不应该被别人引用,那它们有什么用呢?

def _private_1(name):
return 'Hello, %s' % name

def _private_2(name):
    return 'Hi, %s' % name

def greeting(name):
    if len(name) > 3:
        return _private_1(name)
    else:
        return _private_2(name)

我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:

外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。

3、安装第三方模块

在Python中,安装第三方模块,是通过包管理工具pip完成的。

在命令提示符窗口下尝试运行pip,如果Windows提示未找到命令,可以重新运行安装程序添加pip。

例如,我们要安装一个第三方库——Python Imaging Library,这是Python下非常强大的处理图像的工具库。不过,PIL目前只支持到Python 2.7,并且有年头没有更新了,因此,基于PIL的Pillow项目开发非常活跃,并且支持最新的Python 3。

一般来说,第三方库都会在Python官方的pypi.python.org网站注册,要安装一个第三方库,必须先知道该库的名称,可以在官网或者pypi上搜索,比如Pillow的名称叫Pillow,因此,安装Pillow的命令就是:

pip install Pillow

4、安装常用模块

在使用Python时,我们经常需要用到很多第三方库,例如,上面提到的Pillow,以及MySQL驱动程序,Web框架Flask,科学计算Numpy等。用pip一个一个安装费时费力,还需要考虑兼容性。我们推荐直接使用Anaconda,这是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,我们装上Anaconda,就相当于把数十个第三方模块自动安装好了,非常简单易用。

Anaconda安装的第三方模块会安装在Anaconda自己的路径下,不影响系统已安装的Python目录。

安装好Anaconda后,重新打开命令行窗口,输入python,可以看到Anaconda的信息:
可以尝试直接import numpy等已安装的第三方模块。

5、模块搜索路径

当我们试图加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错:

>>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mymodule

默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中:

>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

如果我们要添加自己的搜索目录,有两种方法:

一是直接修改sys.path,添加要搜索的目录:

>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

这种方法是在运行时修改,运行结束后失效。

第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。

版权声明:可转载,记得写明原地址 https://blog.csdn.net/jin970505/article/details/79980307

Android Activity组件知识点思维导图

  • TaylorWait_
  • TaylorWait_
  • 2017年07月04日 17:41
  • 269

Java基础总结之各个模块重要知识点

一:对象模块。 一.初始化 1.对this.super,构造函数,构造代码块,静态代码块总结。 this:代表当前对象,也就是所在函数所属对象的引用。 this对象后面加.调用的是对象的成员变量和方法...
  • qq_19776363
  • qq_19776363
  • 2015年08月12日 10:45
  • 9994

springMVC知识点学习笔记

一、 springMVC开发框架原理图 其中的组件: 1,前端控制器DispatcherServlet(不需要程序员开发) 作用是接收请求,响应结果,相当于转发器 2,处理器映...
  • jaryle
  • jaryle
  • 2016年05月07日 20:36
  • 2117

大数据学习笔记总结

自己总结的这些知识点都是从赵勇编写的架构大数据-大数据技术及算法分析这本书上总结的。 在接触这本书之前,自己对于大数据的概念还很模糊,对于大数据和云计算的差别还是很不清楚,看完书之后,总结一下几点:...
  • xuqiaobo
  • xuqiaobo
  • 2017年03月09日 20:12
  • 1297

iOS学习笔记-----常用知识点总结

1.id与instanncetypeid 与 instancetype 区别 1.id 可以当返回值类并且可以声明对象 2.instancetype 只可以当返回值类型 3.instanc...
  • czzj0212
  • czzj0212
  • 2016年04月19日 20:28
  • 583

Python学习笔记(15)-Python常用模块总结

1.datetime1.1 获取当前的日期和时间代码:from datetime import datetimenow = datetime.now() print (now) print (type...
  • qq_28356833
  • qq_28356833
  • 2017年01月23日 12:03
  • 551

Python学习笔记3:Python基础

1、语句和语法 (1)注释(#) (2)继续( \) 存在两种例外情况,一个语句不使用反斜线也可以跨行: 在使用闭合操作符(小括号,中括号,花括号)时单一语句可跨多行; 使用三引号包括下的字符串...
  • tiana0
  • tiana0
  • 2016年07月03日 10:56
  • 654

MySQL数据库基础知识点总结

一.一些常用的数据库dos命令: SHOW  DATABASES//查看都有哪些数据库 CREATE  DATABASE 数据库名//创建数据库 DROP  DATABASE 数据库名//删除数...
  • zhuning_blog
  • zhuning_blog
  • 2015年07月18日 20:10
  • 2625

总结17展望18

时光飞逝,转眼间就到了2018年,还清楚的记得十年前的2008,那时候北京奥运会的北京欢迎您到现在的北京不要你。08年的中国比较坎坷,年初南方雪灾,512汶川地震。回顾去年我的经历也比较坎坷。但是有苦...
  • wy_python
  • wy_python
  • 2018年01月01日 22:24
  • 352

Spring知识点总结

在学习Spring之前,先了解Spring是什么。百度百科上解释:Spring是分层的JavaSE/EE full-stack轻量级开源框架,以IoC(Inverse of Control 反转控制)...
  • zjx86320
  • zjx86320
  • 2015年06月29日 20:06
  • 4067
收藏助手
不良信息举报
您举报文章:Python3学习笔记(18)----模块知识点总结
举报原因:
原因补充:

(最多只允许输入30个字)