# -------------------------------------*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条)