当前位置: 首页 > 工具软件 > Diesel-Python > 使用案例 >

Python-day13:迭代器与生成器

谷梁涵忍
2023-12-01
# 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

 类似资料: