【100+ python基础入门-50】Python生成器和迭代器的构造和传值

导读:本篇文章讲解 【100+ python基础入门-50】Python生成器和迭代器的构造和传值,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

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的返回值

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73423.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!