在Python函数中定义嵌套函数

2019年9月20日 / 10次阅读 / Last Modified 2019年9月21日
语法

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

本文链接:https://www.pynote.net/archives/1178

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top