Python进阶--生成器和迭代器以及实现方法
2019-02-26 18:26
441 查看
生成器和迭代器
-
generator: ⽣成器是一种特殊的迭代器, 不需要⾃定义 __iter__ 和 __next__
⽣成器函数 (yield)
[code]def foo(): ...: print(111) ...: yield 222 ...: print(333) ...: yield 444 ...: print(555) ...: In [2]: n=foo() In [3]: next(n) 111 Out[3]: 222 In [4]: next(n) 333 Out[4]: 444 In [5]: next(n) 555 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-5-0fa053c92e6d> in <module> ----> 1 next(n) StopIteration:
⽣成器表达式: (i*2 for i in range(5)) 这里使用的是括号(),list是[ ].
[code]In [9]: gen = (i*2 for i in range(5)) In [10]: print(gen) <generator object <genexpr> at 0x10e73a200>
-
iterator:任何实现了__iter__和__next__方法的对象都是迭代器
- __iter__ 得到一个迭代器。迭代器的 __iter__() 返回自身
- __next__ 返回迭代器下一个值
- 如果容器中没有更多元素, 则抛出 StopIteration 异常
- Python2中没有 __next__() , ⽽是 next()
[code]class Range: def __init__(self, start, end=None, step=1): if end is None: self.end = start self.start = 0 else: self.start = start self.end = end self.step = step def __iter__(self): return self def __next__(self): if self.start < self.end: current = self.start self.start += self.step return current else: raise StopIteration() Iter = Range(1, 4) 结果: In [10]: print(next(Iter)) 1 In [11]: print(next(Iter)) 2 In [12]: print(next(Iter)) 3 In [13]: print(next(Iter)) --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-13-2439b2fba63d> in <module> ----> 1 print(next(Iter)) <ipython-input-9-f1a6fab34350> in __next__(self) 19 return current 20 else: ---> 21 raise StopIteration() 22 23 StopIteration:
- str / bytes / list / tuple / dict / set ⾃身不是迭代器,他们自身不具备 __next__() , 但是具有 __iter__() , __iter__() 方法用来把⾃身转换成一个迭代器
练习:
[code]# 练习1: 定义⼀一个随机数迭代器器, 随机范围为[1, 50], 最⼤大迭代次数3 import random class RandomIter: def __init__(self, start, end, times): self.start = start self.end = end self.count = times def __iter__(self): return self def __next__(self): self.count -= 1 if self.count >= 0: return random.randint(self.start, self.end) else: raise StopIteration() RandomIter = RandomIter(1,50,3) print(next(RandomIter)) print(next(RandomIter)) print(next(RandomIter)) print(next(RandomIter))
[code]# 练习2: ⾃定义一个⽣成器函数, 实现斐波那契数列 def fib(max_value): prev = 0 curr = 1 while curr < max_value: yield curr prev, curr = curr, curr + prev for i in fib(20): print(i, end=' ') 结果:1 1 2 3 5 8 13
各种推导式
分三部分:⽣成值的表达式, 循环主体, 过滤条件表达式
列表: [i*3 for i in range(5) i f %2 == 0]
字典: {i: i + 3 for i in range(5)}
集合: {i for i in range(5)}
生成器: (i for i in range(5))
相关文章推荐
- python3.5进阶(三)-------------实现多任务之协程(生成器,迭代器)
- ·python·用生成器和迭代器实现自己的xrange
- Python中列表list以及list与数组array的相互转换实现方法
- Python 进阶 —— 迭代器与生成器
- Python进阶之迭代器和生成器
- python开启摄像头以及深度学习实现目标检测方法
- ·python·用生成器和迭代器实现自己的xrange
- 生成器的创建方法,以及斐波那契数列的生成器的实现
- python中对Excel进行写入操作,写入一列或者一行(从excel中读出label和feature对应格式方法以及插入一行或者一列方法实现)
- python实现从字符串中找出字符1的位置以及个数的方法
- ·python·用生成器和迭代器实现自己的xrange
- 详解Python的迭代器、生成器以及相关的itertools包
- python 调用海康linux下psdatacall_demo,实现获视频取码流并返回到python,以及上传信息到人脸库的方法
- python实现二叉树以及二叉树的遍历--1(面向对象的方法实现)
- 详解python中的单例模式以及其实现方法
- Python 数据类型以及迭代器和生成器
- 迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
- python爬虫URL重试机制的实现方法(python2.7以及python3.5)
- [置顶] 关于求N以内素数的python实现以及优化方法