Python模块
Posted 轻工业
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python模块相关的知识,希望对你有一定的参考价值。
一、模块
(一)定义
模块指的是Python的程序文件(源文件),模块的文件名就是模块名加上.py,里面包含了Python对象定义和Python语句,模块包含了定义函数、类和执行代码等等,一般情况下不要去修改模块,以免模块失效。
(二)模块导入
Python中允许导入的形式来进行模块调用,Python中的模块也是对象,模块中定义的所有全局变量,导入后都成为模块的属性。
1.语法1: import 模块名
如果要导入多个模块,可以只用1个import来导入多个模块,多个模块之间用逗号隔开即可,但是在Python的PEP8风格里面,不建议这么做,所以要导入几个模块,就写几个import来进行挨个导入。
例子:导入math模块并调用sqrt()开平方的功能对9进行开平方
import math
num = math.sqrt(9)
print(num)
输出结果:
3.0
提示一下,在Python中进行运算操作默认返回的是float类型,所以是3.0。
2.语法2: from 模块名 import 功能1,功能2
注意这里的功能后面不加括号。
例子:导入math模块并调用sqrt()开平方的功能对9进行开平方
from math import sqrt
num = sqrt(9)
print(num)
输出结果:
3.0
3.语法3:from 模块名 import
一般情况下,这个语法可以导入模块的所有功能,当你要用某个模块的多个功能的时候,就不用挨个写了,这里我就不举例了,都是一样的。
注意点:
这个方式并非在所有情况下都能导入模块中的所有功能,
如果模块中有__all__=["功能1","功能2"]这样的声明,
那么导入的模块只能用功能1和功能2,
如果模块中还有功能3等等功能,但是没有在__all__=[列表]中声明,则无法调用。
例子:(这个例子需要看完下面的自定义模块才看得懂)
新建了1个叫module1的模块,模块代码有2个功能:
def fun1() : #实现a+b并输出结果
print("fun1")
def fun2() : #实现a+b并输出结果
print("fun2")
__all__ = ["fun1"] #声明只能调用fun1()
在另一个Python文件中用语法3的方式导入模块中的所有方法:
from module1 import *
fun1()
fun2()
执行结果只打印出来fun1,然后就报错提示fun2()没有被定义,无法识别,这就是因为
在module1中用__all__声明了可调用的方法只有fun1()。
(三)定义别名
有的模块或者模块内的功能名字比较长,多次使用的时候不方便,可以进行自定义模块或者功能的名字。
1.模块自定义别名: import 模块名 as 别名
例子:自定义time模块为别名t并使用。
import time as t
t.sleep(3) #延迟三秒
print("hello world")
程序执行3秒后输出:
hello world
2.功能自定义别名: from 模块名 import 功能名 as 别名
例子:导入time模块并自定义sleep()功能为s这个名字
from time import sleep as s
s(5) #延时5秒
print("hello world")
程序执行5秒后输出:
hello world
(四)自定义模块
每个人都能生成自定义模块来进行调用,自定义模块就是Python文件,我们写代码时创建的Python文件就相当于1个模块。
注意点:被调用的模块尽量放在当前Python文件相同目录下,否则导入时要声明所在文件夹才能导入。
例子:自定义1个模块,在另一个Python文件中进行调用。
新建1个名为module1的Python文件,代码如下:
def fun1(a,b) : #实现a+b并输出结果
print(a+b)
相同目录下新建另一个Python文件,调用module1.py这个模块:
import module1
module1.fun1(20,30)
运行当前Python文件结果:
50
(五)模块的测试
每个模块导入的时候都默认被执行一遍,但同时在模块内部又存在着很多的内部测试代码,为了避免导入模块时执行了模块内部的测试代码,于是就牵扯到一个方法:
很多模块在内部都有测试方法:
if __name__ == "__main__":
代码1
这个方法能够实现一个功能,在模块中执行的话,就会执行代码1的代码,在其他文件导入该模块的时候,则不会执行代码1的代码,所以一般模块内部的测试都放在了代码1当中。
为什么?神奇的点就在于__name__,它在当前文件中执行的结果是__main__,在其他文件导入时执行的结果是模块名,所以利用这一点,用上if语句就能判断模块执行到底是在当前文件执行还是被导入执行。
举例:
新建1个Python叫module1,作为模块,代码如下:
print(__name__) #打印__name__
执行结果:
__main__
再新建1个Python文件,导入刚才建好的module1.py模块:
import module1
执行结果:
module1
在当前文件的执行和被导入时执行,结果是不一样的,所以它成为了模块的内部测试方法。
注意点:在自定义的模块中,不建议写while循坏,不然导入的过程中一直在执行模块里面的while循坏,可能会跳不出来,也就是一直在导入模块,其他代码执行不到。
python模块自学
随python附带安装的有python标准库,标准库中有很多模块,一般常见的任务都可以由指定的模块来直接实现,python标准库包含的模块有上百个之多,如__builtin__模块(这个模块包含 Python 中使用的内建函数,一般不用手动导入这个模块,Python会帮你做好一切)、os模块、re模块、math模块、sys模块、copy模块、time模块、threading模块、urllib模块等等,还有一些其他线程和进程、网络协议等等各种模块,这里来说一下独立的探索这些模块的方法。
python除了标准库的几百个官方模块之外,还有一个叫pypi的社区:https://pypi.python.org/pypi,收集了全球python爱好者贡献出来的模块,自己也可以写一个模块发布到pypi社区分享到全世界。
PEP是python enhancement proposals的缩写,翻译过来就是Python增强建议书的意思。它是用来规范与定义python的各种加强与延申功能的技术规格,好让python开发社区能有共同遵循的依据。
每个PEP都有一个唯一的编号,这个编号一旦给定了就不会再改变。例如,PEP3000就是用来定义python3..0的相关技术规格;而PEP333则是python的web应用程序界面WSGI(web server gateway interface1.0)规范。关于PEP本身的相关规范是定义在PEP1,而PEP8则定义了python代码的风格指南。有关python的列表大家可以参考PEP0:https://www.python.org/dev/peps/。
入手不熟悉的模块:
可以查看官方文档,搜索模块名,查看模块的功能介绍、简单的使用方法、这个模块里边包含了哪些类、函数、变量、实际应用的详细的例子。
利用代码查看模块timeit:
import timeit
#查看模块的简介
print(timeit.__doc__)
#这个模块中定义了哪些变量、类、方法
dir(timeit)
#上边显示出来的名字,不是所有的对我们都有用,所以要过滤掉一些我们不需要的东西,__all__属性就是帮助我们过滤掉无用的东西的一个属性。
timeit.__all__ #返回这个模块可以供外界调用的所有东西
#但是不是所有的模块都有__all__这个属性,__all__这个属性里边包含的内容是这个模块的作者希望外部调用的这些函数、类。
#如果一个模块设置了__all__属性,使用from timeit import *导入到命名空间,只有__all__属性这里边的名字才会被导入。建议在编写模块的时候,对外提供接口和类都设置到__all__属性这个列表里边去,这是比较规范的做法。
from timeit import *
#__file__属性指明了模块的源代码所在的位置
print(timeit.__file__)
#help()显示的帮助文档,可以快速知道各个函数的用法,它比__doc__属性详细一点,比官方文档简单一点。
help(timeit)
以上是关于Python模块的主要内容,如果未能解决你的问题,请参考以下文章