一.模块的导入
1.定义
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
包括:内置模块,自定义模块,第三方模块;
2.作用
-最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
3.模块导入的方式
1)import
import导入模块执行的操作:
- 产生一个新的名称空间;
- 在新建的名称空间俩面执行模块(.py)的内容
- 拿到了一个模块名, 执行模块文件产生的名称空间.
2)import …. as …
对于导入的模块重命名
3)from …. import ….
from …. import ….. as ….
从模块里面导入函数, 变量, 装饰器等…..
4.之前已经接触的模块(内置模块)
1.import getpass
getpass.getpass() ###隐藏输入的密码
2.import time
time.sleep(2) ###停两秒
time.time() ###返回一个以秒为单位的时间
time.ctime() ###返回字符串时间(能看懂的时间)
3.import math
math.pow(2,3) ###求2的3次方
4.import os
print(os.listdir('/var/log/'))###列出当前目录下的所有文件
5.import random
random.random() ###(0,1)随机选择一个小数
random.randint(1,4) ###(1,4)随机选择一个整数
random.choice('hello') ### 从序列中拿出一个值出来
random.sample(string.ascii_letters + string.digits, 4) # 从序列中拿出指定个值出来
random.shuffle(list(range(1,10))) # 打乱顺序
6.import functools
functools.reduce(lambda x,y: x+y, range(10)) ##导入一些函数
7.import string
string.ascii_letters ###所有大小写字母
string.ascii_uppercase ##所有大写字母
string.ascii_lowercase ##所与小写字母
5.第三方模块
这里我以itchat第三方模块为例
1.安装itchat模块
执行命令:pip3 install itchat
这里我已经安装,所以出现以下提示
如果安装过程中出现无法安装itchat的问题,需要重新配置文件,或者从别人已经下好的下载一个即可
例:
1. 给手机助手发送消息
import itchat
import time
import random
itchat.auto_login(hotReload=True) ###使用热加载,下次登陆时不用再扫描二维码
while True:
itchat.send('hello', toUserName="filehelper") ##发送文本消息
itchat.send_file('/etc/passwd', toUserName='filehelper') ###传文件
time.sleep(random.randint(1, 3)) ###随机停留时间发送
2.查看所有好友的基本资料
import itchat
itchat.auto_login(hotReload=True)
friends = itchat.get_friends()
for i in friends:
print(i)
- 统计你的好友的男女比例
# friends是一个类似列表的数据类型, 其中第一个是自己的信息, 除了第一个之外是你的好友信息.
import itchat
import time
import random
itchat.auto_login(hotReload=True)
friends=itchat.get_friends()
print(friends)
info = {} # 'male':1, 'female':2, 'other':
for friend in friends[1:]:
if friend['Sex'] == 1:
info['male'] = info.get('male', 0) + 1
###info.get() 就是返回info字典中要查找的关键字若没有,则value值返回0,然后再加1,如果有,就不返回0,直接加1
elif friend['Sex'] == 2:
info['female'] = info.get('female', 0) + 1
else:
info['other'] = info.get('other', 0) + 1
print(info)
4.给指定的好友发送消息
import itchat
import time
itchat.auto_login(hotReload=True)
# 根据好友的备注查找好友的信息, 返回值为列表, 有多个元素;
res = itchat.search_friends("好友的备注")
print(res)
# 通过索引获取该好友的详细信息(字典数据类型)
name = res[0]['UserName']
while True:
itchat.send('要发的内容', toUserName=name)
time.sleep(3)
5.图灵迷你聊天机器人
import time
import itchat
import requests
import random
while True:
def get_tuling_response(_info):
# print(_info)
# 图灵机器人的网址
api_url = "http://www.tuling123.com/openapi/api" ##图灵api
data = {
'key': '5e4bf6c466934b6a9b271b07c78d1ae1', ##图灵机器人接口
###没有的话可以自己注册一个
'info': _info, ###输入的内容
'userid':'forever_wen'
}
#发送数据到指定的网址,获取网址返回的数据类型(字典类型)
res = requests.post(api_url, data).json()
# print(res, type(res))
# 给用户返回的内容
return res['text']
print(get_tuling_response(input()))
二.模块的默认查找路径
模块的查找顺序:
内存中已经加载的模块 –> 内置模块 > sys.path目录里面的模块
内存中已经加载的模块 :
sys.modules查看, python解释器启动式默认会加载的模块内容.
注意:
自定义,模块千万不要跟内置模块冲突.
三. 包
在python中一个文件可以被看成一个独立模块,而包对应着文件夹。模块把python代码分成一些有组织的代码段,通过导入的方式实现代码重用;包将有联系的模块组织在一起,有效避免模块名称冲突问题,让应用组织结构更加清晰。区别包和文件夹的重要特征就是包文件夹内每一层目录都有初始化文件) _ _init __.py
_ _init _ _ .py可以是空文件,也可以有Python代码,因为 _ _init _ _.py本身就是一个模块,而它的模块名就是包的名称!
这里我用具体例子来说明
1.import方法
例:首先创建一个包Pack01,并在包内创建一个_ _init.py _ _ 文件
和一个想要调用的函数或装饰器
当想通过import方法导入时timeit函数时,我们发现在调用时并没有这个函数
而如果我们在init.py中加入from Pack01.myTimeit import timeit时,就可以调用了
总结:当用import导入包时,实质是执行包里面的_init_(.py文件)
2.from…import ….方法
from Pack01.myTimeit import timeit as atime
@atime
def fun():
return 'woshinibaba'
print(fun())
这种方法可以直接调用
3.from … import * 方法(导入所有可以调用的)
但我们也可以在将要被调用的函数中限制可调用项
import time
money=1000
def timeit(fun): # con_add
def wrapper(*args,**kwargs):###接收可变参数和关键字参数
# 函数执行前
start_time = time.time()
# 执行函数
fun(*args,**kwargs)##args解包
# 函数执行后
end_time = time.time()
print("运行时间为:%.6f" % (end_time - start_time))
return wrapper
#__all__用来控制 from xxx import *导入的内容
__all__=['hello','timeit']
def hello():
return 'hello2'
例:这时我将变量money限制了,所以其他文件在调用时无法调用money
4.问题: 导入模块时, 模块里面执行代码结果也会显示
当然我们也可以判断模块是否被导入
_ _name _ , 所在文件没有当作模块导入是, 结果为 _ _main _ _;
_ _name _ _, 所在文件被当作模块导入是, 结果为模块的名称;
在要调用的函数或其他的最后加上以下命令即可
import time
money=1000
def timeit(fun): # con_add
def wrapper(*args,**kwargs):###接收可变参数和关键字参数
# 函数执行前
start_time = time.time()
# 执行函数
fun(*args,**kwargs)##args解包
# 函数执行后
end_time = time.time()
print("运行时间为:%.6f" % (end_time - start_time))
return wrapper
#__all__用来控制 from xxx import *导入的内容
__all__=['hello','timeit']
def hello():
return 'hello2'
#判断模块是否被导入,若没有导入,执行下面代码
if __name__=='__main__':
print('这是写好的模块里面的显示')
print(timeit(hello))
print(__name__)