所谓在Python函数中定义嵌套函数,就是说在函数中再定义函数,或者说,把一个函数定义在另一个函数的内部。这是Python语言独有的一个特点。有人说这是闭包的一种形式(将内部嵌套定义的函数作为返回值),我个人更喜欢将这个嵌套函数的特性单独提炼出来总结。
函数的嵌套定义,带来一个好处,就是可以实现用函数去封装函数!比如有一个函数A,这个A函数在执行过程中,需要调用BCDE等好几个其它的函数,如果BCDE等这些其它的函数,只有A在调用,我们就完全可以将BCDE等函数的定义,写入A函数的内部。这种就封装了BCED等函数,代码看起来更加优雅简洁!
将BCDE等函数嵌套写入A函数的内部,还有一个好处,BCDE等函数可以直接访问A函数局部空间中的变量。如果BCDE等函数没有嵌套定义到A函数内部,A在调用它们的时候,可能就要传递更多的参数给BCDE等函数,BCDE等函数的返回值可能也会变复杂,甚至还可能会增加全局变量来为他们的交互提供协助。我不反对使用全局变量,该用就用,但是我更喜欢封装。
随便举个例子吧:
def read_aa(table, addr, length):
"""interface for reading A0A2"""
__r_a0 = lambda a,l: comm(b'\xF1\x04\x04'+bytes([a,l])+b'\x00')[3:]
__r_a2 = lambda a,l: comm(b'\xF1\x04\x14'+bytes([a,l])+b'\x00')[3:]
if length <= 32:
if table == 'a0': return __r_a0(addr, length)
if table == 'a2': return __r_a2(addr, length)
recv = b''
left = length
for i in range(0, length-32, 32):
if table == 'a0': recv += __r_a0(addr+i, 32)
if table == 'a2': recv += __r_a2(addr+i, 32)
left -= 32
else:
if table == 'a0': recv += __r_a0(addr+i+32, left)
if table == 'a2': recv += __r_a2(addr+i+32, left)
return recv
read_aa函数内部定义了两个lambda匿名函数,当然,也可以使用def来定义函数,这两个匿名函数只会在read_aa中被调用,而read_aa函数就作为对外提供的唯一接口。
Python的这种嵌套定义的函数,封装了内部嵌套函数的可使用范围,代码整体也更加清爽迷人!没有测试过这种嵌套定义能够深入到多少层,似乎多层的嵌套已经没有太大的意义。
-- EOF --