Python模块
模块是一个包含一系列数据、函数、类等组合的程序组,可以供给其他模块或文件使用
模块名、函数名、变量名必须是标识符,
模块是一个文件,模块文件名通常以.py结尾
模块的分类:
内建模块(builtins) 在解析器内可以直接使用
标准库模块, 安装python时已安装且可以直接使用
第三方模块(通常开源) 需要自己安装
用户自己编写的模块(可以作为其他人的第三方库)
pip安装第三方库:
临时使用:
可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple
例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent,这样就会从清华这边的镜像去安装gevent库。
永久使用:
linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
调用模块
引用模块: import module1,module2...
调用模块:模块名.函数名
语法:
import 模块名1 [as 模块1新名],[模块名2 as 模块2新名]
from...import... 语句 from fib import fibonacci #导入fib模块中的fibonacci函数,所以只能调用math函数里面的fibonacci函数
from...import * 语句 把一个模块里的所有内容导入到当前命名空间,直接调用函数就行,不用模块.函数,一般不建议使用
input(prompt)——以字符串的方式获取用户输入
bytes(string,encoding[,errors])——对指定的字符串进行编码,并以指定的方式处理错误
help([object])——提供交互式帮助
round(number[,ndigits])——四舍五入为指定的精度,正好为5时舍入到偶数
内建模块————数学模块 math
cmath.sqrt(number)——返回平方根,可用于负数
abs(number)——返回指定值的绝对值
math.e——自然对数的底e
math.pi——圆周率pi
函数名 | 描述 |
---|---|
math.ceil(x) | 对x向上取整,比如x=1.2,返回2 |
math.floor(x) | 对x向下取整,比如x=1.2,返回1 |
math.sqrt(x) | 返回x的平方根,不可用于负数 |
math.factorial(x) | 求x的阶乘 |
math.log(x[, base]) | 返回以base为底x的对数, 如果不给出base,则以自然对数e为底 |
math.log10(x) | 求以10为底x的对数 |
math.pow(x, y[,z]) | 返回 x**y%z (x的y次方对z求模的结果) |
math.fabs(x) | 返回浮点数x的绝对值 |
角度和弧度degrees互换 | |
math.degree(x) | 将弧度x转换为角度 |
math.radians(x) | 将角度x转换为弧度 |
三角函数 | |
math.sin(x) | 返回x的正弦(x为弧度) |
math.cos(x) | 返回x的余弦(x为弧度) |
math.tan(x) | 返回x的正切(x为弧度) |
math.asin(x) | 返回x的反正弦(返回值为为弧度) |
math.acos(x) | 返回x的反余弦(返回值为为弧度) |
math.atan(x) | 返回x的反正切(返回值为为弧度) |
内建标准库模块——时间模块 time
计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1(UTC时间),比中国时间晚8个小时
注:CST为中国标准时间(China Standard Time UTC +8:00)
函数名 | 描述 |
---|---|
time.time() | 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准) |
time.sleep(miao) | 让程序按给定secs秒数的浮点数睡眠一段时间 |
time.asctime([tuple]) | 将9个元素时间元组转换为(美国时间格式) Wed Jul 18 13:21:58 2018 不给参数返回当地当前时间(美国时间格式) |
time.mktime(tuple) | 将本地9个元素日期时间元组转换为UTC时间(秒) |
time.gmtime(miao) | 用给定秒数转换为UTC表达的9元素时间元组 time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=13, tm_min=9, tm_sec=41, tm_wday=2, tm_yday=199, tm_isdst=0) |
time.localtime(miao) | 返回9个元素的时间元组,缺省时默认返回本地的当前时间 将UTC秒数时间转换为日期元组(以本地时间为准) |

