你好,我是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__()方法的对象都是迭代器。
答案不言而喻。
本文原创,原始版本发表链接:
kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。
--over--