Python学习之迭代器详解

目录
  • 什么是迭代器
  • 如何生成迭代器
    • 迭代器函数 - iter() 函数 与 next() 函数
    • 可迭代的对象
    • 生成迭代器
  • 迭代器的用法 - 演示案例

什么是迭代器

迭代是 python 中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器对象从集合中的第一个元素开始访问,直到所有的元素被访问完。迭代器有两个方法:iter()和 next()方法。

这么解释可能不太直观,我们以生活的一个小栗子来解释一下,方便大家能够更深刻的理解。比如说我们去超市买水果,而正巧超市的服务人员正在摆放苹果。服务人员告诉我们需要等苹果都摆放完毕我们才可以拿苹果,这样就很耽误我们的时间。(这个场景中,柜台上其实已经有苹果了,只不过销售不让拿罢了。)

然后我们再去卖橘子的柜台,服务人员也在摆放橘子。但是服务人员告诉我们可以不用等他摆放完毕,我们可以直接拿橘子,这样就会很好的节省我们的时间。如果我们拿橘子的速度超过了服务人员摆放的速度 ,我们只需要等待服务人员摆放之后就可以直接拿橘子,大大的提升了我们买橘子的效率。

而迭代器就类似于我们买橘子的场景,我们平时的程序都是一次性写入到内存中。比如我们的列表中存在成百上千的数据,都是一次性写入到内存里的,通过这样让我们来使用。但是迭代器却是按需加载,有一点内容就会放在内容里面,我们就可以立刻使用内存中的数据进行我们的逻辑处理。这样就不要所有的数据都写入到内存中就可以使用,大大的提升了使用效率。

如何生成迭代器

迭代器函数 - iter() 函数 与 next() 函数

iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象

next(iterator) 从迭代器iterator中获取下一了记录,如果无法获取下一条记录,则触发stoptrerator异常
说明:

1.迭代器只能往前取值,不会后退

2.用iter函数可以返回一个可迭代对象的迭代器

示例:

iter()函数介绍:生成一个迭代器对象

iter()函数用法:iter(iterable)

参数介绍:iterable —> 可迭代的数据类型(比如列表、字典、元组以及集合类型等)

示例:

iter([1, 2, 3])

返回值:

<list_iterator at 0x4f3bff0>

next()函数介绍:返回迭代器中的数据

next()函数用法:next(iterable)

参数介绍:iterable —> 迭代器对象

示例:

iter_obj = iter([1,2,3])
next(iter_obj)

返回值:

# >>> 1,2,3
# >>> StopIteration

综上,我们得出结论:

iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象

next(iterable) 从迭代器iterator中获取下一了记录,如果无法获取下一条记录,则触发stoptrerator异常

演示案例如下:

# coding:utf-8

test_list = [1, 3, 5, 7]
test_iter = iter(test_list)     # 让test_list提供一个能访问自己的迭代器
print(next(test_iter))     # 1  从迭代器中取值,让迭代器去获取l中的一个元素
print(next(test_iter))     # 3
print(next(test_iter))     # 5
print(next(test_iter))     # 7
print(next(test_iter))     # StopIterable 异常

test_list 实际上是一个列表,但是被迭代器迭代之后。并不是一次性将列表放入内存中,而是每次放一个元素进入内存,然后被读取。(这就是我们说的按需加载)

可迭代的对象

类似于list、tuple、str 等类型的数据可以使用for… in… 的循环遍历语法可以从其中依次拿到数据并进行使用,我们把这个过程称为遍历,也称迭代。python中可迭代的对象有list(列表)、tuple(元组)、dirt(字典)、str(字符串)set(集合)等。

示例如下:

test_list = [1,2,3,4,5]
test_dirt = {
    "name":"张三",
    "sex":"男",
    "age":33
    }

test_tuple = (1,2,3,4,5)
test_set = {1,2,3,3,4}

for i in test_list:
    print(i)

for i in test_dirt:
    print(i)

for i in test_tuple:
    print(i)

for i,j in test_set.items():
    print("%s:%s" % (i,j))

