13 迭代器、生成器、模块、包
一、推到表达式
a = [x for x in range(10)]
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = [x for x in range(1,10,2)]
print(a) # [1, 3, 5, 7, 9]
a = [x for x in range(1,10,2) if x>3]
print(a) # [5, 7, 9]
二、迭代器
1、可迭代对象
for 、 __iter__
for i in range(10):
print(i)
2、 迭代过程
就是一个依次从数据结构中拿出东西的过程
3、 迭代器
1) iter() __iter__
从可迭代对象生成一个迭代器 iter() __iter__
2) next() __next__
取值 next() __next__
li = [1,2,3,4,5]
a = iter(li) # a就叫迭代器
print(next(a)) # 1
print(next(a)) # 2
print(next(a)) # 3
print(next(a)) # 4
print(next(a)) # 5
print(next(a)) # 5 # 值取次数超过可迭代对象的长度则报错
3)迭代器的特点
适合用于遍历一些巨大的或者无限的集合
4) 区分可迭代对象和迭代器
li = [1, 2, 3]
print("1") if "__iter__" in dir(li) else print("0")
print("1") if "__next__" in dir(li) else print("0")
print(dir(li))
a = iter(li)
print("1") if "__iter__" in dir(a) else print("0")
print("1") if "__next__" in dir(a) else print("0")
print(dir(a))
# 迭代器拥有"__iter__"和"__next__"方法
5) for 循环实现迭代
python将关键字in后面的对象调用iter函数获取迭代器,然后用迭代器的next方式,知道抛出StopIteration异常
li = [1, 2, 3]
itr = iter(li)
try:
while True:
b = next(itr)
except StopIteration:
pass
6)自定义可迭代对象
li = [1, 2, 3]
class Mylist:
def __iter__(self):
return iter(li)
a = Mylist()
for i in a:
print(a)
三、生成器
生成可迭代对象
1、生成器定义
def func1():
a = 0
while a < 10:
yield a
a += 1
g = func1()
print(g) # <generator object func1 at 0x0031F090>
print(next(g)) # 0
print(next(g)) # 1
print(next(g)) # 2
for i in g:
print(i,end= "") # 3456789
2、暂停和恢复
def func2():
print(11)
yield 1
print(22)
yield 2
print(33)
yield 3
return # 遇到return返回值停止执行后面的代码
print(44)
yield 4
h = func2()
h1 = next(h) # 11 执行函数至yield中止
print(h1) # 1 返回值为yield值
h2 = next(h) # 22 执行函数至yield中止
print(h2) # 2 返回值为yield值
# h3 = next(h) # 33
# print(h3) # 3
h3 = h.__next__() # 调用魔术方法和next(h)效果一样
print(h3)
# 当函数遇到return时(return后不带任何东西),则整体退出,不在执行后面的代码
3、生成器的应用
取出的时候加载到内存。生成器函数只创建了生成器,内部代码不执行。next执行一次,内部代码执行到下一个yield终止
def func(elem,n):
count = 0
while count<n:
count +=1
yield elem
man = func("大爷",10)
for i in man:
print(i) # 打印10次"大爷"
四、模块、包和包管理
1、模块
python文件(.py文件)
import sys
for i in sys.path:
print(i)
2、模块分类
1)内置模块
不需要安装,直接导入使用
2)第三方模块
tornado、django 需要安装 python -m pip install tornado
3)自建模块
在project文件夹下创建lib文件夹存放(编程规范)
3、包
模块是py文件,包是包含了很多模块的文件夹
4、模块导入
(包,层级导入)
from 文件夹名字、文件名字 import 模块名 as 别名
import 模块名
5、添加路径
不推荐的方法,需要导入时,需要添加路径
import sys
sys.path.append("e:")
for i in sys.path:
print(i)