迭代器vs可迭代对象,推导式vs生成器
程序员文章站
2022-06-08 19:49:12
...
迭代器vs可迭代对象,生成式vs生成器,推导式
迭代器vs可迭代对
-
迭代器(类):凡是实现了__iter__,__next__的对象就是迭代器。
-
可迭代对象:只实现了__iter__方法
例子:手写迭代器,实现Range()函数
class Range:
def __init__(self, start, stop=None, step=1):
if stop is None:
# 说明没有传start的值.
self.start = 0
self.stop = start
else:
self.start = start
self.stop = stop
self.step = step
def __iter__(self):
return self
def __next__(self):
# 返回当前值,并更新下一个值
if self.start < self.stop:
temp = self.start
self.start += self.step
return temp
else:
raise StopIteration
注意:
1)iter方法,什么都不用做,返回它自己
2)next函数,返回当前值,并更新下一个。不满足条件时抛出StopIteration
例子2:使用迭代器实现斐波那契数列
"""
使用迭代器实现斐波那契数列
"""
class Fab:
def __init__(self, n):
self.prev = 0
self.curr = 1
self.times = 0
self.stop = n
def __iter__(self):
return self
def __next__(self):
if self.times <= self.stop:
# 更新
temp = self.curr
self.prev, self.curr = self.curr, self.prev + self.curr
self.times += 1
return temp
else:
raise StopIteration
注意:
1)iter 永远只返回自己
2)因为每次都会调用__next__ ,所以里面不用循环
推导式(生成式) vs 生成器
-
推导式(生成式)
-
一行代码实现for循环
-
从一个数据序列构建另一个新的数据序列的结构体
-
有三种: 列表,字典,集合。分三部分:“生成值的表达式”, “循环主体”, “过滤条件表达式”
列表: [i * 3 for i in range(5) if i % 2 == 0] 字典: {i: i + 3 for i in range(5)} 集合: {i for i in range(5)} #列表生成式 lis = [x*x for x in range(10)]
-
-
生成器(函数)
-
特殊的迭代器(不需要自己实现iter和next方法,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器)
-
函数种含有yield关键字
-
“惰性求值”(节省内存)一边循环一边计算的机制
-
最简单创建:把推导式种的【】变()
#生成器 generator_ex = (x*x for x in range(10))
-
例子:使用生成器生成斐波那契数列
"""
使用生成器生成斐波那契数列
"""
def fab(n):
prev, curr = 0, 1
times = 0
while True:
if times <= n:
# 迭代
temp = curr
prev, curr = curr, curr + prev
times += 1
yield temp
else:
break
or