# >>> 执行结果如下:
# >>> test_list的元素为: 1
# >>> test_list的元素为: 2
# >>> test_list的元素为: 3
# >>> test_list的元素为: 4
# >>> test_list的元素为: 5
# >>> test_dirt的元素为: name
# >>> test_dirt的元素为: sex
# >>> test_dirt的元素为: age
# >>> test_tuple的元素为: 1
# >>> test_tuple的元素为: 2
# >>> test_tuple的元素为: 3
# >>> test_tuple的元素为: 4
# >>> test_tuple的元素为: 5
# >>> test_set的元素为:1
# >>> test_set的元素为:2
# >>> test_set的元素为:3
# >>> test_set的元素为:4

生成迭代器

除了刚刚我们使用的 iter() 函数之外 ,我们还有其他方法生成迭代器:

第一种:for循环生成方法 —> 我们可以在函数中使用 for 循环, 并对每一个 for 循环的成员使用 yield() 函数 [它的意思就是将每一个 for 循环成员放到一个迭代器对象中,不过只有被调用才会被放入。]

示例如下:

def test():
    for i in range(10):
        yield i

result = test()

print('for 循环,第一次 \'i\'的值为:', next(result))
print('for 循环,第二次 \'i\'的值为:', next(result))
print('for 循环,第三次 \'i\'的值为:', next(result))
print('for 循环,第四次 \'i\'的值为:', next(result))

# >>> 执行结果如下:
# >>> for 循环,第一次 'i'的值为: 0
# >>> for 循环,第二次 'i'的值为: 1
# >>> for 循环,第三次 'i'的值为: 2
# >>> for 循环,第四次 'i'的值为: 3

注意:超过10次异常会抛 StopIteration 的异常。

第二种:for 循环一行生成迭代器对象。

示例如下:

result = (i for i in [1, 2, 3])        # 将 for 循环在非函数中 赋值 给一个变量, 这也是生成一个迭代器变量的方法  

print('for 循环,第一次 \'i\'的值为:', next(result))        # 使用 next 调用迭代器
print('for 循环,第二次 \'i\'的值为:', next(result))
print('for 循环,第三次 \'i\'的值为:', next(result))

# >>> for 循环,第一次 'i'的值为: 1
# >>> for 循环,第二次 'i'的值为: 2
# >>> for 循环,第三次 'i'的值为: 3

注意: next(result) 超过4次会抛 StopIteration 的异常。

划重点:

使用 for 循环生成的迭代器,可以不使用 next() 函数 也可以执行,(依然可以通过 for 循环 获取迭代器的数据)不仅如此,当我们调取完迭代器中的数据之后,程序不会抛出异常,相比较与 next() 函数要友好的多。

示例如下:

result = (i for i in [1, 2, 3])

for item in result:
    print(item)
    
# >>> 执行结果如下:
# >>> 1
# >>> 2
# >>> 3

# 循环结束,程序正常退出,不会抛出 StopIteration 的异常

迭代器的用法 - 演示案例

案例一:

def make_iter():
    for i in range(5):
        yield i

iter_obj = make_iter()

for i in iter_obj:
    print(i)
print('----')
for i in iter_obj:
    print(i)
    
# >>> 执行结果如下:
# >>> 0
# >>> 1
# >>> 2
# >>> 3
# >>> 4
# >>> ----

# >>> 从运行结果得出结论,当我们从内存中读取完迭代器所有的值后,内存就会被释放,不再循环输出。

案例二:

iter_obj = (i for i in range(4))

for i in iter_obj:
    print(i)
print('=====')
for i in iter_obj:
    print(i)

# >>> 执行结果如下:
# >>> 0
# >>> 1
# >>> 2
# >>> 3
# >>> =====
# >>> 从运行结果得出结论,当我们从内存中读取完迭代器所有的值后,内存就会被释放,不再循环输出。

迭代器 除了前文我们提到的 按需加载 ,可以提升我们的执行速度以外。

还有另外一个原因,试想一下:如果我们的列表只有10个数据,那么读取的速度会很快。可能对资源(也就是我们的内存)占用的消耗不是很大;如果我们有一个成千上万甚至十万数据的列表,那么这些数据都要一次性的写入内存里,这么多的数据所消耗占用的资源必然会很大,甚至会撑爆我们的内存造成内存溢出,程序就会报错了。

所以如果通过迭代器的方式,我们只需要用到一个数据就将一个数据扔到内存里并且被使用。这样既可以提高我们内存使用的效率,又可以减少我们内存的消耗。这也是我们平时使用迭代器的目的。

