生成器用法

迭代器总结(迭代取值和索引取值的对比)

迭代器主要就迭代取值,另一种方式就是索引取值(下标取值)

迭代取值:

        1. 不依赖索引取值的一种取值方式

        2. 不能够重复取值,只能够从左往右固定取值

索引取值:

        1.它能够重复取值(通过索引取值)

        2. 它需要时容器类型

生成器

1. 背景:通过列表生成式,我们可以直接创建一个列表,但是,收到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表。不仅占用很大的内存空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间就都白白浪费了

       

        所以,如果列表可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list从而节省大量的空间,在python中,这种一边循环一边计算的机制,称为生成器(generator)

                python中生成器是自定义迭代器的一种

2.如何使用生成器

        关键字:yield

'''

当函数中一旦出现了yield关键字,函数在没有调用的时候仍然是普通函数,但是只要一调用函数,那么,该函数就不是普通函数了

就变成了生成器

'''

3.关键字yield

        生成器其实就是一个自定义的迭代器

        代码只要调用next方法,代码就会走到函数中第一个yield关键字所在的位置停住

        代码从上一次yield停住的地方继续放下执行,直到遇到下一个yield停住

        yield后面有多个返回值时,会以元组的形式返回

生成器yield的其它用法

def eater(name):
    print('%s:正在吃...'% name)
    while True:
        food=yield
        print('%s正在吃%s'%(name,food))
        
        '''eater就变成了生成器'''
        res=eater('jerry')  # 生成器对象:generator object
        print(res)
        
        res.__next__()
        
        # send做了两件事:1.传值给yield  2.执行__next__
        res.send('包子')
        res.send('包子')
        res.send('包子')
        res.send('包子')
        res.send('包子')
        res.send('包子')
        res.send('包子')
        res.send('包子')
        res.send('包子')

生成器表达式

# 列表生成式
res=[name for name in names_list]
print(res)  #  就是列表

res1=(name for name in names_list)
print(res1)
names_list=['kevin','jerry','tony','oscar']
res1=(name for name in names_list)
print(res1)

print(res1.__next__())
print(res1.__next__())
print(res1.__next__())
print(res1.__next__())

'''生成器表达式如果不适用数据,就不给你数据'''

把迭代器,生成器看成是一个工厂,什么时候需要数据就给你加工数据
目的:就是为了节省内存空间

yield和return对比

yield

        1.代码遇到yield不会停止,而是停住

        2. yield可以有返回值,并且支持多个,以元组的形式返回

        3. yield可以把一个函数变成生成器

return

        1.代码遇到return就会停止

        2. return可以有返回值并且还支持多个,以元组的形式返回

程序员必知的网站

1. https://www.runoob.com/python/python-func-dir.html
2. https://www.w3school.com.cn/html/index.asp
3. 博客园、CSDN、github、gitee、等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值