python闭包,装饰器,生成器
1、 python是动态语言
动态语言(python,javascript,php等):可以在运行过程中修改代码
静态语言(java,C++):编译时已经确定好代码,运行时不可再修改
python可以动态的添加属性,可以使用__slots__这一特殊的变量限制这一行为,指定其类所添加属性名称。如:__slots__ = (“name”,”age”)其实例只允许添加这两个属性
2、 生成器(generator)
创建生成器
1)G = (x for x inrange(10))
可以通过next()方法获得生成器的下一个返回值。如:G.next()
2)通过函数和关键字yield创建
def fib(times):
n = 0
a = 0
b = 1
while n < times:
yield b
a, b = b, a+b
n+=1
生成器是可迭代对象可以for循环访问,也可以用__next()__()方法使用。如f=fib(5),可以使用f.__next__()一个一个生成数据
send()与 __next__() 一样都是从停下的地方开始运行直到原地,不同的是send的传的值相当于yield i语句返回的,如果用 __next__()则没有返回值
生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变
3、 迭代器
可迭代对象
可以直接作用于 for 循环的对象统称为可迭代对象: Iterable
如:list, tuple, dict,str, set, generator
迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
可以使用isinstance()方法判断一个对象是否是 Iterator 对象
把 list、dict 、str 等 Iterable 变成 Iterator 可以使用iter()方法
生成器和迭代器区别:
迭代器可以不止一遍的生成数据,生成器只能生成一遍数据
4、 闭包
闭包:在一个内部函数中,对外部函数的变量的引用。称内部函数为闭包
deffunx(x):
deffuny(y):
returnx * y
returnfuny
调用方式:
i=funx(8)
i(5)
或
funx(4)(5)
通过关键字nonlocal可以使得内部函数调用外部函数变量。
deffun1():
x=5
deffun2():
nonlocalx
x*=x
returnx
returnfun2()
5、 装饰器
单个装饰器
# coding:utf-8
def check_login(fun):
definner():
print'正在验证权限'
ifTrue:
fun()
else:
print'你没有权限'
return inner
@check_login #这一步就相当于test = check_login(test)
def test():
print '登录成功后执行action'
if __name__ =="__main__":
test()
执行check_login函数 ,并将 @check_login下面的函数作为check_login函数的参数,即:@check_login等价于check_login (test)
多个装饰器一般从离函数越近越先开始装饰
在装饰器装饰有参函数的时候闭包内函数需设置参数
在闭包内可用 *agrs , **mak 通用承参数(怎么传怎么用)
装饰器装饰带返回值得函数:在闭包内调用该函数需接收返回过来的值
6、==, is
is是比较两个引用是否指向同一个对象
== 判断两个对象是否相等
7、 深拷贝,浅拷贝
浅拷贝:仅仅拷贝地址
深拷贝:相当于新开辟一块内存空间拷贝其值
如:
浅拷贝:a = b
深拷贝:
Importcopy
a =copy.deepcopy(b)
可用id() ,append()方法查看其区别
在copy模块中的copy功能在拷贝数据时会根据数据的可变或不可变类型有不同的处理方式
8、 属性property
class Test(object):
def __init__(self):
self.__num = 0
def setNum(self,value):
self.__num = value
def getNum(self):
return self.__num
num = property(getNum, setNum)
t = Test()
t.num = 5
print t.num
私有属性设置的魔法方法