生成器和装饰器

生成器

  

  在Python中,这种一边循环一边计算的机制,称为生成器:generator

  生成器是一个特殊的程序,可以被用作控制循环的迭代行为

  python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器

  生成器就是可迭代对象,延迟计算、节省内存

  创建:生成器函数,生成器表达式

       #生成器:generator_ex = (x*for in range(10))

 1 def fib(max):
 2     n,a,b =0,0,1
 3     while n < max:
 4         yield b
 5         a,b =b,a+b
 6         n = n+1
 7     return 'done'
 8 g = fib(6)
 9 while True:
10     try:
11         x = next(g)
12         print('generator: ',x)
13     except StopIteration as e:
14         print("生成器返回值:",e.value)
15         break
16  
17  
18 结果:
19 generator:  1
20 generator:  1
21 generator:  2
22 generator:  3
23 generator:  5
24 generator:  8
25 生成器返回值: done

 

装饰器

  装饰器本质是函数,为其他函数添加附加功能

  原则:不修改主函数源代码,不修改主函数的调用方式

  装饰器 = 高阶函数 + 函数嵌套 + 闭包

高阶函数

  定义:函数接收的参数是一个函数名,或函数的返回值是一个函数名

函数嵌套

   函数内包着函数

实现import time

def timmer(func): #func=test
    def wrapper():
        # print(func)
        start_time=time.time()
        res = func() #就是在运行test()
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
     return res
return wrapper @timmer #test=timmer(test) def test(): time.sleep(3) print('test函数运行完毕')
return 'test的返回值'

res=test()
print(res)
# res=timmer(test) #返回的是wrapper的地址 # res() #执行的是wrapper() # test=timmer(test) #返回的是wrapper的地址 # test() #执行的是wrapper() # @timmer 就相当于 test=timmer(test)

 

  

转载于:https://www.cnblogs.com/roygood/p/9719823.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以解释一下Python的迭代器、生成器装饰器。 迭代器是一种Python对象,它可以遍历序列、集合或其他可迭代对象。我们可以把像列表、元组、字符串这些可以迭代的对象称为可迭代对象。一个迭代器必须实现两个方法:__iter__()和__next__()。其中,__iter__()方法返回迭代器对象本身,__next__()方法返回序列中下一个对象,当没有更多的元素时,它会引发一个StopIteration的异常。 生成器也是一种Python对象,它是实现迭代器的一个更加简单的方法。Python中,生成器可以使用yield语句来定义,它可以像函数一样被调用,但是每次返回时,它会记住它的状态,以便下一次从它离开的位置继续执行。即,生成器会自动实现__iter__()和__next__()方法,不需要手动去实现。比如,我们可以实现一个生成斐波那契数列的函数: def fib(n): a = 0 b = 1 for i in range(n): yield a a, b = b, a+b 这个函数可以用来生成斐波那契数列的前n个数,我们可以这样调用: for i in fib(5): print(i) 这样就可以将前5个斐波那契数列打印出来。 同时也可以创建带参数的生成器函数: def create_gen(x): for i in range(x): yield i gen = create_gen(4) print(next(gen)) print(next(gen)) print(next(gen)) print(next(gen)) 这样我们就可以使用generate来创建一个迭代对象,每次根据yield的结果输出下一个值。 而装饰器则是一种特殊的函数,可以对函数进行增强或修改。它可以在不改变原有函数的情况下对其进行扩展或修改。可以理解为把一个函数,通过在函数定义前加上@decorator的方式,来使用一个函数来对它进行装饰。比如,我们可以定义一个记录函数执行时间的装饰器: import time def timeit(func): def wrapper(): start = time.time() func() end = time.time() print('used:', end-start, 'seconds.') return wrapper @timeit def func1(): time.sleep(1) func1() 当我们使用@timeit来装饰func1函数时,它会自动记录func1函数的执行时间。 这就是Python的迭代器、生成器装饰器,它们不仅能让代码变得更加简洁,同时也能增强Python的编程功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值