一 什么是模块
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 的比较

python模块的模块 python模块作用_python


可以看到确实是能够进行比较,但是执行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())

python模块的模块 python模块作用_自定义_02


这样就可以看到执行的是模块中的 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)

python模块的模块 python模块作用_python模块的模块_03


打印 money 是可行的,为 1000

那么在 导入模块中所有函数时,对其进行限制呢;

这就需要在模块方进行权限的限制

# __all__是用来限制 from my_time random * 这个命令的
__all__=['hello','timeit']

在 all 名单中的是可以使用的函数,其他的则不可

python模块的模块 python模块作用_python模块的模块_04


现在就可以看到,函数 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__)

python模块的模块 python模块作用_python_05


模块本身需要打印的内容 有这三个

而导入这个模块后,运行结果就会这样:

python模块的模块 python模块作用_python模块的模块_06


显而,我并不需要这三行的内容,只需要运行的结果,该怎麼办;

可以看到 同样是 name 命令,但是输出的结果,是不同的:

本代码输出 name 时,不像模块中执行的那样

模块中执行 name 时,输出为 main

而本代码中执行 name 时,输出为 调用的 装饰器名 timeit

这样,就可以解决这个问题了;在模块方,限制一下这个命令:

# 判断模块是否被导入,如果没有被导入,则执行下面的代码
if __name__ == '__main__':
    print('这是写好的模块里面要显示的内容......')
    print(timeit(hello))
    print(__name__)

python模块的模块 python模块作用_python_07


可以看到,在导入模块使用时,并没有执行里面的内容,因为本代码的 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 手机助手,会自动生成二维码,使用手机威信扫一扫就可以运行了

python模块的模块 python模块作用_自定义_08


可以看到威信登陆成功,这样每隔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)

python模块的模块 python模块作用_自定义_09


可以看到却实是统计了威信登陆方的男女比例,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('朋友,讲个笑话')

连接图灵机器人的接口,来实现自动聊天

它会根据你输入的内容,来回答你,比如,上面代码所写,让它讲个笑话,结果

python模块的模块 python模块作用_Python_10


就会回复一个所讲的笑话

那么,又如何将机器人与威信相结合,来实现威信的自动聊天呢

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()

python模块的模块 python模块作用_python模块的模块_11


当然也可以 from 去直接导入

from Pack01.my_TIM import timeit
@timeit
def fum():
    return 'python'
fum()

python模块的模块 python模块作用_Python_12


六 导入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)

python模块的模块 python模块作用_Python_13


可以看到返回值为0,执行成功,hostname 为localhost

2)用来保存命令的执行结果

import os
res = os.popen('hostname').read()
print("res:", res)

python模块的模块 python模块作用_python模块的模块_14


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()

威信通过手机助手发送命令,来远程操作,比如:

python模块的模块 python模块作用_Python_15


手机助手发送一个 hostname 命令,这边就会执行此命令,并且反还给手机执行结果

七 如何安装第三方模块

1) pip3 install 模块名

直接进行安装

2)通过pycharm安装模块

八 模块的默认搜索路径

模块的查找顺序:内存中已经加载的模块—>内置模块—–>sys.path里面的模块

那么如何来查找内存中已经加载的模块:

sys.modules查看,python解释器启动是会默认加载的内容

python模块的模块 python模块作用_python模块的模块_16


还有要注意一点的是:

自定义模块是不能与内置模块冲突的