1 import time 2 print(time.asctime()) #Wed Jul 18 21:19:10 2018 3 # test2: time.loaltime() 本地时间 4 t1 = time.localtime() 5 print(t1)#time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=21, tm_min=20, tm_sec=47, tm_wday=2, tm_yday=199, tm_isdst=0) 6 7 #test3: time.gmtime() 格林威治标准时间 8 t2 = time.gmtime() 9 print(t2)#time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=13, tm_min=21, tm_sec=58, tm_wday=2, tm_yday=199, tm_isdst=0) 10 11 #test4: 按time_struct,人工指定时间结构元组 12 t3 = (2018,7,18,21,25,23,0,0,0) 13 print(t3)#(2018, 7, 18, 21, 25, 23, 0, 0, 0) 14 print(time.asctime(t3))#Mon Jul 18 21:25:23 2018 15 16 t4 = time.mktime(t3) 17 print(t4) # 1531920323.0
内建标准库模块———系统模块 sys
sys模块的属性
属性 | 描述 |
---|---|
sys.path | 模块搜索当前脚本程序的路径名,否则为 ''(空) |
sys.modules | 已加载模块的字典 |
sys.version | 版本信息字符串 |
sys.version_info | 版本信息的命名元组 |
sys.platform | 操作系统平台名称信息 |
sys.argv | 命令行参数 argv[0] 代表当前脚本程序名 **.py |
sys.copyright | 获得Python版权相关的信息 |
sys.builtin_module_names | 获得Python内建模块的名称(字符串元组) |
内建标准库模块——随机模块 random
用于生成随机输出
函数名 | 描述 |
---|---|
R.random() | 返回一个[0, 1) 之间的随机实数 |
R.uniform(a,b) | 返回[a,b) 区间内的随机实数,区间可以不是整数 |
R.randrange([start,] stop[, step]) | 返回一个range(start,stop,step)中的随机数 |
R.choice(seq) | 从序列中返回随机选取一个数 |
R.shuffle(seq[, random]) | 指定序列(sep)随机的打乱顺序 |
R.sample(seq,n) | 从序列(sep)中选择n个随机且不重复的元素 |
模块包——paockage
包就是文件夹,是包的文件夹必须存在__init__.py文件,通常放包的文档字符串,该文件的内容可以为空__int__用于标识当前文件夹是一个包,__init__会在包加载时自动调用,有利于防止命名冲突,可以在需要时加载一个或部分模块而不是全部模块
举个栗子:
test.py package_runoob |-- __init__.py |-- runoob1.py |-- runoob2.py
package_runoob/runoob1.py
1 def runoob1(): 2 print "我是模块1"
package _runoob/runoob2.py
1 def runoob1(): 2 print "我是模块2"
在 package_runoob 目录下创建 __init__.py,有这个文件证明package_runoob是一个模块包
4 if __name__ == '__main__': 5 print '作为主程序运行' 6 else: 7 print 'package_runoob 初始化'
然后我们在 package_runoob 同级目录下创建 test.py 来调用 package_runoob 包
4 # 导入 Phone 包 5 from package_runoob.runoob1 import runoob1 6 from package_runoob.runoob2 import runoob2 7 8 runoob1() 9 runoob2()
以上实例输出结果:
package_runoob 初始化 I'm in runoob1 I'm in runoob2
包的导入
#import 语句
import 包名 [as 包新名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名 [as 模块新名]
#from import语句
from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]
from 模块名 import 函数名 (不用写模块名.函数名)
# from import *语句
from 模块名 import* (不用写模块名.函数名)
from 包名 import *
from 包名.模块名 import *
导入包时搜索路径的顺序:
1、搜索程序的当前路径
2、sys.path 提供的路径
__init__.py内的__all__列表
作用:用来记录此包中有哪些子包或者模块在用from import* 语句时被导用
说明:__all__列表只对 from xxx import *语句起作用
包的相对导入是指包内模块的相互导入
语法:
from 相对路径包或模块 import 属性或模块名
from 相对路径包或模块 import *
相对路径:
.代表当前目录
.. 代表上一级目录
... 代表上二级目录
.... 以此类推
注:相对导入时不能超出包的外部
python一般默认是绝对路径导包的
搜索路径
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
- 1、当前目录
- 2、如果不在当前目录,sys.path提供的路径,sys.path是一个列表,里面放着都是模块的搜索路径,
- 3、如果都找不到,Python会察看默认路径,也就是内建模块。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在sys模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
python的环境变量(就是路径) set PYTHONPATH=c:\python27\lib;
模块的加载过程
1、在模块导入时,模块的所有语句都会执行一边
2、如果模块已经导入那么在此导入不会重新执行模块内的语句
模块导入和执行的过程
1、先搜索相关的路径,找到模块名.py
2、判断是否由此模块对应的.pyc文件。如果.pyc文件比.py文件新,则直接加载.pyc文件
3、否则用模块.py文件,生成.pyc文件,并加载执行
pyc python的编译
编译 解释执行
mymod.py --------> mymod.pyc --------> python3
模块的预置属性
模块的__doc__属性绑定此模块的文档字符串 print(__doc__) #我是文档字符串
模块的__file__属性记录模块对应的文件路径名 print(__file__) #D:/Users/Never/PycharmProjects/Tedu/day13/练习.py
模块的__name__属性 用来记录模块自身名字 print(__name__) #'__main__'
用处:1、记录函数名
2、用来判断是否为主模块
说明:1、当此模块为主模块(也就是第一个运行的模块时)运行时,__name__绑定的是__main__
2、当此模块不是主模块时,而是被其他模块导入时,此时__name__绑定模块名
模块的属性调用时,就不需要使用模块名.属性
模块的__all__列表
模块中的__all__列表是一个用来存放可导出属性的字符串列表
作用:当用from 模块名 import * 语句导入模块时,只导入__all__列表里面的属性(注意是模块名不是包名)
bk.py文件
# __all__属性只对 from import * 语句有效 __all__ = ['hello1', 'name1'] def hello1(): print("1") def hello2(): print("2") def hello3(): print("3") name1 = 'aaaaaa' name2 = 'aaaaaa'
wo.py文件
from bk import* hello1() print(name1)
模块的隐藏属性 模块中以‘_’开头的属性,在from 模块名 import *或者from...import...导入时,将不被导入,通常称这些属性为隐藏属性
reload()函数
当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。
因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:
import imp
imp.reload(module_name)
在这里,module_name要直接放模块的名字,而不是一个字符串形式,也不是字符串名。
help(obj)函数可以查看模块的相关文档字符串
dir( )函数:返回的是一个列表,容纳了括号中模块包含的所有变量、函数和模块

1 import math 2 content = dir(math) 3 print(content) 4 ''' 5 ['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 6 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 7 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 8 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 9 'sqrt', 'tan', 'tanh'] 10 ''' 11 12 dic()
在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的路径。
globals()和locals()函数
根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。
多模块项目设计时,不要用global定义全局变量,可以用函数传参传入全局变量,全局变量写在main模块里面,然后main()调动主模块
如果实在没办法,可通过stdu.name = 2类似的方法把模块stud的name值调过来