Day 19 迭代器和生成器,json数据
1.迭代器(iter)
序列
迭代器是序列
1.创建迭代器的方式有两种:
1)将其他序列转换成迭代器
2)生成器
特点:1)不能直接查看所有元素(打印迭代器不会显示所有元素)
2)迭代器没法直接同级元素个数
3)如果想要获取迭代器的某个元素必须先将这个元素从迭代器中取出,取出来的元素不能重新再放回迭代器中,获取元素的时候只能获得当前迭代器的第一个元素(最顶层的元素)
列表是一个无盖的箱子,能知道元素个数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sv4S7THb-1614603057136)(C:\Users\72405\Desktop\QQ图片20210227092745.png)]
2.查 — 获取迭代器中的元素
不管以什么样的方式获取到了迭代器中的某个元素,那么这个元素一定会从迭代器中消失
1)查单个
next(迭代器) - 获取迭代器当前最上层元素
iter1 = iter('hello')
print(iter1) # 'hello'
print(next(iter1)) # 'h'
print(next(iter1)) # 'e'
print(next(iter1)) # 'l'
print(next(iter1)) # 'l'
print(next(iter1)) # 'o'
print(next(iter1)) # 报错!因为迭代器中已经没有元素了
2)遍历
for 变量 in 迭代器:
循环体(变量依次获取迭代器中的每个元素)
iter1 = iter('hello')
for x in iter1:
print('x', x)
"""
x h
x e
x l
x l
x o
"""
iter2 = iter('python')
next(iter2) # 获取最上层元素p,查完之后就取出
for x in iter2: # 遍历之后就变成空的了
print('x', x)
"""
x y
x t
x h
x o
x n
"""
2.生成器
1.什么是生成器
生成器从容器角度是一种特殊的迭代器、生成器获取元素的方式和迭代器一样。
2.怎么创建生成器
调用一个带有yeild关键字的函数就可以得到一个生成器(只要函数体中有yeild就行,不管yeild在函数执行的时候是否有效)
函数中如果有yield:
a.调用函数不会执行函数体
b.不会获取函数返回值
c.函数调用表达式的结果是生成器
def func1():
print('函数') # 函数
return 100
result = func1()
print(result) # 100
def func1():
yield
print('函数')
return 100
result = func1()
print(result) # <generator object func1 at 0x000002226661C350>
3.确定生成器产生数据的个数和值
1)生成器能产生多少个数据,看生成器对应的函数的函数体在执行过程中会遇到几次yield
def func3():
yield
print('函数')
return 100
gen1 = func3()
print(gen1) # <generator object func3 at 0x0000020AEF1FC350>
2)生成器产生的数据由yield关键字后面的决定
def func3():
yield 100
yield '小明'
yield 6
gen1 = func3()
print(next(gen1)) # 100
print(next(gen1)) # '小明'
print(next(gen1)) # 6
print(next(gen1)) # 报错,StopIteration
3)生成器产生数据的原理
调用函数创建生成器的时候不会执行函数体
获取生成器的元素的时候就会执行函数体,执行过程中遇到yield就停下来,并且将yield后面的数据作为这次获取元素的结果;并且记录结束位置,下一次再获取元素的时侯就接着上一次结束的位置接着执行。