文章目录
- 迭代器和生成器
- 图解迭代器和生成器的关系
- 迭代器
- 容器
- 生成器
- yield函数
- 生成器表达式
- 总结
迭代器和生成器
图解迭代器和生成器的关系
不管是生成器还是我们的容器,最终都是迭代器,使用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方法获取值
"""
总结
不管迭代器还是生成器,只是节省内存使用的方式,实际工作中一般不考虑这种情况,但是面试会被问到
若需要编写迭代器可参考:https://blog.csdn.net/weixin_45336222/article/details/128002893 ↩︎