一、模块
在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)