首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

第4章 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器

  • 23-09-22 18:42
  • 2427
  • 12264
blog.csdn.net

第四章 基础知识进阶
第十七节 迭代、可迭代对象、迭代器
一、    引言
本来计划讲完元组和字典后就讲列表解析和字典解析,但要理解列表解析和字典解析,就需要掌握Python的高级的类型迭代器,因此本节将迭代器的概念先进行介绍。

二、    概念
1.    迭代:是通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做,上一次产生的结果为下一次产生结果的初始状态,如果中途有任何停顿,都不能算是迭代。例如:
1)    非迭代例子
loop = 0
while loop < 3:
    print("Hello world!")
    loop += 1
2)     迭代例子
loop = 0
while loop < 3:
    print(loop)
loop += 1
例1仅是循环3次输出" Hello world!",输出的数据不依赖上一次的数据,因此不是跌代。
2.    容器:容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。
1)    这个定义与在列表中定义的容器“可以包含其他类型对象(如列表、元组、字典等)作为元素的对象,在 Python中称为容器(container)”从字面上看是不同的,但本质上是一样的,因为基本上所有有元素的数据类型(字符串除外)都能包含其他类型的对象;
2)    容器仅仅只是用来存放数据的,我们平常看到的 l = [1,2,3,4]等等,好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。
3.    可迭代对象(Iterable):可迭代对象并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问。
1)    __iter__方法的作用是让对象可以用for ... in循环遍历,__getitem__( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素。老猿认为这两个方法的目的是Python实现一个通用的外部可以访问可迭代对象内部数据的接口。
2)    一个可迭代对象是不能独立进行迭代的,Python中,迭代是通过for ... in来完成的。凡是可迭代对象都可以直接用for… in…循环访问,这个语句其实做了两件事:第一件事是调用__iter__()获得一个可迭代器,第二件事是循环调用__next__()。
3)    常见的可迭代对象包括:
a)    集合数据类型,如list、tuple、dict、set、str等;
b)    生成器(generator),包括生成器和带yield的生成器函数(generator function),下节专门介绍。
4)    如何判断一个对象是可迭代对象呢?可以通过collections模块的Iterable类型判断,具体判断方法如下:
from collections import Iterable
isinstance('', Iterable)  #返回True,表明字符串也是可迭代对象
关于collections后续再介绍。
5)    在迭代可变对象如列表对象时候,一个序列的迭代器只是记录当前到达了序列中的第几个元素,所以如果在迭代过程中改变了序列的元素。更新会立即反应到所迭代的条目上。比如一个列表 用for…in方法迭代访问时,删除了当前索引n对应的元素,则下一个循环时,访问的数据索引为n+1,但实际访问元素的索引是上一轮循环中列表的索引n+2对应元素。
4.    迭代器(Iterator):迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个迭代器对象必须是定义了__iter__()方法和next()方法的对象。
1)    Python的Iterator对象表示的是一个数据流,可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算;
2)    Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误;
3)    所有的Iterable可迭代对象均可以通过内置函数iter()来转变为迭代器Iterator。老猿认为__iter__( )方法是让对象可以用for ... in循环遍历时找到数据对象的位置,__next__( )方法是让对象可以通过next(实例名)访问下一个元素。除了通过内置函数next调用可以判断是否为迭代器外,还可以通过collection中的Iterator类型判断。如:   isinstance('', Iterator)可以判断字符串类型是否迭代器。注意: list、dict、str虽然是Iterable,却不是Iterator。
4)    迭代器优点:节约内存(循环过程中,数据不用一次读入,在处理文件对象时特别有用,因为文件也是迭代器对象)、不依赖索引取值、实现惰性计算(需要时再取值计算);
举例:用迭代器的方式访问文件
for line in open("test.txt"):print(line)
                这样每次读取一行就输出一行,而不是一次性将整个文件读入,节约内存。
5)    迭代器使用上存在限制:只能向前一个个地访问数据,已访问数据无法再次访问、遍历访问一次后再访问无数据
举例:
l = [1,2,3,4]
i=iter(l)  #从list列表生成迭代器i
list(i)   #将迭代器内容转换成列表,输出[1,2,3,4]
list(i)   #将迭代器内容再次转换成列表,输出[]
用for循环访问:
i=iter(l)
for k in i:print(k)  #输出1、2、3、4
for k in i:print(k)  #再次循环没有输出
如果需要解决这个问题,可以分别定义一个可迭代对象,每次访问前从可迭代对象重新生成和迭代器对象,如本部分前面所介绍的,当用for..in方式访问可迭代对象时,系统就是这么干的;
6)    迭代器当所有的元素全部取出后再次调用next就会抛出一个StopIteration异常,这并不是错误的发生,而是告诉外部调用者迭代完成了
三、    迭代器代码举例
1.    用for…in方式访问迭代器
vList=[1,2,3,4]
vIter=iter(vList)  #从列表生成迭代器对象
for i in vIter:  print('第一次:',i)   #输出迭代器中的数据1、2、3、4
for i in vIter:  print('第二次:',i)  #再次输出没有数据,因为迭代器已经空了
如果上述for循环访问变量改成列表,则每次都能输出数字
for i in vList:  print('第一次:',i)  #输出列表中的数据1、2、3、4,可以重复执行输出
从以上两种for循环方式可以看出迭代器和可迭代对象的区别。
2.    用next方式访问
vList=[1,2,3,4]
vIter=iter(vList)
while True:  
    try:i=next(vIter)
    except:break
        print('第一次:',i)
while循环如果执行第二次机也不会输出。

本节介绍了迭代器相关的概念,并举简例介绍了迭代器的使用。

    老猿Python(http://iyenn.com/index/link?url=https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。 
欢迎大家批评指正,谢谢大家关注!

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树进阶任务Python问答333596 人正在系统学习中
老猿Python
微信公众号
专注Python相关语言、图像音视频处理、AI
注:本文转载自blog.csdn.net的LaoYuanPython的文章"https://blog.csdn.net/LaoYuanPython/article/details/89609187"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top