迭代器协议是指: 对象必须提供一个 next 方法, 执行该方法要么返回迭代中的下一项, 要么就引起一个 Stoplteration 异常, 以终止迭代(只能往后走不能往前退)
实现了迭代器协议的对象 (对象内部定义了一个__iter__() 方法)
python 中的内部工具 (如 for 循环, sum,min,max 函数等) 基于迭代器协议访问对象.
- # 基于迭代器协议
- li = [1,2,3]
- diedai_l = li.__iter__()
- print(diedai_l.__next__())
- print(diedai_l.__next__())
- print(diedai_l.__next__())
- # print(diedai_l.__next__()) # 超出边界报错
- #下标
- print(li[0])
- print(li[1])
- print(li[2])
- # print(li[3]) # 超出边境报错
- # 用 while 循环模拟 for 循环机制
- diedai_l = li.__iter__()
- while True:
- try:
- print(diedai_l.__next__())
- except StopIteration:
- print("迭代完毕, 循环终止")
- break
- # for 循环访问方式
- # for 循环本质就是遵循迭代器协议的访问方式, 先调用 diedai_l=li.__iter__方法
- # 或者直接 diedai_l=iter(l), 然后依次执行 diedai_l.__next__(), 直到捕捉到
- # StopItearation 终止循环
- # for 循环所有的对象的本质都是一样的原理
生成器
可以理解为一种数据类型, 自动实现迭代器协议
在调用生成器运行的过程中, 每次遇到 yield 时函数会暂停并保存当前所有的运行信息, 返回 yield 的值. 并在下一次执行 next()方法时从当前位置继续运行
表现形式
1, 生成器函数 带 yield 的函数(1, 返回值 2, 保留函数的运行状态)
next(t) t.__next__ t.send(可以给上一层的 yield 传值)
- # 用生成器函数
- # 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
2, 生成器表达式
- print(sum(i for i in range(10000))) # 表达式一般用 for 循环 (i for i in range(10000))
- # 作用 节省内存, 在内部已经实现了__iter__的方法
列表解析(生成了一个列表)
1 print([i for i in range(10)]) # 生成一个列表
三元表达式(没有四元表达式, 可以有二元)
- name = "alex"
- print("sb" if name == "alex" else "帅哥")
- # if name == "alex" 为一元 "sb" 为二元 else "帅哥" 为三元
输出
sb
python 基础之迭代器和生成器
迭代器
迭代器协议是指: 对象必须提供一个 next 方法, 执行该方法要么返回迭代中的下一项, 要么就引起一个 Stoplteration 异常, 以终止迭代(只能往后走不能往前退)
实现了迭代器协议的对象 (对象内部定义了一个__iter__() 方法)
python 中的内部工具 (如 for 循环, sum,min,max 函数等) 基于迭代器协议访问对象.
- #基于迭代器协议
- li = [1,2,3]
- diedai_l = li.__iter__()
- print(diedai_l.__next__())
- print(diedai_l.__next__())
- print(diedai_l.__next__())
- # print(diedai_l.__next__()) # 超出边界报错
- #下标
- print(li[0])
- print(li[1])
- print(li[2])
- # print(li[3]) # 超出边境报错
- # 用 while 循环模拟 for 循环机制
- diedai_l = li.__iter__()
- while True:
- try:
- print(diedai_l.__next__())
- except StopIteration:
- print("迭代完毕, 循环终止")
- break
- # for 循环访问方式
- # for 循环本质就是遵循迭代器协议的访问方式, 先调用 diedai_l=li.__iter__方法
- # 或者直接 diedai_l=iter(l), 然后依次执行 diedai_l.__next__(), 直到捕捉到
- # StopItearation 终止循环
- # for 循环所有的对象的本质都是一样的原理
生成器
可以理解为一种数据类型, 自动实现迭代器协议
在调用生成器运行的过程中, 每次遇到 yield 时函数会暂停并保存当前所有的运行信息, 返回 yield 的值. 并在下一次执行 next()方法时从当前位置继续运行
表现形式
1, 生成器函数 带 yield 的函数(1, 返回值 2, 保留函数的运行状态)
- next(t) t.__next__ t.send(可以给上一层的 yield 传值)
- # 用生成器函数
- # 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
2, 生成器表达式
- print(sum(i for i in range(10000))) # 表达式一般用 for 循环 (i for i in range(10000))
- # 作用 节省内存, 在内部已经实现了__iter__的方法
列表解析(生成了一个列表)
1 print([i for i in range(10)]) # 生成一个列表
三元表达式(没有四元表达式, 可以有二元)
- name = "alex"
- print("sb" if name == "alex" else "帅哥")
- # if name == "alex" 为一元 "sb" 为二元 else "帅哥" 为三元
输出
sb
来源: http://www.bubuko.com/infodetail-2848993.html