迭代器和生成器

迭代器和生成器
图解迭代器和生成器的关系

在这里插入图片描述

图1-1

​ 不管是生成器还是我们的容器,最终都是迭代器,使用next方法进行有规律的获取元素,不需要将元素都加载到内存进而节省资源利用

迭代器
容器

​ 容器(container)是把多种元素放在一起的数据格式,比如我们的列表、字典、字符串等。我们可以使用for循环进行元素的逐个获取,也可以使用in或者not in判断元素是否存在在我们的容器中。但是这并不是容器本身的能力,而是可迭代对象(iterable)赋予了它这一项能力,简而言之也就是我们的列表、字典等数据都是典型的可迭代对象

​ 以字典为例进行说明:

在这里插入图片描述

a ={"key1":"value1","key2":"value2"}
b= iter(a)
print (b)
print (next(b))
print (next(b))
###################################
C:\Users\abcdefg.py 
<dict_keyiterator object at 0x000001F10EF89CC0>
key1
key2
"""
1、使用iter()方法将容器(字典数据类型也可叫做可迭代对象)生成迭代器
2、使用next()方法获取迭代器中的值
"""

​ 其中迭代器和容器(字典或者列表以及字符串)的区别在于,构建迭代器1不会把所有的元素都加载到内存中而是以延时计算(lazy evaluate)方式返回元素,这正是它的优点。

生成器

​ 生成器我们一般使用yield函数,在函数被调用时就会返回生成器对象,从图1-1我们可以看出生成器最终也是一种迭代器只是相对比较特殊而已

yield函数

​ 直接实例说明:

def test(a):
    print ("开始")
    a=1
    while a<=3:
        a+=1
        yield \
        a
        print ("结束")
a = test(1)
print (a)
print (next(a))
print ("*"*20)
print (next(a))
##################################
C:\Users\x-149\abcdefg.py 
<generator object test at 0x0000015F85D36970>
开始
2
********************
结束
3
"""
1、function 调用遇到yield后
	1、返回一个a也就是yield相当于return
	2、generator生成器
2、使用next()方法会继续yield后的语句执行
	1、print方法打印内容
	2、while循环进行a+1然后return
"""
生成器表达式

​ 生成器表达式看起来像列表推导式,但是它返回的是一个生成器而不是列表对象

x =(x*x for x in range(1,3))
print (x)
print (next(x))
print ("x"*10)
print (next(x))
#######################
C:/Users/x-149/abcdefg.py 
<generator object <genexpr> at 0x0000019FC8856C80>
1
xxxxxxxxxx
4
"""
1、使用表达式的形式生成器
2、使用next方法获取值
"""
总结

​ 不管迭代器还是生成器,只是节省内存使用的方式,实际工作中一般不考虑这种情况,但是面试会被问到


  1. 若需要编写迭代器可参考:https://blog.youkuaiyun.com/weixin_45336222/article/details/128002893 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值