一 什么是模块
1)模块的定义
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
2)模块的作用
- 最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。
当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,
包括Python内置的模块和来自第三方的模块。
-使用模块还可以避免函数名和变量名冲突。
相同名字的函数和变量完全可以分别存在不同的模块中,
因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。
但是也要注意,尽量不要与内置函数名字冲突。
二 模块的分类,以及模块的导入
包括:内置模块,自定义模块,第三方模块
到目前为止,我们学到的好多模块都属于内置模块:
比如(random,getpass,time,math,os,string,functools等)
那么 这些模块是如何使用的,这就牵扯到了模块的导入
1)import直接导入
import导入模块执行的操作:
- 产生一个新的名称空间;
- 在新建的名称空间俩面执行模块(.py)的内容
- 拿到了一个模块名, 执行模块文件产生的名称空间.
2) import …. as …
对于导入的模块重命名
3)从模块里面导入函数, 变量, 装饰器等…..
from …. import ….
from …. import ….. as ….
三 如何自定义一个模块
模块就是以 .py 结尾的文件
上面写好的 my_time 文件就可以作为一个模块
import functools
import time
money=1000
def timeit(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
start_time = time.time()
res = fun(*args, **kwargs)
stop_time = time.time()
print('time:%.6f' % (stop_time - start_time))
return res
return wrapper
def hello():
return 'hello'
这个代码就可以作为模块来使用,用来比较时间的长短
import random
import my_time # 导入自定义模块my_time
li = [random.randint(1, 20) for i in range(1000)]
@my_time.timeit
def list_sort_cmp():
li.sort()
return li
@my_time.timeit
def sorted_cmp():
li1 = sorted(li)
return li
list_sort_cmp()
sorted_cmp()
def hello():
return 'python'
print(hello())
可以看到这个代码导入了自定义模块 my_time,就可以进行 sort 和 sorted 的比较
可以看到确实是能够进行比较,但是执行hello 函数时,导入的模块中也有 hello 函数,但是执行的却是本代码的 hello 函数
因此:如果导入的模块的函数名与本文件的函数名相同,执行时,采取就近原则,执行本文件的函数
那么如何让其执行模块中的函数呢,就要对模块中的函数,进行函数名的更改
import random
import my_time # 导入自定义模块my_time
from my_time import hello as world # 将导入模块中的函数名改为指定的函数名
li = [random.randint(1, 20) for i in range(1000)]
@my_time.timeit
def list_sort_cmp():
li.sort()
return li
@my_time.timeit
def sorted_cmp():
li1 = sorted(li)
return li
list_sort_cmp()
sorted_cmp()
def hello():
return 'python'
print(world())
这样就可以看到执行的是模块中的 hello 函数,只不过运行时的函数名是更改后的函数名
如果 from my_time import * 从模块中导入模块的所有函数
import random
import my_time # 导入自定义模块my_time
from my_time import hello as world # 将导入模块中的函数名改为指定的函数名
from my_time import * #导入模块中的所有函数
li = [random.randint(1, 20) for i in range(1000)]
@my_time.timeit
def list_sort_cmp():
li.sort()
return li
@my_time.timeit
def sorted_cmp():
li1 = sorted(li)
return li
list_sort_cmp()
sorted_cmp()
def hello():
return 'python'
print(money)
打印 money 是可行的,为 1000
那么在 导入模块中所有函数时,对其进行限制呢;
这就需要在模块方进行权限的限制
# __all__是用来限制 from my_time random * 这个命令的
__all__=['hello','timeit']
在 all 名单中的是可以使用的函数,其他的则不可
现在就可以看到,函数 money 是禁止使用的
如果,原模块有要打印的东西,比如:
import functools
import time
money = 1000
def timeit(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
start_time = time.time()
res = fun(*args, **kwargs)
stop_time = time.time()
print('time:%.6f' % (stop_time - start_time))
return res
return wrapper
def hello():
return 'hello'
print('这是写好的模块里面要显示的内容......')
print(timeit(hello))
print(__name__)
模块本身需要打印的内容 有这三个
而导入这个模块后,运行结果就会这样:
显而,我并不需要这三行的内容,只需要运行的结果,该怎麼办;
可以看到 同样是 name 命令,但是输出的结果,是不同的:
本代码输出 name 时,不像模块中执行的那样
模块中执行 name 时,输出为 main
而本代码中执行 name 时,输出为 调用的 装饰器名 timeit
这样,就可以解决这个问题了;在模块方,限制一下这个命令:
# 判断模块是否被导入,如果没有被导入,则执行下面的代码
if __name__ == '__main__':
print('这是写好的模块里面要显示的内容......')
print(timeit(hello))
print(__name__)
可以看到,在导入模块使用时,并没有执行里面的内容,因为本代码的 name 的执行结果为my_time 并不是 main ,因此并不会执行
四 导入第三方模块
在这里导入第三方模块 itchat
1)那么,如何给别人发放信息呢
import itchat
import random
import time
itchat.auto_login(hotReload=True) #热加载登陆
while True:
# 给手机助手发送消息
itchat.send('hello', toUserName='filehelper') #发送内容为 hello,发送对象为 filehelper
time.sleep(random.randint(1, 3)) #随机隔1~3秒,发送一次
本次发送对象为 filehelper 手机助手,会自动生成二维码,使用手机威信扫一扫就可以运行了
可以看到威信登陆成功,这样每隔1~3秒,就会对手机助手发送 hello
2)如何来统计登陆威信方的一些信息呢
这里统计一下,男女的比例
import itchat
itchat.auto_login(hotReload=True) #热加载登陆
# 统计好友男女比例
# firends是一个类似列表的数据类型,其中第一个是自己的信息,除了第一个是你的好友的信息
friends=itchat.get_friends()
info={}
for friend in friends[1:]:
if friend['Sex'] == 1:
info['male']=info.get('male',0)+1
elif friend['Sex'] == 2:
info['female']=info.get('female',0)+1
else:
info['other']=info.get('other',0)+1
print(info)
可以看到却实是统计了威信登陆方的男女比例,other为未设置男女的威信好友个数
3)图灵聊天机器人
这里我们导入模块 requests 网络解决处理库
import requests
def get_tuling_response(_info):
print(_info)
# 图灵机器人的网址
api_url = "http://www.tuling123.com/openapi/api"
data = {
'key': 'ef6db942f75949d68713465859114802',
'info': _info,
'userid':'wechat-robot'
}
# 发送数据到指定网址获取网址返回的数据(字典数据类型)
res = requests.post(api_url, data).json()
# print(res, type(res))
# 给用户返回的内容
print(res['text'])
return res['text']
get_tuling_response('朋友,讲个笑话')
连接图灵机器人的接口,来实现自动聊天
它会根据你输入的内容,来回答你,比如,上面代码所写,让它讲个笑话,结果
就会回复一个所讲的笑话
那么,又如何将机器人与威信相结合,来实现威信的自动聊天呢
import random
import itchat
import requests
import time
def get_tuling_response(_info):
print(_info)
# 图灵机器人的网址
api_url = "http://www.tuling123.com/openapi/api"
data = {
'key': 'ef6db942f75949d68713465859114802',
'info': _info,
'userid': 'wechat-robot'
}
# 发送数据到指定网址获取网址返回的数据(字典数据类型)
res = requests.post(api_url, data).json()
# print(res, type(res))
# 给用户返回的内容
print(res['text'])
return res['text']
# get_tuling_response('朋友,讲个笑话')
@itchat.msg_register(itchat.content.TEXT, isFriendChat=True) #只接受好友的文本信息
# 假使是isGroupChat=True接收群聊消息中的文本信息, 并让图灵机器人自动回复
def text_reply(msg):
# 获取好友发送消息的内容
content = msg['Content']
# 将好友的消息发送给机器人处理, 处理结果就是返回给好友的消息
returnContent = get_tuling_response(content)
time.sleep(random.randint(1, 10))
return returnContent
if __name__ == "__main__":
itchat.auto_login(hotReload=True)
itchat.run()
这样就将两者结合在一起了,只有有人给你发送文本信息,就会自动回复
那么如果有些朋友或者群,不能就这样草草的回复,那么该如何呢
这里,要求对指定的群进行回复,没指定的群,不给予回复
import random
import itchat
import requests
import time
def get_tuling_response(_info):
print(_info)
api_url = "http://www.tuling123.com/openapi/api"
data = {
'key': '5ea0f11b5b6146239c52a47849387484',
'info': _info,
'userid': 'wechat-robot'
}
res = requests.post(api_url, data).json()
print(res['text'])
return res['text']
@itchat.msg_register(itchat.content.TEXT, isGroupChat=True)
def text_reply(msg):
res = itchat.search_chatrooms('3272')
info = res[0]['UserName']
content = msg['Content']
returnContent = get_tuling_response(content)
time.sleep(random.randint(1, 10))
itchat.send(returnContent, toUserName=info)
return returnContent
if __name__ == "__main__":
itchat.auto_login(hotReload=True)
itchat.run()
itchat模块中提供了这种方法,通过查找该人或群的信息,指定对其id进行消息的发送
4)生成二维码
import qrcode
img=qrcode.make('hello world')
img.save('hello.png')
这样就会生成二维码 hello world ,扫描hello.png时,扫描的结果为 hello world
当然也可以生成百度的二维码
import qrcode
img=qrcode.make('http://www.baidu.com')
img.save('baidu.png')
五 导入包中的模块
在此目录中建立一个包,将 my_time 模块放在里面,重新命名为 my_TIM,它会自动在包中生成一个init文件
而当import导入包时,实质是执行包里面的init.py文件
import Pack01.my_TIM
@Pack01.my_TIM.timeit
def fun():
return 'java'
fun()
当然也可以 from 去直接导入
from Pack01.my_TIM import timeit
@timeit
def fum():
return 'python'
fum()
六 导入os模块
系统目录间的分隔符,
Linux: /var/log/messages
Windows: C:\Project\hello.py
os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作
因此导入os模块来化解此问题
1. 如何在linux中执行shell命令
1)可以判断命令是否执行成功; 返回值为0, 执行成功, 返回值不为0, 执行失败
import os
res = os.system('hostname')
print("res:", res)
可以看到返回值为0,执行成功,hostname 为localhost
2)用来保存命令的执行结果
import os
res = os.popen('hostname').read()
print("res:", res)
2. 让威信来远程操作
import os
import itchat
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
# 需求:当文件助手发送消息,执行发送的内容:
# 1).如果执行成功,[显示执行成功]:执行结果
# 2).反之,显示执行失败
print(msg)
if msg['ToUserName'] == 'filehelper':
# 获取要执行命令的内容
command = msg['Content']
# 让电脑执行命令代码
# 如果执行成功,返回值为0
if os.system(command) == 0:
res = os.popen(command).read()
result = '命令执行成功,执行结果为' + res
itchat.send(result, 'filehelper')
# 如果执行失败,请重新输入
else:
result = '命令%s执行失败,请重新输入' % (command)
itchat.send(result, 'filehelper')
if __name__ == '__main__':
itchat.auto_login(hotReload=True)
itchat.run()
威信通过手机助手发送命令,来远程操作,比如:
手机助手发送一个 hostname 命令,这边就会执行此命令,并且反还给手机执行结果
七 如何安装第三方模块
1) pip3 install 模块名
直接进行安装
2)通过pycharm安装模块
八 模块的默认搜索路径
模块的查找顺序:内存中已经加载的模块—>内置模块—–>sys.path里面的模块
那么如何来查找内存中已经加载的模块:
sys.modules查看,python解释器启动是会默认加载的内容
还有要注意一点的是:
自定义模块是不能与内置模块冲突的