# 2021年12月15日,第四周12~13
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from collections.abc import Iterable
from collections.abc import Iterator
def func1(args=1):
# 生成器回顾
for i in range(args):
i = i * i
yield i
def day13_case1():
# 生成器回顾
list_generator = func1(10)
print(next(list_generator)) # 运行一次取一个值
print(next(list_generator))
print(next(list_generator))
return 0
def func2(name):
# 上架包子卖包子
print("%s有买包子需求了" % (name))
while True:
bread = yield
print("种类%s包子上架1个了,被%s买了1个" % (bread, name))
def day13_case2():
# 生成器串行操作
buy1 = func2("张三") # 生成器0
buy2 = func2("李四") # 生成器1
buy1.__next__()
buy2.__next__() # 要运行一次才能传如参数,否则提示生成器未启动
for i in range(3):
time.sleep(0.5)
buy1.send(i + 1) # 生成器0传入参数
buy2.send(i + 1) # 生成器1传入参数
return 0
def day13_case3():
# 迭代器:生成器为迭代器,迭代器不一定为生成器
# 概念:可以直接作用于for循环的数据类型有以下几种:一类是集合数据类型,
# 如list、tuple、dict、set、str等;
# 一类是generator,包括生成器和带yield的generator function。
# 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
# 生成器不但可以作用于for循环,还可以被next();
# 函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
# 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
# 可以使用isinstance(对象,类型)判断一个对象是否是Iterable对象:
print("list是否为可迭代", isinstance([], Iterable)) # list
print("tuple是否为可迭代", isinstance((), Iterable)) # tuple
print("dict是否为可迭代", isinstance({}, Iterable)) # dict
print("str是否为可迭代", isinstance("123", Iterable)) # str
list_1 = [1, 2, 3, 4, 12, 4, 2, 5, 2]
list_1 = set(list_1) # 创建一个集合
print("list_1的类型为", type(list_1))
print("集合set是否为可迭代", isinstance(list_1, Iterable))
generator = (i * 2 for i in range(10)) # 创建生成器
print("generator的类型为", type(generator))
print("生成器generator是否为可迭代", isinstance(generator, Iterable))
print("数字是否为可迭代", isinstance(123, Iterable))
# 可以使用isinstance(对象,类型)判断一个对象是否是Iterator对象:
# 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
# 把list、dict、str等Iterable变成Iterator可以使用iter()函数
print("list是否为迭代器", isinstance([], Iterator)) # list
print("list是否被转为迭代器", isinstance(iter([]), Iterator)) # list
print("str是否为迭代器", isinstance("abc", Iterator)) # list
print("str是否被转为迭代器", isinstance(iter("abc"), Iterator)) # list
# 总结:凡是可作用于for循环的对象都是Iterable(迭代)类型;
# 凡是可作用于next()函数的对象都是Iterator(迭代器)类型,它们表示一个惰性计算的序列;
# 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
pass
def day13_case4():
# 迭代器
for i in [1, 2, 3, 4, 5]:
print(i)
pass
# for循环等价于下面
object_iter = iter([1, 2, 3, 4, 5]) # 创建可迭代对象
print(type(object_iter), object_iter) # 类型为list_iterator
# 循环:
while True:
try:
# 获取下一个值:
i = next(object_iter)
print(i)
except StopIteration:
# 遇到StopIteration就退出循环
break
if __name__ == '__main__':
# day13_case2()
day13_case3()
day13_case4()
pass