python函数的嵌套调用_在Python函数中定义嵌套函数

本文探讨了Python中函数嵌套定义的概念,这是一种将内部使用的辅助函数封装在主函数内部的技巧,以提高代码的组织性和可读性。通过示例解释了如何使用嵌套函数来减少参数传递,避免全局变量,并简化接口。嵌套函数可以访问外部函数的局部变量,增加了代码的灵活性。虽然多层嵌套可能意义不大,但适当的函数封装能显著提升代码的优雅度。
摘要由CSDN通过智能技术生成

所谓在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 --

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值