python3迭代器 - vip共享吧
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们


导航菜单
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们
Python

python3迭代器

2024/9/6 韩俊  Python教程 434 0

我们前面章节讲到迭代的概念,迭代是指通过 for 循环遍历集合中每一个成员的过程,Python 的 for 语句可以遍历任何可迭代的对象,在 Python 中,list,tuple,str,set,dict等类型的对象都是可以迭代的。

其实只有迭代器可以迭代,但是可迭代对象不一定是迭代器,比如 list,tuple,str,set,dict 都是不是迭代器, 那为什这些可迭代对象可以迭代呢,是因为 for...in 语句在第一次遍历可迭代对象时,把该对象转换成了迭代器,然后再遍历。

迭代器是一种可以被遍历的对象,并且能作用于 Python 内置的 next 函数,迭代器对象从集合的第一个元素开始访问, 直到所有的元素被访问完结束,迭代器只能往后遍历不能回溯,迭代器必须实现两个基本的函数,__iter__ 函数和 __next__ 函数(我们在面向对象章节详解如何自己写个迭代器类)。

深度剖析迭代器

我们可以用 collections 模块的 Iterator 来判断对象是不是迭代器 。

from collections.abc import Iterator

mystr = "hello"
mylist = [1, 2, 3]
mytuple = (1, 2, 3)
myset = set([1, 2, 3])
mydict = {"a": 1, "b": 2, "c": 3}

print(isinstance(mystr, Iterator))    # False
print(isinstance(mylist, Iterator))   # False
print(isinstance(mytuple, Iterator))  # False
print(isinstance(myset, Iterator))    # False
print(isinstance(mydict, Iterator))   # False

我们可以用 Iter 函数把一个可迭代对象作为参数,创建一个迭代器。

from collections.abc import Iterator

it_mystr = iter("hello")
it_mylist = iter([1, 2, 3])
it_mytuple = iter((1, 2, 3))
it_myset = iter(set([1, 2, 3]))
it_mydict = iter({"a": 1, "b": 2, "c": 3})

print(isinstance(it_mystr, Iterator))    # True
print(isinstance(it_mylist, Iterator))   # True
print(isinstance(it_mytuple, Iterator))  # True
print(isinstance(it_myset, Iterator))    # True
print(isinstance(it_mydict, Iterator))   # True

生成器是迭代器。

from collections.abc import Iterator

def ge_func():
    yield 1

myge  = (item for item in range(1))

print(isinstance(ge_func(), Iterator))  # True
print(isinstance(myge, Iterator))       # True

Python 的 for 循环本质上就是在遍历对象时, 会先调用 iter 函数把这些对象转为迭代器,然后遍历,遍历就是通过不断调用迭代器的 __next__ 函数实现的。

mylist = [1, 2, 3]
for item in mylist:       # 解释器第一次看到 for...in 语句时,会先调用 iter 函数用 mylist 生成一个迭代器
    print(item)

# Python 解释器把上面 for ... in 语句转为下面代码
it_mylist = iter(mylist)      # 第一次 for...in 时先利用可迭代对象 mylist 生成一个迭代器
item = it_mylist.__next__()   # 第一次 for...in 时
print(item)

item = it_mylist.__next__()   # 第二次 for...in 时
print(item)

item = it_mylist.__next__()   # 第三次 for...in 时
print(item)

for 循环遍历对象时,会首先调用 iter 函数把对象变为迭代器,如果遍历的对象是不可迭代的,则在 iter 函数转换时抛出异常。

data = 5
for item in data:
    print(item)

# Python 解释器首先把上面 for ... in 语句转为下面代码,因为 data 是不可迭代对象,所以在转化成迭代器时报异常
data = iter(data)  # TypeError: 'int' object is not iterable

迭代器总结

Python 内置的 int 类型,float类型,bool 类型,NoneType 类型都不是可迭代的对象,更不是迭代器。

Python 内置的 str 类型,list 类型,tuple 类型,dict 类型,set 类型都是可迭代的对象,但不是迭代器。

可迭代对象(str,list,tuple,dict,set)都可以通过 iter 函数转换为迭代器。

