生成器和迭代器

迭代器的特征:可以使用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
-----测试用例-----
====后置执行====

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值