一、装饰器
装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(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/
原文地址:https://www.cnblogs.com/LyShark/p/9139266.html
时间: 2024-10-12 06:37:21