一个对象同时有 __iter__ 函数和 __next__ 函数是迭代器的充分必要条件。也就是说迭代器必须有 __iter__ 函数和 __next__ 函数,有 __iter__ 函数和 __next__ 函数的对象都是迭代器(我们在面向对象学习对象)。

生成器一定是迭代器,也就说生成器含有 __iter__ 函数和 __next__ 函数。

本节重要知识点

可迭代对象,生成器,迭代器区别。

for...in 的本质。

点赞:0 分享

上一篇
python3类和对象的概念
下一篇
Python3生成器
作者头像 作者名称 作者性别
韩俊

热门推荐

1 python argparse用法总结
2 Python3函数参数详解
3 python中itertools模块详解
4 python3类和对象的概念
5 Python3推导式
6 Python中hashlib模块详解

评论列表

取消回复

    •  
      Login

      韩俊

      趁你现在还有时间,尽你自己最大的努力,努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。这个世界永远比你想的要更精彩,不要败给生活。

      退出登陆
      • 10076文章
      • 455评论
      • 80微语
  • 广告赞助

  • 二零二五年06月
    一二三四五六日
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
  • 分类

    • 网站模板源码
    • IT技术笔记
    • 好资源分享
    • 共享网络资源
  • 最新文章

      • 幼儿端午祝福语简短句
        • 端午简短祝福语送家人
          • 端午文案祝福语简短励志
            • 经典的黄句子
              • 经典黄色搞笑句子
                • 迷雾通:免费使用的VPN软件
                  • 任推邦:打造你的赚钱新途径!
                    • 任推邦是正规平台吗?任推邦邀请码多少?
  • 热门文章

    • 酷狗音乐VIP账号 酷狗音乐会员账号共享2017.01.29更新
    • 芒果tv vip会员账号 芒果tv会员账号共享2017.01.29更新
    • 爱奇艺vip账号 爱奇艺/PPS会员账号共享2016.12.12更新
    • 优酷/土豆vip会员账号 优酷会员账号共享2017.01.29更新
    • 活动:免费获得爱奇艺VIP/PPS会员账号50天以上的使用权!
    • 酷我音乐VIP账号 酷我音乐会员账号共享2016.12.31更新
    • 暴风影音会员账号 暴风影音会员账号共享2016.12.31更新
    • m1905会员账号 m1905会员账号共享2016.10.21更新
  • 最新评论

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/10.jpg

      你丫的 文章写得太好了 支持下!![F3...

    • https://www.vipshare8.com/content/templates/meta/Static/images/avatar.jpg

      很棒!刚在某网站看到这个,很欣赏,可惜下...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3861064027

      呃呃呃 oooo

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了111:根据激活的时间有一年的有效期!

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=792480561

      到2025就到期了吗?

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      [blockquote]打卡时间:16:...

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/7.jpg

      俊哥,想借用迅雷一用!但需要手机验证!看...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3293901900

      感谢大大的分享

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了好奥v:如果没有解析成功,可以切换接口...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=131241242441

      现在视频解析网站怎么用不了啦?

  • 网站统计 I 当前在线:524人

    • 本站管理:1位
    • 用户总数:591位
    • 置顶文章:2篇
    • 日志总数:10076篇
    • 微语总数:80条
    • 评论总数:455条
    • 标签总数:83条
    • 页面总数:8页
    • 分类总数:14个
    • 链接总数:16条
    • 运行天数:3699天
    • 最后更新:5月26日
    • 登录
    • 注册
    • 找回
    Copyright © 2025vip共享吧网站地图 网站备案豫ICP备19004194号-1

    免责声明:本站资源仅供用于学习和交流,本站部分素材内容来源于网络,如有侵权/投稿等,请及时联系站长.

    • 首页
    • 秒懂百科 秒懂百科
    • 搜索
    • 史上今日

    大家都在搜

    • 优酷账号共享
    • 2345网址导航
    • 咪咕会员账号
    • seo
    • 优酷vip账号共享
    • MySql
    • qq音乐会员共享
    • 最新电影
    • 千图网vip账号共享
    • 华数tv会员账号分享
    • 网赚网盘
    • 乐视会员账号共享
    • 迅雷VIP账号共享
    • seo优化
    • 芒果视频
    • 喜马拉雅FM会员账号
    • 
    • 