首页 > 其他 > 详细

生成器和装饰器

时间:2020-04-24 23:16:03      阅读:61      评论:0      收藏:0      [点我收藏+]

1.生成器(generator)

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

#使用生成器实现求斐波那契数列的第n项:
def Fibonacci(n):
    n,a,b=0,0,1
    while True:
        yield b
        a,b = b,a+b
        n = n+1
#生成器的使用:
res = Fibonacci(10)
next(res)
next(res)
res.__next__()

注意: 生成器中的元素一旦迭代完成以后不能再使用next()或者__next__(),而是要重新构造一个新的生成器。

迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

生成器都是迭代器,但迭代器不一定是生成器!生成器就是一个特殊的迭代器!

2.装饰器

在实际工作中,如果我们需要在某个函数的基础上增加某项功能,最简单的办法就是直接修改该函数的函数体。

但是某些时候函数体的内容是不允许被修改的,这个时候我们就需要使用装饰器在不修改函数体的情况下为某个函数增加新的功能

#使用装饰器计算一个函数的执行时间
def decorator(arg):
    def wrapper():
        start = time.time()
        arg()
        end = time.time()
        print(end-start)
    return wrapper

@decorator
def func():
    print(“hello”)

目标函数带参数的装饰器

import time
def decorator(fun):
    def wrapper(name):
        start = time.time()
        fun(name)
        runtime = time.time()-start
        print(runtime)
    return wrapper
@decorator
def do_something(name):
    for i in range(1000000):
        pass
    print("play game" + name)

do_something("san guo sha")

目标函数带不固定参数的装饰器

import time
def decorator(fun):
    def wrapper(*args,**kwargs):
        start = time.time()
        fun(*args,**kwargs)
        runtime = time.time()-start
        print(runtime)
    return wrapper
@decorator
def do_something(name):
    for i in range(1000000):
        pass
    print("play game" + name)
@decorator
def do_something2(user,name):
    for i in range(1000000):
        pass
    print(user+"play game" + name)

do_something("san guo sha")
do_something2("wang xaio er","san guo sha")

目标函数带不固定参数: 一个装饰器可以修饰多个函数,被修饰的多个函数可能参数的个数会不一定相同(有的目标函数有两个参数,有的可能有3个等),但是仍然需要时使用同一个装饰器。

让装饰器带参数

import time
def decorator(max):
    def _decorator(fun):
        def wrapper(*args,**kwargs):
            start = time.time()
            for i in range(max):
                fun(*args,**kwargs)
            runtime = time.time()-start
            print(runtime)
        return wrapper
    return _decorator
@decorator(2)
def do_something(name):
    for i in range(1000000):
        pass
    print("play game" + name)

do_something("san guo sha")

多个装饰器装饰一个目标函数

def decorator1(arg):
    def wrapper1():
        print(start2)
        arg()
        print(end2)
    return wrapper1

def decorator2(arg):
    def wrapper2():
        print(satart1)
        arg()
        print(end1)
    return wrapper2

@decorator1
@decorator2
def func():
    print("func start")
    print(hello)
    print(func end)
func()

 

生成器和装饰器

原文:https://www.cnblogs.com/-Leif/p/12770564.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!