python迭代器生成器
2019-07-23 16:45
99 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fengdi_yuxi/article/details/97006806
首先理解几个概念,迭代、可迭代对象、迭代器。
1. 迭代器
- 迭代(Iteration):按顺序访问线性结构中的每一项
- 可迭代对象(Iterable):定义了__iter__方法的对象即为可迭代对象。一般可作用于for循环的对象均为可迭代对象。
- 判断对象是否可迭代:from collections import Iterable isinstance(obj, Iterable)
# 可迭代对象Iterable num = [10, 20, 30] from collections import Iterable isinstance(num, Iterable) # 执行结果 True
- 迭代器(Iterator):具有__iter__方法(返回一个具有__next__方法的对象)、__next__()方法的对象即为迭代器。是一个不断生成下一个值的惰性计算序列。占用空间较小。
- 判断对象是否为迭代器:from collections import Iterator isinstance(obj, Iterator)
# 自定义实现可迭代对象:内部定义了__iter__方法 from collections import Iterable class Classmate(object): def __iter__(self): pass classmate = Classmate() isinstance(classmate, Iterable) # 执行结果 True
- 可使用iter()函数将一个可迭代对象转变为迭代器
# 可迭代对象转换为迭代器 num_list = [1, 2, 3, 4] num_iterator = iter(num_list) print(type(num_iterator)) # 执行结果 <class 'list_iterator'>
-
for循环迭代的后台机制:
判断对象是否可迭代 - 若为可迭代对象,利用iter()函数生成一个迭代器对象(自动调用对象的__iter__方法得到一个返回值:迭代器)
- 利用next()函数_next_()方法不断访问对象的下一个值
- 内部自动处理Stopiteration异常,出现该异常自动停止迭代。
自定义实现迭代器:斐波那契数列
# 自定义实现迭代器:斐波那契数列 from collections import Iterator class Fib(object): def __init__(self, num): self.num = num self.current_num = 0 self.a = 0 self.b = 1 def __iter__(self): return self def __next__(self): if self.current_num < self.num: self.a, self.b = self.b, self.a + self.b self.current_num += 1 return self.a else: raise StopIteration fib = Fib(10) print(isinstance(fib, Iterator)) for num in fib: print(num)
2. 生成器
-
生成器均为迭代器
-
生成器提供延迟操作:需要的时候生成结果,而不是立即产生结果(内存占用较少)
-
生成器表达式:类似于列表推导式,但按需产生结果的一个对象,而不是一次构建整个结果列表
# 生成器表达式 squares = (x for x in range(3)) print(type(squares)) # print(next(squares)) # print(next(squares)) # print(next(squares)) # print(next(squares)) # 此处会抛出Stopiteration异常 for x in squares: # for循环会自动处理Stopiteration异常 print(x)
- 生成器函数:使用yield语句而不是return语句返回结果,yield语句执行一次返回一个结果
# 生成器函数 def test(num): for x in range(num): yield x num_iterator = test(10) print(type(num_iterator)) print(list(num_iterator)) # 执行结果 <class 'generator'> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3. 总结
-
迭代器是一个惰性计算序列,占用空间较小。生成器本身也为迭代器。与列表区别,列表存储的是数据列表,生成器存储的是生成元素的方法。
-
使用了yield关键字的函数不再是函数,而是生成器。yield关键字有两点作用:
保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起 - 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
Python3中的生成器可以使用return返回最终运行的返回值,而Python2中的生成器不允许使用return返回一个返回值(即可以使用return从生成器中退出,但return后不能有任何表达式)。
相关文章推荐
- python基础之生成器迭代器
- Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
- python基础之生成器迭代器
- python迭代器和生成器
- Python【生成器与迭代器】
- 完全理解Python迭代对象、迭代器、生成器
- Python 数据类型以及迭代器和生成器
- Python 迭代器、生成器和列表解析
- Python 可迭代的对象、迭代器和生成器
- python:使用迭代器和生成器完成斐波那契数列
- python迭代器、生成器、装饰器
- python3-迭代器与生成器
- 详解Python3中的迭代器和生成器及其区别
- python中的迭代器与生成器 .
- Python中生成器和迭代器的区别
- Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记
- python基础-装饰器,生成器和迭代器
- python 迭代器 和 生成器 的个人理解
- python特性(六):yield与迭代器生成器
- Python--day4--迭代器-生成器-装饰器-目录