兄弟们,Python函数基础已经搞完,准备开始面向对象了,加油吧程序猿!
#函数的引用
# def test():
# print('---in test func---')
# test() #调用函数
# res=test #理解为变量的赋值
# print(id(res))
# print(id(test))
# 闭包
# 闭包是函数内部定义的函数
# 1)闭包是嵌套在函数中的函数
# 2)闭包必须是内层函数对外层函数变量(非全局变量)的引用
# 构成条件
# 1)函数中的嵌套一个函数
# 2)内层嵌套函数,对外部作用域有一个非全局变量的引用
# 3)外层函数的返回值是内存函数的函数名
# def outF():
# sum=n
# def inF(n):
# return sum+1
# return inF #外层函数的返回值是内存函数的函数名
def outer_func():
message = "Hello"
def inner_func():
print(message)
return inner_func
l=outer_func
l()
# 闭包的作用:
# 保存局部信息不被销毁,保存数据的案例性
# 闭包的应用:
# 1)可以保存一些非全局变量但是不易被销毁,改变的数据
# 2)装饰器
# 3)实现数据锁定
# 函数的嵌套
# def outer():
# n=10
# def inner():
# n=20
# print('inner函数',n)
# print('outer的函数',n)
# inner()
# outer()
# 改成闭包形式
# def outer(m):
# n=10
# def inner():
# print('inner函数',m+n)
# return inner
# me=outer(200)
me()
# 修改外部函数中的变量
# def outer(a):
# def inner():
# nonlocal a
# a+=1
# print('a的值为',a)
# return inner
# m=outer(2)
# m()
# 装饰器 本质是一个闭包函数,
# 装饰器的使用方法:
# 1.先定义一个装饰函数(帽子)(也可以用类偏函数实现)
# 2.再定义你的业务函数或者类(人)--这是真正要执行的
# 3.最后把这顶帽子带在这个人头上
# 装饰器的模板
# def wrapper(func):
# def inner(*args,**kwargs):
# res=func(*args,**kwargs)
# return res
# return inner
# 日志打印器
def logger(func: object) -> object:
def wrapper(*args):
print('我准备开始计算:{}函数了:'.format(func.__name__))
# 真正执行的业务函数
func(*args)
print('计算完了,给自己加个鸡腿 ')
return wrapper
# 第一种方法
@logger #语法糖
def add(x,y):
print('{}+{}={}'.format(x,y,x+y))
# 使用装饰器来装饰函数
# 把函数名add作为参数传入到装饰函数--装饰功能本质
# 第一种方法
# te=logger(add)
# te(100,50)
# 第二种方法
add(200,100)
# 为什么不使用函数的封装,给它添加额外功能,而要使用装饰器?
# 因为装饰器可以实现代码的复用
@logger
def foo():
print('this is for you higui')
foo()
# 装饰器的参数
# 1.被装饰的函数无参数logger()
# 2.被装饰函数有参数logger(a,b)
# 3.被装饰函数有不定长的参数logger(*agrs),logger(*args)
# 回调函数
def test3(m,n):
if m==2:
n()
def one():
print('hanhusy')
def two():
print('hanshuer')
test3(1,one)