一, 函数名的应用
函数名是一个特殊的变量, 函数名配合括号 (函数名 ()) 可以执行函数.
1. 函数名的内存地址.
- def func():
- print("呵呵")
- print(func)
结果:
<function func at 0x1101e4ea0>
2. 函数名可以赋值给其他变量, 该变量配合括号即可调用函数.
- def func():
- print("呵呵")
- a = func
- a() # 相当于调用 func()
3. 可以作为 list 的元素, for 循环调用.
- def func1():
- print("你好")
- def func2():
- print("我好")
- def func3():
- print("他好")
- lst = [func1,func2,func3]
- for el in lst:
- el()
4. 函数名可以作为函数的参数.
- def func1():
- print("小黑人")
- def func2(fn): #func1 作为 func2 的参数
- fn()
- func2(func1)
5. 函数名可以作为函数的返回值.
- def func_1():
- print("函数 1")
- def func_2():
- print("函数 2")
- return func_2
- fn = func_1() #func1 执行完毕后返回 func2, 赋值给 fn.
- fn() #fn 配合括号即可执行 func2 函数, 这样就可以在函数外面调用内部函数.
二, 闭包
闭包就是内层函数, 对外层函数 (非全局) 变量的引用.(内存函数对外层函数局部变量的访问)
- def func1():
- name = "小黑人"
- def func2():
- print(name) # 闭包, func2 引用了 func1 中的变量.
- func2()
- func1()
结果:
小黑人
可以使用_ _closure_ _监测函数是否为闭包, 返回 cell 就是闭包, 返回 None 就不是闭包.
- def func1():
- name = "小黑人"
- def func2():
- print(name) # 闭包
- func2()
- print(func2.__closure__)
- func1()
结果:
小黑人
(<cell at 0x0000025B7957D798: str object at 0x0000025B7955BE10>,)
注: print(func2.__closure__) 一定要写函数内部, 即 func1 函数里面, 如果写到外面会报错.
闭包优点:
1. 安全, 别的用户不可以更改. 如定义一个全局变量, 在函数中使用 global 即可修改这个全局变量, 不安全.
2. 外层函数中的变量常驻内存, 方便函数外部调用. 同时可以避免函数多次调用时的加载时间, 如爬虫信息量大时.
来源: http://www.bubuko.com/infodetail-3133030.html