Python三大器之迭代器
初识迭代器什么是迭代器
# ==== 迭代与非迭代的区别 ==== count = 0 while count < 5: print(count) count += 1 以上的每一次重复动作都是基于上一次重复动作,可以称之为迭代。 while 1: input(">>>") 以上不可称之为迭代,下一次的重复动作与上一次没有任何关系。 为什么要有迭代器
怎么使用迭代器迭代器可以通过循环进行取值。下面的章节将详细介绍迭代器及其内部原理,学完本章节你就能随心所欲的驾驭迭代器了。 迭代器详解迭代器和可迭代对象的区别与关系
基于这两句话,我们可以为学过的数据类型做一个区分: [].__iter__() list具有 __iter__ 方法,是可迭代对象 [].__next__() list不具有 __next__方法,不是迭代器 AttributeError: 'list' object has no attribute '__next__' 他们的关系在于:
示例如下: ==== 迭代器和迭代对象的区分 ==== from collections.abc import Iterable 可以用于判断是否是可迭代对象 import Iterator 可以用于判断是否是迭代器 li = [1,2,3,4,5] isinstance 可以用来判断一个对象是否属于另一个对象 print(isinstance(li,Iterable)) True 判断是否属于可迭代对象,说明具有__iter__方法 False 判断是否属于迭代器,说明没有__next__方法。 li_iterator = iter(li) iter方法就是调用对象内置的__iter__方法。 print(li_iterator) <list_iterator object at 0x0000021AC6BB3AF0> print(isinstance(li_iterator,1)"> True True 可以看到。iter方法就是为可迭代对象li创建出了一个专属迭代器。 数据类型迭代类型一览 我们可以通过导入 ==== 实验过程 ==== st = 123" print(isinstance(st,Iterable)) False tu = (1,1)">print(isinstance(tu,1)"> di = {k1":v1} print(isinstance(di,1)"> se = {1,1)">print(isinstance(se,1)"> with open(file=test.text",mode=wutf-8) as f: print(isinstance(f,1)"> True === 了解 === Ps:以下创建方式均为创建出经过优化的可迭代对象。并非迭代器,更并非生成器。 ra = range(1,11print(isinstance(ra,1)"> di_keys = di.keys() print(isinstance(di_keys,1)"> di_values = di.values() print(isinstance(di_values,1)"> di_items = di.items() print(isinstance(di_items,1)"> se_fro = frozenset(se) print(isinstance(se_fro,1)"> False Ps:关于什么叫做经过优化的可迭代对象。会在结束迭代器和生成器的学习后专门开辟一章节来讲。
循环与迭代器while循环取值与迭代器的作用体现
==== 迭代器的多次迭代示例 ==== 方式1 : 针对具有索引的数据类型取值,可以不依赖于迭代器 li = [1,1)">] index =while index < len(li): (li[index]) index += 1 print(针对具有索引的数据类型取值完毕 ---) 方式2 :针对不具有索引的数据类型取值,必须依赖迭代器下的__next__方法。 dic = dict(k1=v2v3) dic_ator = dic. 创建出专属迭代器,迭代器具有__next__方法 try: print(dic_ator.__next__()) 或者用 next(li_ator) except Exception as e: break ----> 第二次取值) ==== 执行结果 ==== Ps:可以看到。一个迭代器将所有值全部取出后,再对其进行遍历已经取不出值了。 """ 1 2 3 4 5 针对具有索引的数据类型取值完毕 --- k1 k2 k3 ----> 第二次取值 """ for循环底层原理
==== for循环的底层原理 ==== for循环本质就是while循环 dic = dict(k1= 第一件事:创建专属迭代器 try: 第三件事: 捕捉异常 __next__()) 第二件事,不断执行该迭代器下的__next__方法 每次for循环都会完成上述三步骤, # 这也是为什么Python要将除开文件对象外的其他数据类型作为可迭代对象的原因(便于重复利用) for i in dic: (i) 第一次结束第二次结束 如果循环的是一个纯粹的迭代器,那么第二次的for循环根本就不能读出任何内容。迭代器值空=迭代器死亡 迭代器小结优点
缺点
疑点 - 如何自定义迭代器
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |