迭代器
迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引发一个Stoplteration异常,以终止迭代(只能日后走不能往前退)javascript
实现了迭代器协议的对象(对象内部定义了一个__iter__()方法)java
python中的内部工具(如for循环,sum,min,max函数等)基于迭代器协议访问对象。python

1 #基于迭代器协议 2 li = [1,2,3] 3 diedai_l = li.__iter__() 4 print(diedai_l.__next__()) 5 print(diedai_l.__next__()) 6 print(diedai_l.__next__()) 7 # print(diedai_l.__next__()) # 超出边界报错 8 9 #下标 10 print(li[0]) 11 print(li[1]) 12 print(li[2]) 13 # print(li[3]) # 超出边境报错 14 15 # 用while循环模拟for循环机制 16 diedai_l = li.__iter__() 17 while True: 18 try: 19 print(diedai_l.__next__()) 20 except StopIteration: 21 print("迭代完毕,循环终止") 22 break 23 24 # for循环访问方式 25 # for循环本质就是遵循迭代器协议的访问方式,先调用diedai_l=li.__iter__方法 26 # 或者直接diedai_l=iter(l),而后依次执行diedai_l.__next__(),直到捕捉到 27 # StopItearation终止循环 28 # for循环全部的对象的本质都是同样的原理
生成器
能够理解为一种数据类型,自动实现迭代器协议ide
在调用生成器运行的过程当中,每次遇到yield时函数会暂停并保存当前全部的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行函数
表现形式工具
一、生成器函数 带yield的函数(一、返回值 二、保留函数的运行状态) post
next(t) t.__next__ t.send(能够给上一层的yield传值)this
# 用生成器函数 # yield 至关于return控制的是函数的返回值 # x=yield的另一个特性,接收send传过来的值,赋值给x def test(): print("开始啦") first = yield # return 1 first = None print("第一次",first) yield 2 print("第二次") t = test() print(test().__next__()) res = t.__next__() # next(t) print(res) res = t.send("函数停留在first那个位置,我就是给first赋值的") print(res) 输出结果 开始啦 None 开始啦 None 第一次 函数停留在first那个位置,我就是给first赋值的 2
二、生成器表达式 spa
print(sum(i for i in range(10000))) # 表达式通常用for循环 (i for i in range(10000))
# 做用 节省内存,在内部已经实现了__iter__的方法
列表解析(生成了一个列表)
1 print([i for i in range(10)]) # 生成一个列表
三元表达式(没有四元表达式,能够有二元)
1
2
3
4
5
6
7
|
name
=
"alex"
print
(
"sb"
if
name
=
=
"alex"
else
"帅哥"
)
# if name == "alex"为一元 "sb" 为二元 else "帅哥"为三元
输出
sb
|