闭包
def func_out(num1):
def func_inner(num2):
result = num1 + num2
print("结果是:", result)
return func_inner
if __name__ == '__main__':
f = func_out(1)
f(2)
f(3)
闭包的基本使用
def config_name(name):
def say_info(info):
print(name + ": " + info)
return say_info
if __name__ == '__main__':
tom = config_name("Tom")
tom("你好!")
tom("你好, 在吗?")
jerry = config_name("jerry")
jerry("不在, 不和你玩!")
修改闭包内的外部变量
def func_out(num1):
def func_inner(num2):
nonlocal num1
num1 = 10
result = num1 + num2
print("结果是:", result)
print(num1)
func_inner(1)
print(num1)
return func_inner
if __name__ == '__main__':
f = func_out(1)
f(2)
装饰器
def check(fn):
def inner():
print("请先登录....")
fn()
return inner
def comment():
print("发表评论")
comment = check(comment)
comment()
装饰器的语法糖
def check(fn):
print("装饰器函数执行了")
def inner():
print("请先登录....")
fn()
return inner
@check
def comment():
print("发表评论")
装饰器的基本使用
import time
def get_time(func):
def inner():
begin = time.time()
func()
end = time.time()
print("函数执行花费%f" % (end-begin))
return inner
@get_time
def func1():
for i in range(100000):
print(i)
if __name__ == '__main__':
func1()
装饰带有参数的函数
def logging(fn):
def inner(num1, num2):
print("--正在努力计算--")
fn(num1, num2)
return inner
@logging
def sum_num(a, b):
result = a + b
print(result)
if __name__ == '__main__':
sum_num(1, 2)
装饰带有返回值的函数
def logging(fn):
def inner(num1, num2):
print("--正在努力计算--")
result = fn(num1, num2)
return result
return inner
@logging
def sum_num(a, b):
result = a + b
return result
if __name__ == '__main__':
result = sum_num(1, 2)
print(result)
装饰带有不定长的参数
def logging(fn):
def inner(*args, **kwargs):
print("--正在努力计算--")
fn(*args, **kwargs)
return inner
@logging
def sum_num(*args, **kwargs):
result = 0
for value in args:
result += value
for value in kwargs.values():
result += value
print(result)
if __name__ == '__main__':
sum_num(1, 2, a=10)
通用装饰器
def logging(fn):
def inner(*args, **kwargs):
print("--正在努力计算--")
result = fn(*args, **kwargs)
return result
return inner
@logging
def sum_num(*args, **kwargs):
result = 0
for value in args:
result += value
for value in kwargs.values():
result += value
return result
@logging
def subtraction(a, b):
result = a - b
print(result)
if __name__ == '__main__':
result = sum_num(1, 2, a=10)
print(result)
subtraction(4, 2)
多个装饰器的使用
def make_div(func):
"""对被装饰的函数的返回值 div标签"""
def inner(*args, **kwargs):
return "<div>" + func() + "</div>"
return inner
def make_p(func):
"""对被装饰的函数的返回值 p标签"""
def inner(*args, **kwargs):
return "<p>" + func() + "</p>"
return inner
@make_div
@make_p
def content():
return "人生苦短"
if __name__ == '__main__':
result = content()
print(result)
带有参数的装饰器
def logging(flag):
def decorator(fn):
def inner(num1, num2):
if flag == "+":
print("--正在努力加法计算--")
elif flag == "-":
print("--正在努力减法计算--")
result = fn(num1, num2)
return result
return inner
return decorator
@logging("+")
def add(a, b):
result = a + b
return result
@logging("-")
def sub(a, b):
result = a - b
return result
if __name__ == '__main__':
result = add(1, 2)
print(result)
result = sub(1, 2)
print(result)
类装饰器的使用
class Check(object):
def __init__(self, fn):
self.__fn = fn
def __call__(self, *args, **kwargs):
print("请先登陆...")
self.__fn()
@Check
def comment():
print("发表评论")
if __name__ == '__main__':
comment()