Python函数之迭代器
1.迭代器
1.1 可迭代对象
-
字面意思解释
我们之前一直在提可迭代对象的概念,我们学过的所有数据里面什么是可迭代对象?
str list tuple dict set 这些都是可迭代对象。
可迭代对象:什么是对象?python中一切皆对象。比如所有类型的数据,函数名,py文件,文件句柄,等等等等都称之为一个对象,对象就是一个具体的实实在在的内容,什么是可迭代的?更新迭代,可以一直重复的更新内容的,每次都会有变化。所以,什么叫可迭代对象:可以一直重复更新的实在的内容(对象)。
-
专业角度
在python中,一个对象如果内部含有
__iter__
方法就是可迭代对象。 -
内置函数dir 获取一个对象所有的方法,返回一个列表。
# s1 = 'barry' # print(dir(s1)) # l1 = [1, 2, 3] # print(dir(l1)) dic1 = {'name': 'barry'} print(dir(dic1)) # 如何判断? ret = 'barry' l1 = [1, 2, 3] dic1 = {'name': 'barry'} i1 = 100 if '__iter__' in dir(i1): print('是可迭代对象')
如果确定了一个对象是可迭代对象,那么就可以对其进行for循环遍历。
-
小结:
-
字面解释:可以一直重复更新的实在的内容(对象)。
-
专业解释:在python中,一个对象如果内部含有
__iter__
方法就是可迭代对象。 -
if
'__iter__'
in dir(object) -
可迭代对象的优点:
- 可以直观的看到里面的数据。
- 操作方法比较多,使用起来比较灵活。
-
可迭代对象的缺点:
-
不能直接使用for循环获取值。(除去使用索引,key以外)
可迭代对象不能直接使用for循环,我们之所以可以使用for循环遍历一个可迭代对象,是因为for循环的底层先将可迭代对象转化成一个迭代器,然后在利用next方法进行取值。
-
-
1.2 迭代器
-
字面解释:可以进行更新迭代的生产数据的工具。
-
专业角度:在python中,一个对象如果内部含有
__iter__
并且含有__next__
方法就是迭代器。 -
如何判断一个对象是迭代器?
# 我们到目前为止学过的唯一一个迭代器就是文件句柄。 ret = 'barry' l1 = [1, 2, 3] dic1 = {'name': 'barry'} with open('msg', encoding='utf-8', mode='r') as f1: pass if '__iter__' in dir(f1) and '__next__' in dir(f1): print('是迭代器') else: print('不是')
-
可迭代对象可以转化成迭代器 iter()方法。
ret = 'barry' l1 = [1, 2, 3] dic1 = {'name': 'barry'} obj = iter(l1) print(obj)
-
迭代器可以通过next方法进行取值。
ret = 'barry' l1 = [1, 2, 3] dic1 = {'name': 'barry'} obj = iter(l1) print(obj) print(next(obj)) print(next(obj)) print(next(obj)) print(next(obj)) # 报错
-
利用while循环模拟for循环的内部遍历机制。
# ret = 'barry' # for i in ret: # print(i) # 要会默写。 ret = 'barry' # 将可迭代对象转化成迭代器 obj = iter(ret) # 利用while循环进行取值。 while 1: # 加一个异常处理: try: print(next(obj)) except StopIteration: break
-
小结
- 字面解释:可以进行更新迭代的生产数据的工具。
- 专业解释:在python中,一个对象如果内部含有
__iter__
并且含有__next__
方法就是迭代器。 - if
'__iter__'
in dir(object) and'__next__'
in dir(object) - 迭代器的优点:
- 节省内存(以时间换取空间)。
- 可迭代对象的缺点:
- 不能直观的呈现数据。
- 迭代器的特点:
- 一直向下取值,不返回。
- 惰性机制,next一次,取一次值。
-
对比:
-
可迭代对象:
是一个私有的方法比较多,操作灵活(比如列表,字典的增删改查,字符串的常用操作方法等),比较直观,但是占用内存,而且不能直接通过循环迭代取值的这么一个数据集。
应用:当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。
-
迭代器:
是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
应用:当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。(可参考为什么python把文件句柄设置成迭代器)
-