Python 迭代器、生成器与装饰器

迭代器

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.将原函数的名称赋值给装饰器的返回值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

River Chandler

谢谢,我会更努力学习工作的!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值