什么是模块?python中的模块其实就是一个.py结尾的文件,也许有的小伙伴不太理解为什么我们需要模块,其实在我们日常编程中,有很多功能是重复的,所以在下次我们编写一个类似需求时没必要从头开始,这时候我们就重用我们之前写的代码块就好了,这样经过长时间积累把一些常用的功能以文件的方式保存起来,等需要的时候直接引用,不必从零开始实现某些功能,所以说代码写的越多就会发现复制粘贴真是人类一项伟大的发明。
那按上面说的模块就是一个文件,那照这么说我也能写一个模块喽,没错,只要你愿意每个人都可以写自己的模块,我们来个简单的例子,我们vi 一个文件,命名为mymodule.py,代码只有很简单的二行代码:
def print_me():
print 'It is a module'
这个就是我们自己写的模块了,接下来我们看如何使用:
>>> import mymodule
>>> mymodule.print_me()
It is a module
import语句我们待会说,主要大家先了解下如何使用我们定义的模块,如果你觉得这么简单会不会是个假模块,那接下来看看这些输出:
>>> type(mymodule)
>>> dir(mymodule)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'print_me']
是不是有点似曾相识的感觉,所以说写一个自己专属的模块并不困难,那问题来了,既然模块这么简单,你写一个,我写一个,很容易会重名呀,那如果重名了,导入的时候不就出问题了吗?是的,没错,所以要解决模块名字冲突的问题,就引入的包了的概念。
包是一个有层次的文件目录结构,所以它不是一个单独的文件,它要比模块结构复杂,模块可以是一个文件,但包是一个目录结构,它可以包含N个模块,同时它还可以包含多个子包,子包下还可以有N个模块,包的目录里一定有这个__init__.py文件,这样这个目录结构才会被识别成包,简单的包目录结构如下:
mypackage
├── __init__.py
├── module1.py
└── module2.py
所以可以通过把模块放入不同的包里,这样只要包名不冲突,里面的模块名冲突了也不会有问题。
到这我们就把模块和包的基本概念说完了,下面我们看如何在代码中使用他们,我们把模块和包的导入归类,一般有如下几种方式:
1、import 模块名
2、from 模块名 import name….
3、import 模块名 as 别名 # 作用就是给导入的模块另起一个名字,一般是原模块名太长或名字你在变量里用了这个名字冲突了,所以必须要起一个不一样的名字。
包的导入:
1、import 包名
2、from 包名 import 模块名
3、from 包名 import * #用这种方式需要注意,这就用到我们刚才说的包里__init__.py文件了,这个文件一般为空,也可以写代码,__init__.py定义了很重要的变量叫__all__的列表变量,导入时只有它包含的模块名字的列表将被导入,如果__all__列表变量没有定义,这条语句不会导入所有的包的子模块,只导入了包自己。
模块和包的导入方式相对简单,还有其它一些方式,在日后大家碰到看几次就明白了,说完了包我们该说最核心的标准库了。
前面为什么要花这么长篇幅说模块和包,因为理解了这些,理解python的标准库就简单多了,因为标准库就是以模块和包的形式存在的,稍微了解Python的小伙伴都知道,Python本身自己带有大量的标准库,这些库在安装python的时候也安装了,所以我们可以在代码里直接import 使用就可以了,除了标准库我们还经常听到一些第三方库,第三方库也是模块或包,之所以叫第三方是因为我们无法直接使用,使用前需要先安装,才能import,否则会提示没有这个模块,都说python有大量的库文件可以使用,这真不是吹的,撇开第三方库不说,就标准库就够吓人的,参考地址:
https://docs.python.org/3/library/index.html
python自带这么多标准库自然对我们编程是好事,但问题也来了,这么多库我们要怎么学习呢,别说看第三方库,就标准库全学一遍也得几个月,在这里我谈一下我自己的一些学习心得:
1、首先可以肯定的是我们没必要精通每个标准库的模块,因为在实际的编程中你会发现有些第三方库比标准库更好,所以用你最想用的。
2、根据你工作内容来学习,就是你工作中用到那些就要深入学习那些,一些用不到的只要了解就可以了。
3、标准库和第三方库的使用选择,这个看个人,如果有比较成熟的第三方库比标准库更好,为何不用呢,比如: requests
就说这三点吧,如果大家有需要交流的可以给我留言。