一,函数名是什么?
函数名是函数的名字,本质:变量,特殊的变量。
函数名()执行此函数
‘‘‘ 在函数的执行(调用)时:打散。 *可迭代对象(str,tuple,list,dict(key))每一个元素添加到args元组中。 **dict 将字典的键值对添加到kwargs字典中。 在函数的定义时: 聚合。 *args将所有的位置参数聚合到一个元组中。 **kwargs 将所有的关键字参数聚合到一个字典中。 ‘‘‘
#python 2 没有nonlocal
1.单独打印函数名
def func1(): print(666) print(func1)
执行输出:#(单独打印函数名为函数的内存地址)
2. 函数名的赋值:
def func2(): print(666) f = func2 print(f())
#说明:这里主要告诉你的是函数名是可以赋值的。这里其实是没有返回值的,所以为None,而666 只是函数体内的print
3. 函数名可以作为容器类数据的元素
案例一:
def f1(): print(1211) def f2(): print(1222) def f3(): print(1233) def f4(): print(1233) f1() f2() f3() f4()
执行后输出:
说明:这里是不是很麻烦呢?这里每一次使用都要写一个函数?这样岂不是还是有重复性的代码呢?
案例二:(这里实现一个最简单的应用)
def f1(): print(1211) def f2(): print(1222) def f3(): print(1233) def f4(): print(1233) l1 = [f1,f2,f3,f4] for i in l1: i()
4 函数名可以作为参数。
def f1(): print(666) def f2(x): x() f2(f1)
解析:
a = 1 def f1(x): #2. 这里这个时候f1(1) print(x) # 3.打印f1的形参 f1(a) #1,将变量a =1 的值 1传入f1中
执行后输出:1
5.函数名可以作为函数的返回值
def f11(x): #2.第二步形参得到实参传入的值为:5
return x #3. 第三步返回给函数调用者 f11(5)
ret = f11(5) # 1.第一步将5传入函数 f11中
print(ret)
#闭包
#闭包:就是内层函数对外层函数(非全局)变量引用
#实例一:将内层函数的666在外层打印出来
def wraaper():
def inner():
print(666)
inner()
wraaper()
#打印后输出:666
#方法二:
def wraaper():
def inner():
print(666)
return inner
wraaper()()
#如何检测闭包
def wraaperl(): name = ‘老男孩‘ def inner(): print(name) inner() print(inner.__closure__) #cell 如何这里i为none 就是不是闭包 # wraaperl()
#如何判断 内层函数名.__closure__ cell 就是闭包
闭包:当函数开始执行时,如果遇到了闭包,他有一个机制,他会永远开辟一个内存空间,将闭包变量等值放入其中,不会随着函数的执行完毕而消失
装饰器的初始:
def add_b(): b = 42 def do_global(): b = 10 print(b) # 1.10 def dd_nonlocal(): nonlocal b b = b + 20 print(b) # 2.30 dd_nonlocal() print(b) # 3.30 do_global() print(b) # 4.42 add_b()