到此这篇关于Python学习之迭代器详解的文章就介绍到这了,更多相关Python迭代器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中的迭代器,生成器与装饰器详解

    目录 迭代器 生成器 装饰器 总结 迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代. for循环调用list本质上是是调用了list的迭代器进行迭代. # 对list进行for循环本质上是调用了list的迭代器 list = [1,2,3,4] # for 循环调用 for elem in list: print(elem) # 迭代器调用 list_iter = list.__iter__() while True: tr

  • 彻底搞懂python 迭代器和生成器

    迭代器跟生成器,与上篇文章讲的装饰器一样,都是属于我的一个老大难问题. 通常就是遇到的时候就去搜一下,结果在一大坨各种介绍博客中看了看,回头又忘记了. 你是不是也是这样呢? 俗话说:好记性不如烂笔头,虽然现在基本不咋用笔写字了,但是还是要好好整理下,起码以后我就不用搜了. 如果现在给你一个列表list_a = [1, 2, 3, 4],让你去迭代它,相信大家都很熟悉,直接用for循环就完事儿, list_a = [1, 2, 3, 4] for i in list_a: print(i) 运行

  • python迭代器,生成器详解

    目录 迭代器 生成器 总结 迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被用于for-in-循环,例如:集合,列表,元祖,字典,字符串,迭代器等. 在python中如果一个对象实现了 __iter__方法,我们就称之为可迭代对象,可以查看set\list\tuple-等源码内部均实现了__iter__方法 如果

  • python基础之迭代器与生成器

    目录 1. 迭代器 1.1 迭代器的使用 1.2 创建类的迭代器 2. 生成器 2.1 生成器的使用 2.2 生成器表达式 总结 1. 迭代器 1.1 迭代器的使用 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退.迭代器有两个基本的方法:iter() 和 next().字符串,列表或元组对象都可用于创建迭代器. iter(iterable):用于返回可迭代对象的一个迭代器. next(iterator): 从迭代器iterator中获取下一条记录.如果无

  • 一文搞懂python 中的迭代器和生成器

    可迭代对象和迭代器 迭代(iterate)意味着重复,就像 for 循环迭代序列和字典那样,但实际上也可使用 for 循环迭代其他对象:实现了方法 __iter__ 的对象(迭代器协议的基础).__iter__方法返回一个迭代器,它是包含方法 __next__ 的对象,调用时可不提供任何参数:当你调用 __next__ 时,迭代器应返回其下一个值:如果没有可供返回的值,应引发 StopIteration 异常:也可使用内置函数 next(),此种情况下,next(it) 与 it.__next(

  • 正确理解python迭代器与生成器

    目录 一.迭代器 二.生成器 三.生成器函数 3.1.zip(可迭代对象1,可迭代对象2......) 3.2.enumerate(iterable[,start]) 一.迭代器 迭代器就是iter(可迭代对象函数)返回的对象,说人话.......可迭代对象由一个个迭代器组成 可以用next()函数获取可迭代对象的数据 迭代是访问集合元素的一种方式(因为集合是无序的,所以不能索引),naxt(集合), 迭代器对象从集合的第一个元素开始访问,直到所有元素被访问结束,迭代器只能往前不会往后退 迭代器

  • Python学习之迭代器详解

    目录 什么是迭代器 如何生成迭代器 迭代器函数 - iter() 函数 与 next() 函数 可迭代的对象 生成迭代器 迭代器的用法 - 演示案例 什么是迭代器 迭代是 python 中访问集合元素的一种非常强大的一种方式.迭代器是一个可以记住遍历位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源.迭代器对象从集合中的第一个元素开始访问,直到所有的元素被访问完.迭代器有两个方法:iter()和 next()方法. 这么解释可能不太直观,我们以生活

  • python学习 流程控制语句详解

    ###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的运行方向 # Ture:表示非空的量(String,tuple元组 .list.set.dictonary),所有非零的数字 # False:0,None .空的量 #逻辑表达式 可以包含 逻辑运算符 and or not if: ##################################

  • Python学习之异常处理详解

    目录 什么是异常与异常处理 异常的语法 捕获通用异常 捕获具体异常 如何捕获多个异常 捕获多个异常-方法1 捕获多个异常-方法2 本章节主要学习 python 中的异常处理,来看一下该章节的内容有哪些.首先我们需要了解 什么是异常与异常的处理 ,然后再继续 异常的语法结构 什么是异常与异常处理 异常 —> 可以理解为不同寻常. 正常情况下,我们的程序是自上而下的逐行执行,执行到最后一行才会终止程序的执行.而异常的情况会导致我们的程序半途而废停止了执行.一般情况下的停止执行都是因为我们的程序出错而

  • Python学习之自定义异常详解

    目录 自定义抛出异常关键字-raise 演示小案例-1 演示小案例-2 自定义异常类 总结 在上一章我们学习了 异常的三个关键字,分别是try.except 以及 finally.我们知道在 try 代码块中如果遇到错误就会抛出异常,交给 except 提前定义好的错误类型进行匹配并捕获,如果成功捕获到异常就会交给 except 的代码块进行执行,最后的 finally 是无论如何都会执行的代码块. 那么在 try 语法块中是谁抛出的异常?优势如何抛出的呢?首先抛出异常的是 Python 的解释

  • Python学习笔记嵌套循环详解

    目录 1. 嵌套循环 2. break语句 3. continue语句 4. else语句 5. 循环代码优化 1. 嵌套循环 多重循环 代码测试1: # 嵌套循环 def test(): for i in range(5): for j in range(6): print(f"{i} ", end='') print('') # 换行 # Main if __name__ == '__main__': test() 代码测试2: # 九九乘法表 def test2(): for i

  • Python迭代和迭代器详解

    迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. 摘自维基百科 也就是说迭代器类似于一个游标,卡到哪里就是哪里,可以通过这个来访问某个可迭代对象的元素:同时,也不是只有Python有这个特性.比如C++的STL中也有这个,如 vector<int>::iterator it .下面主要说一下Python中的可迭代对象和迭代器吧. Python可迭

  • python生成器与迭代器详解

    列表生成式: 例一: a = [i+1 for i in range(10)] print(a) 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 例二: L = [1, 2, 3, 4, 5] print([i*i for i in L if i>3]) 输出: [16, 25] 例三: L = [1, 2, 3, 4, 5] I = [6, 7, 8, 9, 10] print([i*a for i in L for a in I if i > 2 if a <

  • Python深度学习线性代数示例详解

    目录 标量 向量 长度.维度和形状 矩阵 张量 张量算法的基本性质 降维 点积 矩阵-矩阵乘法 范数 标量 标量由普通小写字母表示(例如,x.y和z).我们用 R \mathbb{R} R表示所有(连续)实数标量的空间. 标量由只有一个元素的张量表示.下面代码,我们实例化了两个标量,并使用它们执行一些熟悉的算数运算,即加法.乘法.除法和指数. import torch x = torch.tensor([3.0]) y = torch.tensor([2.0]) x + y, x * y, x

  • Ruby中的迭代器详解

    D瓜哥最近想做一个网站,另外,老早就有学习一门动态语言的想法,满足着两个条件的编程语言中,Ruby.Python是最合适的两种语言.现在Ruby on Rails如日中天,光芒万丈!所以,就选定了Ruby,从零开始学习. 前天看了Ruby的迭代器,对于我这个只学过Java.C/C++等的人来说,绝对是眼前一亮的感觉!而且是光彩夺目:没想到迭代器还可以这么玩,太简练太方便而且特别强大!然后,D瓜哥就迫不及待的想写一篇文章给大家介绍介绍Ruby的迭代器! 迭代器简介 先简单介绍一下迭代器. 1.一个

  • Python基础之进程详解

    一.前言 进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运行程序的载体,这个程序可以有单个或者多个进程,一般来说,进程是通过系统CPU 内核数来分配并设置的,我们可以来看下系统中的进程: 可以看到,360浏览器是真的皮,这么多进程啊,当然可以这样来十分清楚的看进程线程使用情况: 通过任务管理器中的资源监视器,是不是很厉害了,哈哈哈.讲完了这些,再说说用法. 二.基本用法 进程能干什么,这是我们要深思熟虑的事情.我们都知道一个程序运行会创建进程,所以程序在创建这些进程的时候,为了让它们更能

随机推荐