Python 再学习2
迭代器
迭代器是访问集合元素的一种方式。他从集合的第一个元素开始访问,直到访问完集合,只前进不后退。
可迭代对象iterable:
凡是可以返回一个迭代器(iterator)的对象都可称之为可迭代对象
常用的几种:
1、 集合数据类型:如:list、tuple、dict、set、str等
2、 生成器(包括带yield的generator function)
这些都对象可以用于for循环
这里的实际执行为
自定义迭代器
可以被next()调用并不但返回下一个值的称为iterator。
作为迭代器对象,它需要定义它的两个魔术对象:__next__和__iter__;
next返回下一个元素
iter返回迭代器本身
自定义迭代器:
这里f在执行next之后会保存自己内部的状态
闭包:
学术解释:内部函数对外部函数作用域里变量的引用则称内部函数为闭包。
白话解释:在函数内部定义一个函数,并且这个函数用到了外边函数的变量。
注意:python中任何东西都是对象,包括函数。
闭包的作用:
优点:
优化了变量,原来需要类对象完成的工作,闭包就可以搞定了
缺点:
由于引入了外部函数的变量,导致外部函数的局部变量没法及时释放,消耗内存。
装饰器:
什么是装饰器:
在python中的装饰器的使用格式很像java里面的注解,但是两者区别还是很大的。
注解(Annotation):仅提供附加元数据支持,并不能实现任何操作。需要另外的 Scanner 根据元数据执行相应操作。
装饰器(Decorator):仅提供定义劫持,能够对类及其方法的定义,但没有提供任何附加元数据的功能。
定义很拗口,简而言之就是两个东西!
给定一个场景:
一个模块有一个功能f1,
但是功能有权限限定,在使用之前需要检查权限,最简单的方法可以写成:
但是这样就破快了代码的开闭原则。
这样我们可以用装饰器来解决:
python的解释器执行的时候会:
1、 def w1(func) ==> 将w1函数加载到内存
2、 @w1
也就是会会将f1当做函数对象传入到w1中,然后将装饰后的函数对象返回,并再次命名为f1。
自定义修饰器:
无参数
有参数
结果是:
装饰器自带参数:
装饰器作用:
装饰器作用很多,目的是在满足开闭原则的情况下对已有函数进行修饰。
大概可能用到的地方有:
1、 引入日志
2、 函数执行时间统计
3、 执行函数前预备处理
4、 执行函数后的清理
5、 权限校验