1.生成器
- 如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Cenerator)。
- 延迟计算、惰性求值
- 节省内存,高效
- 缺点:无法随机存取
- 生成器(Generator)生成器会产生一个对象,而不是一个列表
1.1 yield表达式
- yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行
# yeld关键字生成生成器
def test(n):
for i in range(1,n +1 ):
yield i # yield 暂停函数执行,并返回yield后面表达式的值
# 得到生成器
res = test(10)
# print(res,type(res)) # 输出:<generator object test at 0x00000182D5AD0AC0> <class 'generator'>
# 生成器不能随机存取,使用next()函数获取下一个值,数据取完后,不能在调用next函数,否则会出现StopIteration
# print(next(res)) # 输出1
# print(next(res)) # 输出2
# print(next(res)) # 输出3
# 生成器只能遍历一次,下面不会有任何输出
for x in res:
print(x)
# 可以这样写
for x in test(10):
print(x)
# 不会有任何输出,生成器:res = test(10) 只能遍历一次
# for i in res:
# print(i)
1.2 生成器表达式
- 生成器【Generator】生成器会产生一个可迭代对象,而不是一个列表。生成器表达式很类似列表生成式:
- (表达式 for var in 可迭代对象)
# 高仿range()函数
def my_range(start,end,step = 1):
i = 0
while True:
value = start + step * i
i += 1
if value >= end:
return
yield value
# 生成器表达式
'''
表达式 for var in 可迭代对象
'''
gen = (value for value in my_range(0,100,2))
print(type(gen)) # 输出:<class 'generator'>
for i in gen:
print(i,end=" ")
2.迭代器
-
直接作用for-in循环数据类型都被称为可迭代对象(iterable),可以使用isinstance()判断一个对象是否时可迭代对象,可以直接作用与for-in循环的数据类型:
-
数据结构:list,set,tuple,dict,string
-
generator【生成器】【(),函数结合yield】
-
list,set,tuple,dict,string是可迭代对象,但是不是迭代器,只有生成器才是迭代器
import collections.abc
# 判定可迭代对象
print(isinstance({},collections.Iterable))
# 将迭代对象转换为迭代器
list1 = [2,4,5,6]
# print(next(list1)) #TypeError: 'list' object is not an iterator
res = iter(list1) # iter可以将可迭代对象转换为迭代器
print(next(res))
print(next(res))
3.包
- 包解决模块重名问题,Python引入以目录方式组织模块,称为包(Package),一个包中可以包含模块、包。
- Python的包中必须包含特殊文件,被命名未__init__.py,告诉解释器这是一个包,目录不需要一定要有,目录和包区别;
- 包可以使用import导入包中模块,目录不行
4.模块
- 提高代码的可复用,可维护性,提高发开效率,模块编写完毕后,方便在其他项目导入
- 解决命令冲突,不同木块中相同的命令不会冲突
- 创建模块,设置模块名尽量不要与Python自带的标准模块名称相同
标准库 | 说明 |
---|---|
builtins | 内建函数默认加载 |
math | 数学库 |
random | 生成随机数 |
time | 时间 |
datetime | 日期和时间 |
calendar | 日历 |
hashlib | 加密算法 |
copy | 拷贝 |
functools | 常用的工具 |
os | 操作系统接口 |
re | 字符串正则匹配 |
sys | Python自身的运行环境 |
multiprocessing | 多进程 |
threading | 多线程 |
json | 编码和解码JSON对象 |
logging | 记录日志,调试 |
4.1 使用import语句导入模块
- 语法:import modulenname [as alias]
'''
import语句模块顺序:
Python标准库
第三方库
自定义库
'''
# 使用import导入标准库模块 as 给模块起别名
import datetime as t # 导入时间日期模块
print(t.datetime.now()) # 输出当前时间:2020-02-21 15:29:01.327352
# import一次导入多个模块,不推荐
import datetime,math,os,sys
4.2 使用from …import语句导入模块
- 使用import语句导入模块,没次执行创建新的命名空间(namespeace),且该命名空间中执行与.py文件相关所有语句。
- 不想每次导入模块时创建一个新的命名空间,将具体定义导入当前命名空间中,可以使用from…import语句,不需要添加前缀,直接使用具体变量,函数名,类名访问即可
- 使用from…import语句导入模块中的定义时,保证所导入内容在当前命名空间时唯一,否则出现冲突,在导入的同名变量,函数,或者类会覆盖先前导入的,这时就需要使用impor语句进行导入
- 语法:from modelname import member
# 使用from...impor导入具体模块名
from django.db import models
4.3 模块搜索目录
- 使用import语句导入模块时,默认情况下,会按照一下顺序查找
- 当前目录(即执行的Python脚本文件所在目录)下朝朝
- 到PYTHONPATH(环境变量)下的每个目录中查找
- 到Python的默认安装目录下查找
import sys # 导入标准模块sys
print(sys.path) # 输出具体目录
'''
['E:\\千锋教育\\第16_模块\\代码',
'E:\\千锋教育',
'E:\\venv\\django2.0\\Scripts\\python38.zip',
'E:\\venv\\django2.0\\DLLs',
'E:\\venv\\django2.0\\lib',
'E:\\venv\\django2.0\\Scripts',
'e:\\python3.8.1\\Lib',
'e:\\python3.8.1\\DLLs',
'E:\\venv\\django2.0',
'E:\\venv\\django2.0\\lib\\site-packages']
'''
4.3.1 临时添加
- 临时添加即在导入模块的中Python文件中添加。例如,需要将"E:\program\Python\Code\demo",添加到sys.path中,可以使用下面的代码:
# 该方法添加的目录旨在执行当前文件的窗口中有效,窗口关闭后即失效
import sys
sys.path.append('E:/program/Python/Code/demo') # 临时添加
4.3.2 增加.pth文件(推荐)
- 在Python安装目录下的’Lib\site-packages’子目录创建一个扩展名为.path文件(E:\Python3.8.1\Lib\site-packages).
- 创建.pth文件,需要重新打开执行的导入模块Python文件
- 该方法只在当前版本Python中有效
4.3.3 在PYTHONPATH环境中添加
- 该方法添加的目录可以在不同版本中Python中共享
5.以主程序的形式执行
pinetree = '我是一棵松树' # 定义全局变量
def fun_christmastree(): # 定义函数
'''
功能:测试一个梦
:return: 无
'''
pinetree = '挂上彩灯,礼物...我变成一棵圣诞树@^.^@ \n' # 定于局部变量
print(pinetree)
#*****************判断是否以主程序的形式运行******************************#
if __name__ == '__main__':
print('\n下雪了...\n')
print('==============开始做梦================')
fun_christmastree() #调用函数
print('===============梦醒了=================')
pinetree = '我身上落满雪花' + pinetree + '-_-' #为全局变量赋值
print(pinetree) #输出全局变量
'''
输出:
下雪了...
==============开始做梦================
挂上彩灯,礼物...我变成一棵圣诞树@^.^@
===============梦醒了=================
我身上落满雪花我是一棵松树-_-
'''