迭代器
class something:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
mynew = something()
myiter = iter(mynew)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
生成器
当函数返回时,函数内部的代码停止执行
生成器在返回值可以暂停执行
生成器使用yield语句返回值
在函数体内部,yield与return只能二选一
例如:倒计时
只要还有yield语句还存在,生成器就依然可用,消耗完yield语句后,抛出Stopiteration错误
>>>def countdown():
yield 3
yield 2
yield 1
yield "blast off!"
>>>g = countdown()
>>>next(g)
>>>3
>>>next(g)
>>>2
>>>next(g)
>>>1
>>>next(g)
>>>"blast off!"
生成器一般通过for循环调用
例如,修改上例:
>>>for i in countdown():
if isinstance(i,int):
message = "T-" + str(i)
else:
message = i
print(message)
>>>T-3
T-2
T-1
blast off!
生成器的运用
计算从0到n的所有数的平方和
>>>def square(n):
for x in range(n):
x2 = x ** 2
yield x2
>>>sum = 0
>>>for i in square(3):
>>> print(i)
>>> sum += i
>>>sum
>>>5
yield from语句
例如,生成回文生成器
>>>def yield_all(x):
for i in x:
yield i
>>>def palin(x):
yield from yield_all(x)
yield from yield_all(x[::-1])
>>>for i in palin([1,2,3,4,5]):
print(i)
直观的看看这个问题:
a = iter(range(5))
b = range(5,13)
for i in range(8):
try:
print(b[next(a)])
except StopIteration:
print("Stop")
except IndexError:
print("Index")
一个生成器的例子
def fibonacci(n):
a,b,counter = 0,1,0
while True:
if (counter > n ):
return
yield a
a,b = b,a+b
counter += 1
f = fibonacci(10)
while True:
try:
print(next(f),end = " ")
except StopIteration:
print("over")
break
效果
装饰器
装饰器是接收另一个函数作为参数的特殊函数
Python使@使符号来表示对一个函数使用装饰器
等价于1.使用def关键字定义一个普通的函数
2.对这个函数调用装饰器
3.将原函数的名称赋值给装饰器的返回值