0
点赞
收藏
分享

微信扫一扫

day-018

飞空之羽 2022-04-06 阅读 78
python
# -------------------------------------*day-018*------------------------------------
"""
迭代器,可迭代对象
大部分都是概念问题
"""

"""迭代对象"""
# 从使用角度来说,能被for循环遍历输出内部每一个成员的都是可迭代对象。
# 常见的有:str,list ,tuple,dict,set,文件对象。
# 从语法形式来说,能调用`__iter__`方法的数据对象就是可迭代对象。
# set_data = {'a', 2, 'c', 'b'}
# for i in setvar:
#     print(i)
#
# dir() 获取对象所有内置方法
# data = dir(set_data)
# print(data)
# print('__iter__' in data)  # True

"""迭代器"""
# 迭代器对象,简称迭代器,是增强版的可迭代对象。
#
# 任何一个对象,只要内部实现了`__iter__()`就是一个可迭代对象(iterable)。当然专业的说,就是实现了可迭代协议的对象,叫可迭代对象。
#
# 任何一个对象,只要内部实现了`__iter__()`和`__next__()`就是一个迭代器(iterator)。当然专业的说,就是实现了迭代器协议的对象,叫迭代器。
#
# 所以,迭代器一定是可迭代对象,可迭代对象不一定是迭代器。

# for循环的本质
# for 循环首先会调用可迭代对象data内的`__iter__`方法返回一个迭代器,
# 然后再调用这个迭代器的`__next__`方法将取到的值赋给item,
# 即for后面定义的变量item(item经过每次for循环调用next()时都会赋值了一遍)。循环一次,
# 调用一次next方法,直至遇到StopIteration异常,for循环内部捕获并处理该异常后结束迭代过程。

"""生成器"""
# 生成器是一种特殊的迭代器,不过这种迭代器更加优雅。
# 它不需要再像上面一样定义`__iter__() `和`__next__() `方法了,
# 只需要在函数中使用到一个 `yield` 关键字,所以也叫生成器函数。
"""yield"""
# **yield** 是一个python内置的关键字,它的作用有一部分类似**return**,
# 可以把函数内部的数据提供给外界调用处。但是不同的是,return 会终止函数的执行,
# yield 不会终止函数的执行,而是**暂停**了。两者都会返回一个结果(结果是任何数据类型),
# 但return只能执行一次给函数的调用处返回值,而yield是可以执行多次给next()方法返回值,
# 而且yield还可以接受外界send()方法的传值。所以更准确的来说,
# **yield是暂停程序的执行权并记录了程序当前的运行状态的关键字,
# 同时也是生成器内部与外界进行数据传递的通道**。

"""超好的yield小练习"""
# import time
# def gen1():
#     while True:
#         print("gen1--1")
#         yield
#         print("gen1--2")
#         time.sleep(3)
#
# def gen2():
#     while True:
#         print("gen2--3")
#         yield
#         print("gen2--4")
#         # time.sleep(100)
#
# if __name__ == "__main__":
#     g1 = gen1()
#     g2 = gen2()
# for i in range(3):
#     next(g1)
#     print("for循环!")
#     next(g2)
"""推导式"""
# 成员 for 循环 ... if 判断 ...
举报

相关推荐

0 条评论