23_迭代器、模拟For循环

一、可迭代对象 和 迭代器

1.可迭代对象和迭代器

可迭代对象:可以直接作用于for循环的对象统称为可迭代对象,Iterable.

迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器,Iterator.

2.判断某个对象是否是可迭代对象

dir() 会打印出对象的所有内置属性和方法,然后判断所有的属性和方法中是否存在‘__iter__‘.

1 l = [1,2,3,4]
2 print(dir(l))  #他会把列表的所有方法和属性打印出来.返回的是一个列表
3 print(‘__iter__‘ in dir(l)) #True 如果对象包含__iter__ ,就表明是一个可迭代对象

isinstance() 可以判断一个对象是否是可迭代对象Iterable

1 from collections import Iterable
2
3
4 l = [1,2,3,4]
5 print(isinstance(l,Iterable)) #如果返回True ,表明对象是可迭代对象

3.判断某个对象是否是迭代器

dir() : 判断对象的所有内置方法和属性中是否包含‘__next__‘.

1 print(‘__next__‘ in dir([]))#False 列表不是迭代器
2 print(‘__next__‘ in dir(‘‘))#False 字符串不是迭代器
3 print(‘__next__‘ in dir({}))#False 字典不是迭代器

isinstance() :可以判断对象是否是迭代器。

1 print(isinstance(‘‘,Iterator)) #False
2 print(isinstance([],Iterator)) #False
3 print(isinstance({},Iterator)) #False
4 print(isinstance(iter([]),Iterator)) #True
5 print(isinstance(iter(‘‘),Iterator)) #True
6 print(isinstance(iter({}),Iterator)) #True

4.可迭代对象   转化成  迭代器

生成器都是Iterator,但list、str、dict、虽然都是Iterable,却不是Iterator。

把list、str、dict等Iterable转换成Iterator可以使用‘__iter__() ‘或 iter()函数:

1 print(isinstance(‘‘.__iter__(),Iterator)) #True
2 print(isinstance([].__iter__(),Iterator)) #True
3 print(isinstance({}.__iter__(),Iterator)) #True
4 print(isinstance(iter([]),Iterator)) #True
5 print(isinstance(iter(‘‘),Iterator)) #True
6 print(isinstance(iter({}),Iterator)) #True

5.迭代器的特点

1.节省内存
2.迭代器惰性机制
3.迭代器不能反复,一直向下执行

6.文件句柄就是一个迭代器

我们通过open()方法可以获得一个文件句柄,通过文件句柄我们可以操作文件。文件句柄就是一个迭代器。

1 #文件句柄是一个迭代器
2 with open(‘text.txt‘,encoding=‘utf-8‘) as f_read:
3     print(isinstance(f_read,Iterator))  #True
4     pass

二、For循环的机制 - 模拟For循环

for循环是一种迭代循环机制,在内部调用next(),并捕获异常(StopIteration ),终止循环的操作

 1 #模仿 for 循环
 2
 3 L = [1,2,3,4]
 4
 5 #for循环实现
 6 for i in L:
 7     #print(i) 打印 1 2 3 4
 8     pass
 9
10 L = L.__iter__()  #L 列表从 可迭代对象转换成了迭代器
11 while True:
12     try:
13         print(L.__next__())   # 每次打印出 L 的元素
14     except StopIteration:     #迭代器next()在所有元素取出完后,引发StopIteration异常
15         break      #终止函数

原文地址:https://www.cnblogs.com/weihengblog/p/8422933.html

时间: 2024-12-17 19:28:41

23_迭代器、模拟For循环的相关文章

《Python学习之路 -- Python基础之迭代器及for循环工作原理》

提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一项,要么就抛出一个StopIteration异常(相当于报错的意思)以终止迭代.然而遵循这个协议的对象就称为可迭代对象,又称为迭代器.在Python中,for循环操作的对象就是可迭代对象.说到这里可能会引起一些误会,原因就是我们都知道for循环可以直接遍历列表.元组或字符串等等集合,但是这些数据类型并没有上面提到的__next__()方法,也就是说这些数据类型根本就不遵循迭代器协

迭代器与for循环的本质

1. 函数名的运用 ? 函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值:但是作为函数名他也有特殊的功能就是加上()就会执行对应的函数,所以我们可以把函数名当做一个特殊的变量,那么接下来,我们就来研究一下这个特殊的变量. 1.1 函数的内存地址 def func(): print("呵呵") print(func)结果: <function func at 0x1101e4ea0> ? 通过上面代码可以我们知道,函数名指向的是

迭代器、foreach循环、泛型集合

集合的迭代 语法:Iterator<Object> it=集合.iterator(); while(it.hasNext()){ Object obj=it.next(); } is.hasNext(); //判断是否有下一个元素 it.next(); //移动指针,返回指针指向元素 注意:集合在遍历的过程中不能进行修改,如果进行了修改操作,那么就会抛出ConcurrentModificationException异常, 如果需要进行删除,使用迭代器的it.remove()方法 foreach

hdu1047(模拟大数循环相加)

题目信息:多个大整数相加求和,(用add函数循环相加) http://acm.hdu.edu.cn/showproblem.php?pid=1047 AC代码: /** *大数的循环加法,转化为字符串循环相加到字符串为"0" *注意s=="0"的情况,输出数据之间有空格 */ #include<iostream> #include<string> #include<cstdio> using namespace std; stri

用fluent模拟内循环床气化燃烧(调试过程记录)

模拟对象为文献Combined gasi?cation of coal and biomass in internal circulating ?uidized bed[1]中的内循环气化炉.[1]http://www.sciencedirect.com/science/article/pii/S037838201100395X ---------------------------------------------------------------------分割线------------

深入浅出ES6(二):迭代器和for-of循环

作者 Jason Orendorff  github主页  https://github.com/jorendorff 我们如何遍历数组中的元素?20年前JavaScript刚萌生时,你可能这样实现数组遍历: for (var index = 0; index < myArray.length; index++) { console.log(myArray[index]); } 自ES5正式发布后,你可以使用内建的forEach方法来遍历数组: myArray.forEach(function

迭代器与for-of循环

我们如何遍历数组中的元素?20 年前 JavaScript 刚萌生时,你可能这样实现数组遍历: for (var index = 0; index < myArray.length; index++) { console.log(myArray[index]); } 自 ES5 正式发布后,你可以使用内建的 forEach 方法来遍历数组: myArray.forEach(function (value) { console.log(value); }); 这段代码看起来更加简洁,但这种方法也有

IteratorDemo 迭代器和 新循环的演示

/** * 迭代器的概念: * 以下来自网络搜索 * 简单的解释: 迭代器是一种检查容器内元素并遍历元素的数据类型. * 迭代器模式(Iterator):提供一种措施次序走访一个聚合对象中各个元素,而又不泄露该对象的内部表示. * 迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器 * 来遍历访问这个容器里面的元素.有很多例子表明,有了迭代器,我们可以将算法和特定的容器分离开来. * * 网络补充:比如,在容器中查找一个元素.对于查找这个操作,一般

迭代器和for循环工作机制

1. 迭代的概念 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集合.文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 2. 可迭代对象 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下 l = [1,2,3] print(dir(l))#输出"对象/变量"的属性与方法 f