python 之闭包,装饰器,生成器
一。可迭代的对象(也就是可以用for循环,generator 是生成器的意思)
怎么判断是否可迭代呢?通俗的方法建立一个for循环
高大上的方法是:
In [40]: from collections import Iterable In [42]: isinstance("abc",Iterable) ####是不是Iterable创建的实例,如果是就是True,不是则False Out[42]: True In [44]: isinstance(100,Iterable) Out[44]: False
#########################闭包###########################
运行结果:
应用例子:
#################装饰器#########################
下图是装饰器原理图:
完整版:
[root@master gaoji]# cat 02-装饰器.py #!/usr/local/bin/python3 # -*- coding:utf-8 -*- def w(func): def inner(): print('----正在验证权限----') func() return inner @w ## @w等价于f1 = w(f1) def f1(): print('----f1----') @w ## @w等价于f1 = w(f1) def f2(): print('---f2---') #f1 = w(f1) f1() #f2 = w(f2) f2()
运行结果:
[root@master gaoji]# python 02-装饰器.py ----正在验证权限---- ----f1---- ----正在验证权限---- ---f2---
##############两个装饰器###############
[root@master gaoji]# vim 03-装饰器.py 1 #!/usr/local/bin/python3 2 # -*- coding:utf-8 -*- 3 3 4 def makeItaic(func): 1 #!/usr/local/bin/python3 2 # -*- coding:utf-8 -*- 3 4 def makeItaic(func): 5 def inner(): 6 print('--1--') 7 return "<b>" +func() + "</b>" 8 return inner 9 def makeBolt(func): 10 def inner(): 11 print('--2--') 12 return "<i>" +func() + "</i>" 13 return inner 14 15 @makeItaic #test1 = makeItaic(test1) 16 @makeBolt #test1 = makeBolt(test1) 返回值“<i>hello-world-1</i>” 17 def test1(): 18 print('--3--') 19 return 'hello-world-1' 20 21 22 23 print(test1())
结果:
[root@master gaoji]# python3 03-装饰器.py --1-- --2-- --3-- <b><i>hello-world-1</i></b>
流程图:
很重要的一点:装饰器在装饰的函数调用前,就已经装饰好了
装饰是倒着装饰,调用确实从上往下的
##############例子代码##############
1.使用装饰器对无参数的函数进行装饰
def func(functionName): print("---func---1---") def func_in(): print("---func_in---1---") functionName() print("---func_in---2---") print("---func---2---") return func_in @func def test(): print("----test----") #test = func(test) test()
2.使用装饰器对有参数的函数进行装饰
def func(functionName): print("---func---1---") def func_in(a, b):#如果a,b 没有定义,那么会导致16行的调用失败 print("---func_in---1---") functionName(a, b)#如果没有把a,b当做实参进行传递,那么会导致调用12行的函数失败 print("---func_in---2---") print("---func---2---") return func_in @func def test(a, b): print("----test-a=%d,b=%d---"%(a,b)) test(11,22)
3.使用装饰器对有不定长参数的函数进行装饰
def func(functionName): print("---func---1---") def func_in(*args, **kwargs):#采用不定长参数的方式满足所有函数需要参数以及不需要参数的情况 print("---func_in---1---") functionName(*args, **kwargs)#这个地方,需要写*以及**,如果不写的话,那么args是元祖,而kwargs是字典 print("---func_in---2---") print("---func---2---") return func_in @func def test(a, b, c): print("----test-a=%d,b=%d,c=%d---"%(a,b,c)) @func def test2(a, b, c, d): print("----test-a=%d,b=%d,c=%d,d=%d---"%(a,b,c,d)) test(11,22,33) test2(44,55,66,77)
4.使用装饰器对有返回值的函数进行装饰
def func(functionName): print("---func---1---") def func_in(): print("---func_in---1---") ret = functionName() #保存 返回来的haha print("---func_in---2---") return ret #把haha返回岛17行处的调用 print("---func---2---") return func_in @func def test(): print("----test----") return "haha" ret = test() print("test return value is %s"%ret)
5.通用装饰器
def func(functionName): def func_in(*args, **kwargs): print("-----记录日志-----") ret = functionName(*args, **kwargs) return ret return func_in @func def test(): print("----test----") return "haha" @func def test2(): print("----test2---") @func def test3(a): print("-----test3--a=%d--"%a) ret = test() print("test return value is %s"%ret) a = test2() print("test2 return value is %s"%a) test3(11)
6.带有参数的装饰器
def func_arg(arg): def func(functionName): def func_in(): print("---记录日志-arg=%s--"%arg) if arg=="heihei": functionName() functionName() else: functionName() return func_in return func #1. 先执行func_arg("heihei")函数,这个函数return 的结果是func这个函数的引用 #2. @func #3. 使用@func对test进行装饰 @func_arg("heihei") def test(): print("--test--") #带有参数的装饰器,能够起到在运行时,有不同的功能 @func_arg("haha") def test2(): print("--test2--") test() test2()