迭代器的特征:可以使用next对数据进行迭代操作
# 迭代器的特征:可以使用next对数据进行迭代操作
itr = iter([11, 22, 33])
res = next(itr)
print(res)
res = next(itr)
print(res)
res = next(itr)
print(res)
# 运行结果为:
11
22
33
=========================================================================================
# 当迭代器中的数据,全部迭代完毕之后,再次进行迭代会抛出StopIteration异常
res = next(itr)
print(res)
# 运行结果为:
# 报错:StopIteration
=========================================================================================
生成器和迭代器列表占用内存
input()
li = [i for i in range(10000000)]
print(li)
# 定义成迭代器
li = iter([i for i in range(10000000)])
print(li)
# 定义成生成器
li=(i for i in range(10000000))
print(li)

=========================================================================================
以函数形式定义成的生成器
def func():
for i in range(100):
yield i
print(f"------{i}______")
# 生成器函数调用时不会执行,之间返回一个生成器对象
res = func()
# 生成器进行迭代操作的时候,才会执行生成器函数中的代码
# 使用next进行迭代,就可以启动生成器函数执行
res1 = next(res)
print("第一次next执行迭代出来的数据为:", res1)
res2 = next(res)
print("第二次next执行迭代出来的数据为:", res2)
# 运行结果为:
# 第一次next执行迭代出来的数据为: 0
# ------0______
# 第二次next执行迭代出来的数据为: 1
=========================================================================================
通过类型判断去区分生成器和迭代器
from collections.abc import Iterator, Generator
# 通过类型判断去区分生成器和迭代器
g = (i for i in range(10))
def func():
yield 100
i = iter([11, 22, 33])
g2 = func()
print(isinstance(g2, Iterator))
print(isinstance(g2, Generator))
print("-" * 20)
print(isinstance(i, Iterator))
print(isinstance(i, Generator))
# 运行结果为:
# True
# True
# --------------------
# True
# False
=========================================================================================
生成器和迭代器的方法
# ---------生成器和迭代器的方法------------
i = iter([11, 22, 33])
def func():
for i in range(10):
yield i
g = func()
# 生成器和迭代器的迭代数据(使用内置函数 next)
print(next(i))
print(next(g))
# 1、生成器的 close 方法(关闭生成器),若是关闭后不能再次调用,否则报错
# g.close()
print(next(g))
# 运行结果为:
11
0
1
=========================================================================================
生成器 send 方法(可以和生成器内部进行数据交互)
# -------------------------------------------------------
# 2、生成器 send 方法(可以和生成器内部进行数据交互)
# 注意点:send方法必须在使用 next 方法之后才能使用,否则会报错。
def func():
for i in range(10):
res = yield i
print("res的值为:", res)
g = func()
next(g)
print("----send----方法")
print(g.send(100))
print(g.send(999))
# 运行结果为:
----send----方法
res的值为: 100
1
res的值为: 999
2
=========================================================================================
throw 方法,往生成器内部主动抛出异常
# throw 方法,往生成器内部主动抛出异常
def func():
for i in range(10):
try:
res = yield i
print("res的值为:", res)
except:
pass
g = func()
next(g)
res = g.throw(ValueError)
print(res)
# 运行结果为:
Exception ignored in: <generator object func at 0x000001860D4AAB30>
RuntimeError: generator ignored GeneratorExit
1
=========================================================================================
pytest 中的 fixtrue 大概实现原理
def fixtrue():
print("====前置执行=====")
name = "python"
yield name
print("====后置执行====")
def test_demo(fixtrue):
print("fixtrue中yield返回值:",fixtrue)
print("-----测试用例-----")
g = fixtrue()
res = next(g)
test_demo(res)
try:
next(g)
except:
pass
# 运行结果为:
====前置执行=====
fixtrue中yield返回值: python
-----测试用例-----
====后置执行====
584

被折叠的 条评论
为什么被折叠?



