闭包和装饰器
在一个函数内部再定义一个函数,并且这个函数用到了外面的函数的变量,那么将这个函数以及用到的一些变量称之为闭包
def test():
print("---1---")
test()
test
注意:一个是调用函数,一个是返回对象的引用,也就是函数的首地址。
test表示是函数,引用信息,引用对象,首地址。
test()表示执行test函数
简单版的闭包
def test(number1):
print("----1--")
def test_in():
print("----test_in---")
print(number1 +100)
print("---3-----")
return test_in
res=test(100) #相当于res=test_in
print("*"*20) #相当于 print(test_in)
res() #相当于test_in
结果是---1---
---3----
**************
---test_in-----
200
#####res(1) 相当于 test_in(1)也就是你在调用test_in(1)的时候传递参数了,但是在定义这个函数的时候确没有定义形参,会报错
def test(number1):
print("----1--")
def test_in(number2):
print("----2---")
print(number1 +number2)
print("---3---")
return test_in
res=test(100)
print("*"*20)
res(1)
res(100)
结果是:----1--
---3----
***********
------2-------
101
------2-----
200
装饰器
生成器是用来生成东西的,装饰器是用来装饰东西的。
重写:
def test1():
print("----1-----")
def test1():
print("-----2----")
test1()
结果是:----2-----
lambda函数
def foo():
print("foo")
foo = lambda x:x+1
foo(2)
结果是3
语法糖
def w1(func):
def inner():
print("验证权限")
func()
return inner
def f1():
print("===f1")
def f2():
print("===f2")
A=w1(f1)
A()
运行结果
验证权限
===f1
def w1(func):
def inner("验证权限")
func()
return inner
@w1
def f1():
print("===f1")
def f2():
print("===f2")
f1()
结果是
验证权限
===f1
def login(func):
def inner():
username = input("name")
password = input("pwd")
if username=="1" and password=="1":
print("登陆成功")
func()
else:
print("登陆失败")
return inner()
@login
def f1():
print("客户是f1")
@login
def f2():
print("f2===============")
f1()
f2()
结果是##########################
name1
pwd1
登陆成功
客户是f1
加粗与倾斜共同装饰:
装饰器的功能:
引入日志,函数执行时间统计,执行函数前预备处理,执行函数后清楚处理,权限校验等场景
# 加粗装饰器
def A(fn):
def aa():
return"<b>"+fn()+"</b>"
return aa
def B(fn):
def aa():
return "<i>"+fn()+"</i>"
return aa
@A
def test1():
return"hello1"
@B
def test2():
return"hello2"
@A
@B
def test3():
return "hello3"
print(test1())
print(test2())
print(test3())
结果是
<b>hello1</b>
<i>hello2</i>
<b><i>hello3</i></b>
装饰器执行的时间分析
def A(func):
print("装饰中")
def inner():
print("验证")
func()
return inner
@A
def aa():
print("----f1")
# aa()
aa被注释掉的时候,打印装饰中,
aa未被注释的情况下打印
装饰中
验证
----f1
def A(func):
print("----f1")
def inner():
print("inner1")
func()
print("inner2")
print("-----f2")
return inner
# def test():
# print("test")
# test = A(test)
# test()
#使用装饰器的形式
@A
def test():
print("-----test")
test()
结果是:
装饰中
----f1
-----f2
inner1
-----test
inner2
想要传递参数的话:
test(11,22),
需要同时def inner(a,b):和func(a,b),
def test(a,b)
print("----%d,%d"%(a,b))
不然会报错
# 装饰器对带有返回值的函数进行装饰
def test():
print("--test--")
return "haha"
res = test()
print("%s"%res)
结果是:
--test--
haha
def func(ff):
print("---func--1")
def func_in():
print("in 1")
ff()
print("in 2")
print("---func--2")
return func_in
@func
def test():
print("---test---")
return "hahah"
res = test()
print("test=%s"%res)
结果是:
---func--1
---func--2
in 1
---test---
in 2
test=None
/////////需要加上
xxx=ff()
return xxx