《Python运维开发之路》 装饰器&生成器&迭代器

Posted lyshark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Python运维开发之路》 装饰器&生成器&迭代器相关的知识,希望对你有一定的参考价值。

一、装饰器

 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大。装饰器一般接受一个函数对象作为参数,以对其进行增强      说白了:就相当于C++中的构造函数,与析构函数

 

  • 装饰器本身是一个函数,用于装饰其他函数
  • 装饰器是一个闭包函数是嵌套函数,通过外层函数提供嵌套函数的环境
  • 装饰器在权限控制,增加额外功能如日志,发送邮件用的比较多

 

1,原函数不带参数的装饰器

 假设:我定义了一个函数lyshark,现在想要在不改变原来函数定义的情况下,在函数运行前打印一段话,函数运行后打印另一段话,要实现这样一个功能该怎么实现?看以下实现方式:

>>> import os
>>> import sys
>>> 
>>> def outer(function):
    def inner():
        print("主函数执行前,应先执行我!")
        result=function()
        print("主函数执行后,要执行我!")
        return result
    return inner

# (1) @ + 函数名 直接作用在需要装饰的函数上一行
# (2)自动执行outer函数并且将下面的函数名lyshark()当做参数传递到outer()
# (3)将outer函数的返回值inner,重新赋值给lyshark()函数
>>> @outer

def lyshark():
    print("lyshark 的主函数体,装饰器在装饰我(*^_^*)")
    return "lyshark 返回了"

>>> ret=lyshark()
主函数执行前,应先执行我!
lyshark 的主函数体,装饰器在装饰我(*^_^*)
主函数执行后,要执行我!
>>> 
>>> print("lyshark()函数的返回值: ",ret)
lyshark()函数的返回值:  lyshark 返回了
>>> 

 

2,原函数带一个参数的装饰器

假设:我们在前面的基础上给函数传递一个参数看看,它有啥反应,刺激一下它

>>> import os
>>> import sys
>>> 
>>> def outer(function):
    def inner(args):
        print("主函数执行前,应先执行我!")
        ret=function(args)
        print("主函数执行后,要执行我!")
        return ret
    return inner

>>> @outer

def lyshark(args):
    print(args)
    return "lyshark 返回了"

>>> 
>>> ret=lyshark("hello world!")
主函数执行前,应先执行我!
hello world!
主函数执行后,要执行我!
>>> 
>>> print("lyshark 的返回值是:",ret)
lyshark() 函数的返回值是: lyshark 返回了
>>> 
>>> 

 

3,原函数带两个参数的装饰器

 假设:我们在前面的基础上给函数传递两个参数看看,它有啥反应,刺激一下它

>>> import os
>>> import sys
>>> 
>>> 
>>> def outer(function):
    def inner(x,y):
        print("主函数执行前,应先执行我!")
        ret=function(x,y)
        print("主函数执行后,要执行我!")
        return ret
    return inner

>>> @outer

def lyshark(x,y):
    print(x,y)
    return "lyshark 返回了"

>>> 
>>> ret=lyshark("Hello","LyShark")
主函数执行前,应先执行我!
Hello LyShark
主函数执行后,要执行我!
>>> 
>>> print("lyshark() 函数的返回值是:",ret)
lyshark() 函数的返回值是: lyshark 返回了
>>> 
>>> 

 

4,传递一个万能参数试试

>>> import os
>>> import sys
>>> 
>>> def outer(function):
    def inner(*args,**kwargs):
        print("主函数执行前,应先执行我!")
        ret=function(*args,**kwargs)
        print("主函数执行后,要执行我!")
        return ret
    return inner

>>> 
>>> @outer

def lyshark(*args):
    print(args)
    return "lyshark 返回了"

>>> 
>>> num=[1,2,3,4,5]
>>> ret=lyshark(num)
主函数执行前,应先执行我!
([1, 2, 3, 4, 5],)
主函数执行后,要执行我!
>>> 
>>> print("lyshark() 函数的返回值是:",ret)
lyshark() 函数的返回值是: lyshark 返回了
>>> 
>>> 

 

 

 

二、生成器

  •  跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
  • 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
  • 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
  • 调用一个生成器函数,返回的是一个迭代器对象。

 

 

三、迭代器

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

  • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器有两个基本的方法:iter() 和 next()
  • 字符串,列表或元组对象都可用于创建迭代器。

 

参考文献:http://www.runoob.com/

以上是关于《Python运维开发之路》 装饰器&生成器&迭代器的主要内容,如果未能解决你的问题,请参考以下文章

Python之路,Day4 - Python基础4

python---学习之路

Python之路,Day4

Python之路:迭代器,装饰器,生成器

python之路——第二块(装饰器生成器迭代器)

目录Python自动化开发之路