首页 python基础教程 Python生成器和迭代器的构造和传值
pay pay

Python生成器和迭代器的构造和传值

日期: 2021年12月1日 04:39
栏目: python基础教程
阅读: 306
作者: python自学网

摘要: 把列表推导式中的中括号改写成小括号就实现生成器效果了,生成器也是特殊的迭代器,生成器和迭代器都只能使用一次。

把列表推导式中的中括号改写成小括号就实现生成器效果了,生成器也是特殊的迭代器,生成器和迭代器都只能使用一次。

1.生成器构造方法

list1 = [i for i in range(1, 10000) if i % 3 != 0]
print(list1)
its = (i for i in range(1, 10000) if i % 3 != 0)
print(its)

2.生成器的三种访问方式

print(next(its))
print(next(its))
print(its.__next__())
for i in its:
    if i < 100:
        print(i)

3.使用含有yield语句的函数来构造生成器

def test():
    print('+++++++++')
    yield '状态1'
    print('+++++++++')
    yield '状态2'
    print('+++++++++')
    yield '状态3'
    print('+++++++++')
    yield '状态4'
    print('+++++++++')

# test()  # 直接调用函数不会执行任何代码
res = test()
print(next(res))  # 返回第一个yield语句的状态值,到此被阻断,后面的print没有执行
print(next(res))  # 每次遇到yield都会被阻断

4.迭代器执行到最后,如果再次执行next会返回错误,因为迭代器是会记录状态的,状态执行完毕就会返回错误

def test():
    for i in range(1, 9):
        print('++++++++++++')
        yield ('状态%d' % i)
        print('++++++++++++')
res = test()
print(next(res))

5.send()方法给yield传值

def test():
    res1 = yield '状态1'
    print(res1)
    res2 = yield '状态2'
    print(res2)

res = test()
# print(next(res))
# print(res.send('aaa'))  # 给yield传值,但是不能直接从第一步就使用send方法
print(res.send(None))  # 如果第一次调用只能传None,因为send是记录上一次的挂起状态,第一步没有上一次

res.close()  # 关闭生成器
print(res.__next__())  # 后面不能访问,返回:StopIteration

# 如果生成器中有return语句,一旦next遇到return就会停止并返回return的返回值

 

回顶部