python 函数属性的使用场景一

之前看python教程的时候,看到一个内容是:python中任何对象都可以添加属性,包括函数。

当时想,给函数添加属性有什么意义吗?难道把函数当成数据对象去使用?

没想到,今天遇到了一个场景就需要用到这个。

场景如下:

就是求一个给定参数的阿克曼函数(Ackermann的结果是 2 的几次方的问题。比如 ackermann(2,4)的结果将是2的几次方?

函数原型很简单:用python表示也很简单:

def ackermann(i, j):
    if i == 1 and j >= 1:
        return 2 ** j
    elif i >= 2 and j == 1:
        return ackermann(i - 1, 2)
    elif i >= 2 and j >= 2:
        return ackermann(i - 1, ackermann(i, j - 1))

就这么一个简单的函数,但是这样返回的是函数的结果,而不是 2的几次方。当然,拿到这个结果,然后去递归的/2也是可以得到的,但是这个数字太大,以至于,再递归/2的时候,会抛运行异常了。

我原先想着能不能使用闭包去实现。但是我对闭包也不熟悉,尝试了半天无果。我也猜测,这个场景,闭包无法实现。(欢迎指正)

于是,我投机取巧了一下,在原来的代码上面加了一行代码,完成了这个需求。

def ackermann(i, j):
    if i == 1 and j >= 1:
        ackermann.value = j  # 没错,就是加了这一行
        return 2 ** j
    elif i >= 2 and j == 1:
        return ackermann(i - 1, 2)
    elif i >= 2 and j >= 2:
        return ackermann(i - 1, ackermann(i, j - 1))

然后调用的时候,就这样子:

ackermann(2, 4)
print("ackermann(2, 4) -> 结果为2 的 {} 次方".format(ackermann.value))
# 输出如下:ackermann(2, 4) -> 结果为265536 次方

好了,这就是我遇到的python函数属性的一个实际场景了。而且,目前为止,我没有找到除了函数属性之外的方式去实现这个需求(全局变量不算~)。

ps:这种实现方式并不好,因为调用者需要写两句代码,我希望的是,直接返回结果,待优化…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值