Base
def func_A(name = 'YaSuo'):
return 'func_A name : ' + name
f_a_name = func_A
del func_A # 删除函数名会提示未定义,
# print func_A() # NameError: name 'func_A' is not defined #
# 函数名被一个变量接住,就算删除函数名,打印变量加上括号,依旧成功打印
print f_a_name()
嵌套函数——base
- 调用func_master() 时,其他的 func_01(),func_02()同时被调用。
- 无法在func_master 函数外单独调用func_01(),func_02()
def func_master(name = 'Master'):
print 'inside master func()'
def func_01():
return 'func_01 is here'
def func_02():
return 'func_02 is here'
print func_01()
print func_02()
print 'back master'
func_master()
output:
inside master func()
func_01 is here
func_02 is here
back master
函数中返回函数
- 当你把一对小括号放在后面,这个函数就会执行
- 然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它
def func_master(name = 'Master'):
def func_01():
return 'func_01 is here'
def func_02():
return 'func_02 is here'
if name == 'Master':
return func_01
else:
return func_02
a = func_master()
# 无括号, 不执行,只赋值传递
print a
# 有括号, 执行
print a()
output:
<function func_01 at 0x000001C443220358> #赋值传递,没有传递
func_01 is here # 执行了
b = func_master(name = 'all')
print b
print func_master()
print func_master()()
output:
<function func_02 at 0x000001C443220358> # 修改了name ,func_02 赋值给了 b
<function func_01 at 0x000001C4432203C8> # func_master() 里面的是默认参数,返回函数func_01
func_01 is here # func_master() 里面的是默认参数,但是多跟了一个括号表示执行函数func_01()
将函数作为参数传给另一个函数
def masterBeforeDef():
return "before Master!"
def masterAfterDef():
return "after Master!"
# 这里可变参数是func
def doSomethingBeforeHi(*func_01):
print(masterBeforeDef)
print("I am doing some boring work before executing masterDef()")
print(masterAfterDef)
print doSomethingBeforeHi(masterBeforeDef, masterAfterDef)
output:
<function masterBeforeDef at 0x000001C4432205F8> # Before func
I am doing some boring work before executing masterDef() # 当前的func
<function masterAfterDef at 0x000001C443220208> # after func
None
装饰器用法的一些自我总结问题
def new_decorator(func_01):
def wrapper_func():
print'before'
# 去掉(), 没有调用里面的,所以在func_master;有() 调用了函数,所以在 fun_
print func_01()
print 'after'
return 'A'
return wrapper_func
@new_decorator
def func_master():
def fun_():
return [1,2]
return fun_
# func_master = new_decorator(func_master)
print func_master # 这里没有跟括号调用,等于上面的注释
output:
<function wrapper_func at 0x000001C4432207B8>
# func_master = new_decorator(func_master())
print func_master() # 这里加了括号调用, 等于上面的注释
output:
before
<function fun_ at 0x000001C4432207B8>
after
A