一、模块
在python中,一个文件就称之为一个模块(module)。这样大大提高了代码的可维护性,又使得我们的代码不必从零开始,当一个模块编写完毕,就可以被其他地方引用。
import time import functools def add_log(fun): @functools.wraps(fun) # 不会改变原函数的属性; def wrapper(x, y): start_time = time.time() res = fun(x, y) end_time = time.time() #time.ctime() 获取系统字符串时间 print("[%s] 函数名: %s 运行时间:%s 运行返回值结果: %s" % (time.ctime(),fun.__name__, end_time - start_time,res)) return wrapper
在段程序中我们使用imoprt 关键字导入了time和functools模块。
在python中的模块分为了三类:
1、内置模块 :random,sys,time,collections,functools,inspect 等等
2、自定义模块 :自己写的模块
3、第三方模块 :pypi.python.org; itchat,qrcode等等
我们调用模块当然存在解释器的路径指示,我们使用模块import sys模块来查看内置模块的搜素路径,即内置模块的查找路
径。
import sys print(type(sys.path)) for char in sys.path: print(char)
输出:
<class 'list'> /root/PycharmProjects/day07 /root/PycharmProjects /usr/local/python3/lib/python36.zip /usr/local/python3/lib/python3.6 /usr/local/python3/lib/python3.6/lib-dynload /root/PycharmProjects/venv/lib/python3.6/site-packages /root/PycharmProjects/venv/lib/python3.6/site-packages/setuptools-28.8.0-py3.6.egg /root/PycharmProjects/venv/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg
从上面我们可以看到,sys.path 是一个列表,列表中存储着所有的搜素内置模块的路径。当我们使用
import 关键字时,解释器就会从上面这些路径中寻找我们的模块。因此我们可以更改列表来添加自己自定义的
搜索路径,例如:
sys.path.append('/root/Desktop') sys.path.insert(0,'/mnt') print(type(sys.path)) for char in sys.path: print(char)
输出:
<class 'list'> /mnt /root/PycharmProjects/day07 /root/PycharmProjects /usr/local/python3/lib/python36.zip /usr/local/python3/lib/python3.6 /usr/local/python3/lib/python3.6/lib-dynload /root/PycharmProjects/venv/lib/python3.6/site-packages /root/PycharmProjects/venv/lib/python3.6/site-packages/setuptools-28.8.0-py3.6.egg /root/PycharmProjects/venv/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg /root/Desktop
我们自定义的搜索路径已经被加了上去,当然如果们需要删除某个搜素路径,我们可以使用列表的所有的删除方法,list.remove() list.pop() list.del() 方法。
练习:
安装并调用itchat 模块实现如下功能:
1、给自己的微信助手每隔一秒随机发送一个自己微信好友的账号。
2、统计自己的微信好友的男女个数
import random import itchat import time def send_message_to_filehelper(): for friends in infor[1:]: itchat.send(friends['NickName'],toUserName='filehelper') time.sleep(random.random()) print('完成!!!') def sex_proportion(): male = female = other = 0 for friend in infor[1:]: if friend['Sex'] ==1: male +=1 elif friend['Sex'] == 2: female +=1 else : other +=1 print("总好友个数:%d" %(len(infor[1:]))) print("男性好友:%d" %(male)) print("女性好友:%d" %(female)) print("其他:%d" %(other)) itchat.auto_login(hotReload=True) infor = itchat.get_friends() sex_proportion() send_message_to_filehelper()
二、包
如果不同的人编写的模块名称相同怎么办?为了避免模块名冲突,Pyhton 又引入了按目录来组织模块的方法,称为包(Package)
包的创建步骤:
创建一目录为包名;
在该文件夹下创建__int__.py文件存放包的信息,该文件可以为空;
根据需要存放脚本文件,已编译的扩展及子包;
可以使用import ,import as ,from import 等于剧导入模块和包;
我们在这个包下创建一个名为package的包添加add.py文件,并将下面一段代码放入该文件中
import time import functools def add_log(fun): @functools.wraps(fun) # 不会改变原函数的属性; def wrapper(x, y): start_time = time.time() res = fun(x, y) end_time = time.time() #time.ctime() 获取系统字符串时间 print("[%s] 函数名: %s 运行时间:%s 运行返回值结果: %s" % (time.ctime(),fun.__name__, end_time - start_time,res)) return wrapper @add_log def add(x,y): return x+y values = 100 if __name__ == '__main__': add()
在与pack01的同级目录下创建一个.py文件,通过该文件对包进行导入。
方式一:
from pack01 import add print(add.values) print(add.add(10,9))方式二:
import pack01.add print(pack01.add.add(2,3)) print(pack01.add.values)方式三:
from pack01.add import values from pack01.add import add print(add(2,3)) print(values)方式四: 这种方式不建议使用,因为当变量不加作用域时,容易冲突
from pack01.add import * #导入模块文件中的所有变量及函数 print(add(2,3)) print(values)