网站首页 > 技术文章 正文
一、基本概念
迭代(Iteration)是动词,是指通过遍历获取某容器内所有元素,特指遍历获取这个动作。
可迭代 (iterable)是形容词,是指某容器可被遍历获取内部所有元素,特指容器内元素可被遍历获取的特性。
在python中包含__iter__方法的对象就是可迭代的。
- 可迭代对象一般指某容器可被循环遍历获取内部所有元素,该容器有__iter__方法和__getitem__,无__next__方法。
- 可迭代对象常见的有str、list、tuple、set、dict等。
迭代器 (iterator)是名词,特指某种特殊的容器,该容器内所有元素可通过__next__方法依次获取。
在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: True
getitem: True
next: False
********** 判断列表iter、getitem、next **********
iter: True
getitem: True
next: 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: True
getitem: False
next: True
********** 判断列表迭代器iter、getitem、next **********
iter: True
getitem: False
next: 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是可迭代对象吗? True
s1是迭代器吗? False
s2是可迭代对象吗? False
s2是迭代器吗? True
三、可迭代对象与迭代器的优劣比较
可迭代对象的优点:
- 访问速度快。
- 访问方式灵活,可多次、重复、任意选择范围访问。
- 内置方法和函数比较多。
可迭代对象的缺点:
- 耗费内存。
- 取值过于灵活(有时会引起报错,如index out of range、TypeError等)。
迭代器的优点:
- 节省内存。
- 惰性取值(一次固定取一条数据,直到取值完毕报StopIteration,不会引发报错)。
迭代器的缺点:
- 访问速度慢。
- 访问方式死板,只能访问下一条不能访问上一条。
- 内置方法和函数比较少。
四、可迭代对象与迭代器如何选择
- 在存储数据相对少(8g内存可承受几百万个对象),侧重对数据灵活处理时,将数据集设为可迭代对象更好。
- 当数据量大到足以撑爆内存(几千万甚至上亿个对象时),侧重节省内存时,将数据集设为迭代器更好。
猜你喜欢
- 2025-01-14 阿六详解 python 中的迭代操作和迭代器、生成器的区别
- 2025-01-14 理解python迭代对象、迭代器、生成器
- 2025-01-14 Python中的迭代是什么意思?
- 2025-01-14 Python 迭代全解
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)