4.10 Python3 进阶 - 迭代器 & 生成器

时间:2021-08-12
本文章向大家介绍4.10 Python3 进阶 - 迭代器 & 生成器,主要包括4.10 Python3 进阶 - 迭代器 & 生成器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

>>返回主目录


源码

from typing import Iterable, Iterator

# 可迭代对象:字符串、列表、元组、字典、集合、range()、enumerate()等
print('判断字符串是否是可迭代对象:', isinstance('Python', Iterable))  # True
print('判断range函数生成的对象是否是可迭代对象:', isinstance(range(1), Iterable))  # True
print('判断字符串是否是迭代器:', isinstance('Python', Iterator))  # False

源码

# 创建迭代器:可通过__iter__()或内置函数iter()将可迭代对象创建为迭代器对象,例如:
# 将列表创建为迭代器
list_a = ['I', 'Love', 'Python']
# iter_list_a = list_a.__iter__()
iter_list_a = iter(list_a)  # 同__iter__()
print('iter_list_a是可迭代对象:', isinstance(iter_list_a, Iterable))
print('iter_list_a是迭代器对象:', isinstance(iter_list_a, Iterator))
print('iter_list_a是迭代器对象:', iter_list_a)

# 访问迭代器:可通过__next__()或内置函数next()访问迭代器对象中的下一个元素或通过循环语句访问,例如:
# 打印1~5,使用for循环方式
for i in range(1, 6):
    print('for循环打印1~5:', i)
print('-' * 50)
# 使用迭代器方式,理解for循环底层运行机制
iter_range = iter(range(1, 6))
while True:
    try:
        print('迭代器打印1~5:', next(iter_range))
    except StopIteration:
        break



源码

# 定义一个生成器函数
def generator(num):
    print('生成器函数开始!')
    n = 0
    while n < num:
        print('生成器返回前!', n)
        yield n
        n += 1
        print('生成器返回后!', n)
    print('生成器函数调用结束')
    # return 5  # 告诉程序结束,不会返回5


gt = generator(3)
print('调用生成器返回:', gt)  # 返回生成器对象,内存地址
print('第一次调用生成器next函数后:', next(gt))  # 0
print('第二次调用生成器next函数后:', next(gt))  # 1
print('第三次调用生成器next函数后:', next(gt))  # 2
# print('第四次调用生成器next函数后:', next(gt))  # 后续没有碰到yield,抛StopIteration异常


源码

# 仍然使用上例generator()函数,使用for循环遍历
gt_for = generator(3)
for g in gt_for:
    print('循环调用生成器:', g)

源码

# 生成器表达式
# 求0~5的倍数
gen_double = (x * 2 for x in range(6))
print('生成器表达式返回:', gen_double)  # 返回生成器对象
print('第一次调用生成器next函数后返回:', next(gen_double))  # 0
print('第二次调用生成器next函数后返回:', next(gen_double))  # 2
print('第三次调用生成器next函数后返回:', next(gen_double))  # 4

源码

# 例如,如下狗狗干饭的生成器函数:
def dog_generator(dog_name):
    print('狗狗准备开吃!')
    food_list = []
    while True:
        print('生成器返回:前!')
        food = yield food_list  # food = yield = 'xxx'
        print(f'狗狗:{dog_name},吃了:{food}')
        food_list.append(food)
        print('生成器返回:后!')


dg = dog_generator('金毛')
# 强调:对于表达式形式的yield的生成器,在使用前必须先用next(g)或者g.send(None)初始化一次
print('初始化生成器:', next(dg))  # next(dg)==dg.send(None),开始运行函数体代码,next(res)==res.__next__()
print('-' * 50)
food_list_add1 = dg.send('大骨头1')
print('狗狗已经吃了:', food_list_add1)
print('-' * 50)
food_list_add2 = dg.send('小骨头1')
print('狗狗已经吃了:', food_list_add2)
print('-' * 50)
dg.close()  # 关闭生成器

# food_list_add3 = dg.send('小骨头2')
# print('狗狗已经吃了:', food_list_add3)

>>返回主目录

作者: PortosHan

出处: https://www.cnblogs.com/PortosHan/

关于作者:专注于软件测试、测试开发等领域,请多多赐教!

本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 原文链接 如有问题,可邮件(bhanzdan@163.com)咨询。

原文地址:https://www.cnblogs.com/PortosHan/p/15134856.html