一、迭代器
迭代器就是一个容器,将可迭代对象通过iter包起来
li = [1, 2, 3, 4, 5]
a = liter(li) # 迭代器
1、迭代器的取值
print(next(a)) # 1
print(next(a)) # 2
print(next(a)) # 3 一个个取值
"""
1.访问者不需要去关心内部结构,只需要通过next不断去取下一个内容。
2.只能从头到尾依次访问,不能回退
3.便于循环比较大的数据集合,节省内存
"""
2. --next–
__next__:可迭代对象和迭代器的区别
可迭代对象有 __liter__
迭代器 __liter__, __next__
两者都可以 for 循环
3、for 实现迭代原理
li = [1, 2, 3, 4, 5]
itr = iter(li)
try:
while True: # 死循环
b = next(itr)
print(b) # StopIteration 异常 超出范围
except StopIteration:
pass
4、自定义可迭代对象
class Mylist:
def __iter__(self):
return iter([1, 2, 3, 4, 5])
a = Mylist()
for i in a:
print(i)
二、生成器
1、生成器的定义
生成器:自定义迭代器更优雅的方式,本质还是一个迭代器
类似函数的逻辑
def func(): # 容器
yield 1
2、生成器的取值
def f():
yield 1
yield 5
yield 8
g = f()
print(g) # 生成器对象
print(next(g)) # 1
print(next(g)) # 5
for i in g:
print(i) # 1 5 8
3、暂停和恢复
def f():
print(1)
yield 5
print(2)
yield 9
print(3)
yield 8
g = f() # 生成器对象
# 取值
next(g) # 执行函数,至yidld终止 结果 1
# 用变量去接收
res = next(g) # 返回yidld后面的值 结果 5
print(res)
res = next(g) # 再次返回 结果 9
print(res)
# 魔术方法
res = g.__next__() # 功能和上面一样
print(res) # 结果 8
# 如果超出取值范围会报错 StopIteration
# 和return的区别是
return 会整体退出,不在执行之后的代码
4、应用
列表取值占内存,生成器只有在取用的时候才会生成这个元素加载到内存里
import time # 导入模块
def f(con, n):
count = 0
while True:
if count < n:
yield con # 生成器函数
count += 1
else:
break
man = f("原擎, 加油加油", 10)
# 取值
for i in man: # 循环取值
print(i)
time.sleep(1) # 时间间隔
三、推导表达式
# a = [i for i in range(10)]
# print(a)
b = [[j for j in range(10)] for i in range(10)]
print(b)