Python基础进阶2:为什么open函数返回的文件对象是迭代器?

你好,我是kelly,今天分享一个简单但又不怎么让人关注的细节。

背景:

先看下下面2段代码:

代码1:

f = open("data.csv", encoding="utf-8")
lines = f.readlines()
# 对lines执行某种操作
f.close()

代码2:

f = open("data.csv", encoding="utf-8")
for line in f:
    # 对line执行某种操作
    pass
f.close()

上述两种打开文件方式的代码都是Python开发者人员非常熟悉的:

代码1是一次性读取全部数据,代码2是增量式、每次读取一行数据。

对于代码2的写法,很多人也知道文件对象f是个迭代器,使用for循环方式读取,可降低内存消耗。

但是文件对象f为什么是迭代器?之前只是看书或者看帖子,记住了这一概念,但自己并没有真正清楚答案。

解答:

在回答之前,需要先熟悉下python内置的dir函数。

ipython模式下查看dir函数说明:

简单理解:

1、不带参数时,返回当前作用域内的变量、方法等。

2、带参数时,即输入为object时,返回当前对象的属性、方法等。

因此,使用dir函数读取文件对象f的内置属性。

f = open("data.csv", encoding="utf-8")
lines = f.readlines()

aa = dir(f)
f.close()

通过debug调试模式,查看变量aa的值:

可知,文件对象f包含方法__iter__和__next__,满足迭代器的定义。

迭代器的定义:

Technically, in Python, an iterator is an object which implements the iterator protocol, 

which consist of the methods __iter__() and __next__().

翻译过来就是:

简单来说,任何实现了__iter__和__next__()方法的对象都是迭代器。

答案不言而喻。


本文原创,原始版本发表链接:

https://mp.weixin.qq.com/s?__biz=MzI2Mjg3NTY5MQ==&mid=2247484620&idx=1&sn=cffb55544ce72448a78bfc1ace7bc7ec&chksm=ea453b88dd32b29ef9c95466cbb4176c7c4d70dcc0aaa812c88da4d834c010b746d635cda8df#rd

kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。
--over--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值