青柠檬檬哒|python之彻底搞懂迭代、可迭代、迭代器的区别(一)
迭代(Iteration)是动词 , 是指通过遍历获取某容器内所有元素 , 特指遍历获取这个动作 。
可迭代 (iterable)是形容词 , 是指某容器可被遍历获取内部所有元素 , 特指容器内元素可被遍历获取的特性 。
在python中包含__iter__方法的对象就是可迭代的 。
- 可迭代对象一般指某容器可被循环遍历获取内部所有元素 , 该容器有__iter__方法和__getitem__ , 无__next__方法 。
- 可迭代对象常见的有str、list、tuple、set、dict等 。
在python中包含__iter__方法和__next__方法的对象就是迭代器 。
- 迭代器一般指某容器可通过__next__方法依次获取内部所有元素 , 该容器有__iter__方法和__next__ , 无__getitem__方法 。
- 迭代器常见的有文件句柄以及通过iter()转换的对象和迭代器生成式生成的对象等 。
- 生成器 , 是一种特殊的迭代器 , 生成器自动生成了__iter__方法和__next__ , 不需要再手动生成 。
本文插图
可迭代、可迭代对象、迭代器关系图
- 判断一个对象是可迭代对象 , 可以通过查看该对象是不是有__iter__方法和__getitem__方法来鉴别 。
# 字符串:可迭代对象s1 = '努力学python , 坚持认真学python'print('*' * 10, '判断字符串iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(s1))print('getitem:', '__getitem__' in dir(s1))print('next:', '__next__' in dir(s1))# 列表:可迭代对象l1 = [i for i in range(10)]print('*' * 10, '判断列表iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(l1))print('getitem:', '__getitem__' in dir(l1))print('next:', '__next__' in dir(l1))out:********** 判断字符串iter、getitem、next **********iter: Truegetitem: Truenext: False********** 判断列表iter、getitem、next **********iter: Truegetitem: Truenext: False
- 判断一个对象是不是迭代器 , 可以通过查看该对象是不是有__iter__方法和__next__方法来鉴别 。
# 字符串迭代器s2 = iter(s1)print('*' * 10, '判断字符串迭代器iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(s2))print('getitem:', '__getitem__' in dir(s2))print('next:', '__next__' in dir(s2))# 列表迭代器l2 = iter(l1)print('*' * 10, '判断列表迭代器iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(l2))print('getitem:', '__getitem__' in dir(l2))print('next:', '__next__' in dir(l2))out:********** 判断字符串迭代器iter、getitem、next **********iter: Truegetitem: Falsenext: True********** 判断列表迭代器iter、getitem、next **********iter: Truegetitem: Falsenext: True
- 可以自定义一个简单的lambda表达式来判断是可迭代对象还是迭代器 。
is_er = lambda x: '__iter__' in dir(x) and '__getitem__' in dir(x)is_or = lambda x: '__iter__' in dir(x) and '__next__' in dir(x)s1 = '努力学python , 坚持认真学python's2 = iter(s1)print('s1是可迭代对象吗?', is_er(s1))print('s1是迭代器吗?', is_or(s1))print('s2是可迭代对象吗?', is_er(s2))print('s2是迭代器吗?', is_or(s2))out:s1是可迭代对象吗? Trues1是迭代器吗? Falses2是可迭代对象吗? Falses2是迭代器吗? True
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 柠檬少年|盘点2019年军用超级黑科技
- 青柠檬檬哒|落伍:英特尔助美军方生产先进芯片,伪专家还在谈重安稳轻性能
- 中国统计网|Python分析4000+淘宝月饼销售数据,告诉你谁是月饼中的TOP.1?
- 柠檬少年|苹果停止了iOS14的系统验证,这是为iphone12铺路?
- 技术编程|Python 数据驱动框架 ddt 使用
- |Python分析淘宝月饼销售数据,五仁月饼王者地位不可动摇
- 中国统计网|Python实战:信用评分模型开发「Part 1」
- CSDN|为什么字节跳动、腾讯、阿里都在用 Python??
- |开发者发现一加正开发一款名为「柠檬水」的新机
- 技术编程|VS Code是否已成为Python的最佳IDE?