你好, 之前的五篇见链接
001-函数技巧\变量\包\标准库
002-高阶函数技巧-lambda\filter\map\reduce 函数
003–文件の读写
004–面向对象
005–装饰器
文章目录
迭代器介绍
- 迭代(iterate):意味着重复多次,如循环那样
- 迭代器: 实现了
__iter__
的对象是可迭代的,而实现了__next__
的对象是迭代器 - 调用方法
__next__
时,或next()
,迭代器返回其下一个值 - 如果迭代器没有可供返回的值,出发
Stoplteration
异常
这部分内容逻辑比较复杂,需要沉下心来研究.
如何从迭代器创建序列
- 通过刻碟带对象调用内置函数
iter
可获得一个迭代器
__next__()
方法演示代码如下:
# 没有迭代器的时候
l=[1,2,3,4]
for i in l:
print(i)
>>> 1
>>> 2
>>> 3
>>> 4
# 用迭代器
ll = iter(l)
ll.__next__()
>>> 1
ll.__next__()
>>> 2
ll.__next__()
>>> 3
ll.__next__()
>>> 4
ll.__next__()
>>>报错:StopIteration: 因为四个元素取完了
next()
方法演示代码如下:
l=[1,2,3,4]
mm=iter(l)
next(mm) # 1
next(mm) # 2
next(mm) # 3
next(mm) # 4
next(mm) # 报错:StopIteration: 因为四个元素取完了
迭代器计算演示
列表返回平方值 下边代码包含三种方法
class PowNumber(object):
"""
迭代器
生成1,2,3,4,5,... 数的平方
"""
value = 0
def __next__(self):
self.value += 1
if self.value > 10:
raise StopIteration
return self.value * self.value
def __iter__(self):
return self
if __name__ == '__main__':
pow = PowNumber()
print(pow.__next__())
print(pow.__next__())
print(pow.__next__())
print(pow.__next__())
print(next(pow))
print(next(pow))
print(next(pow))
print(next(pow))
# 循环迭代器
for i in pow:
print(i)
生成器介绍
- 生成器是一种使用普遍函数语法定义的迭代器
- 包含
yield
语句的函数都被称为生成器 - 不适用return返回一个值,而是可以生成多个值,每次一个
- 每次使用
yield
生成一个值后,函数都将冻结,即在此停止执行 - 被重新唤醒后, 函数将从停止的地方开始继续执行
一种生成器
l3 = [x*x for x in [1,2,3,4,5]]
l3 #[1, 4, 9, 16, 25]
l4 = (x*x for x in [1,2,3,4,5])
l4 #圆括号后,产生的是生成器.类型是 <generator object <genexpr> at 0x10dff5f50>
l4.__next__() #1
l4.__next__() #4
next(l4) #9
yield作用演示
# yield 演示
def pow():
yield 11
yield 12
yield 13
yield 14
if __name__ == '__main__':
rest=pow()
print(rest)
print(next(rest))
print(next(rest))
print(next(rest))
print(next(rest))
print(next(rest))
#<generator object pow at 0x10e00c050>
#11
#12
#13
#14
#报错 StopIteration:
用生成器做平方的计算
def pow_number():
return(x*x for x in [1,2,3,4,5])
def pow_number2():
for x in [1,2,3,4,5]:
yield x*x
if __name__ == '__main__':
rest=pow_number2()
print(next(rest))
# 1
print(next(rest))
# 4
print(next(rest))
# 9
print(rest.__next__())
# 16
用生成器模拟range函数
方式1 ,较复杂,建立
next
和iter
两个函数
class IterRange(object):
""" 使用迭代器来模拟range函数 """
def __init__(self, start, end):
self.start = start - 1
self.end = end
def __next__(self):
self.start += 1
if self.start >= self.end:
raise StopIteration
return self.start
def __iter__(self):
return self
if __name__ == '__main__':
iter = IterRange(5, 10)
print(next(iter)) #5
print(next(iter)) #6
print(next(iter)) #7
print(next(iter)) #8
print(next(iter)) #9
print(next(iter)) #StopIteration:
l = list(iter)
print(l) #在上边内容注释掉的情况下:[5, 6, 7, 8, 9]
方式二: 面向对象方式
class GenRange(object):
""" 使用生成器来模拟range函数 """
def __init__(self, start, end):
self.start = start - 1
self.end = end
def get_num(self):
while True:
if self.start >= self.end - 1:
break
self.start += 1
yield self.start
if __name__ == '__main__':
gen = GenRange(5, 10).get_num() #<generator object GenRange.get_num at 0x10e00cbd0>
print(gen) #<generator object GenRange.get_num at 0x10e00cbd0>
print(next(gen)) # 5
print(next(gen)) # 6
print(next(gen)) # 7
print(next(gen)) # 8
print(list(gen)) #在上边注释掉的情况下 [5, 6, 7, 8, 9]
方式三:优化掉还要加
.get_num
这部分, 函数方式
def get_num(start, end):
start -= 1
while True:
if start >= end - 1:
break
start += 1
yield start
if __name__ == '__main__':
gen_f = get_num(5, 10)
print(gen_f) #<generator object get_num at 0x10e00c9d0>
print(list(gen_f)) #[5, 6, 7, 8, 9]