17.Python之迭代器
2020-02-13 本文已影响0人
免跪姓黄
Python之迭代器
-
可迭代对象
内部含有
__iter__
方法的对象,称之为可迭代对象。 -
通过
dir()
获取一个对象内部的所有方法s = 'Python' print(dir(s)) # 返回对象s内部的所有方法 ''' 输出结果: ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] '''
-
判断一个对象是不是一个可迭代对象(检查一个对象中是否含有
__iter__
方法)s = 'Python' print('__iter__' in dir(s)) # 返回 True 即为可迭代对象
-
可迭代对象的优缺点
- 优点:
- 存储的数据可以直观的显示出来
- 内置的方法较多
- 缺点:
- 占用内存
- 不能一个一个的直接取值(for循环通过内部迭代器转化后才实现的直接取值)
- 优点:
-
迭代器
内部含有
__iter__
和__next__
方法的对象就是迭代器,也正是因为有__next__
方法,才使得可迭代对象可以通过for循环直接取值。 -
迭代器的作用
- 迭代是Python中最强大的功能之一,当处理一个远大于内存容量的数据时,需要找到一种节省内存的惰性获取数据项的方式,即按需一次获取一个数据项,以达到节省内存的作用,这就是迭代器模式。
-
判断一个对象是不是一个迭代器(检查一个对象中是否同时含有
__iter__
和__next__
方法)with open(r'file_path', mode='r') as f: print('__iter__' in dir(f) and '__next__' in dir(f)) # 返回 True 即为迭代器
-
通过内置函数
iter()
将可迭代对象转化成迭代器,也可以通过可迭代对象.__iter__()
进行转化 -
通过内置函数
next()
可以对一个迭代器取值,一个next()
取一个值,也可以通过可迭代对象.__next__()
取值 -
迭代器的优缺点
- 优点:
- 惰性机制,next一次,取一个值,绝不多取,因此非常节省内存
- 缺点:
- 速度慢,以时间换空间
- 单向取值时不能反向取值
- 优点:
-
可迭代对象与迭代器的区别
- 可迭代对象的操作方法较多,存储的数据能够直观的全部显示出来的一个数据集;当侧重于对数据可以灵活处理,并且内存空间足够(8G内存大约能够支撑可迭代对象中的几百万个数据),将数据集设置为可迭代对象是很好的选择。
- 迭代器是一个只有
next()
方法,存储的数据不能直观的全部显示出来的一个数据集,当数据集中的数据量过于庞大,超出了内存可以使用的范围时,或不确定数据集中的数据量的时候,将数据集设置为迭代器是很好的选择。这就是文件句柄为什么设置为迭代器的原因。
-
while循环模拟for循环的机制
-
方式一:
l = [1,2,3,4,5,6,7,8,9] # 将可迭代对象转换为迭代器 obj = iter(l) count = 0 # 对迭代器循环取值 while count < len(l): data_elements = next(obj) print(data_elements) count += 1
-
方式二:(利用异常处理)
l = [1,2,3,4,5,6,7,8,9] # 将可迭代对象转换为迭代器 obj = iter(l) # 对迭代器循环取值 while 1: try: data_elements = next(obj) print(data_elements)
-