use*_*400 -1 python functional-programming higher-order-functions
如何实现一个将sum_numbers(2)(3)(4)......(n) 在python 中以下列方式调用的函数?
结果应该是 2+3+4+.....+n
我的提示是因为函数是pythons中的对象,有可能使用嵌套函数来做那些但我不确定.
def sum_number(x):
def sum_number_2(y):
def sum_number_3(z):
....................
def sum_number_n(n)
return n
return sum_number_n
return sum_number_3
return sum_number_2
return sum_number
Run Code Online (Sandbox Code Playgroud)
但是,不是编写这么多嵌套函数,我们应该能够在几个嵌套函数中执行它,以便在以下列方式调用时计算n个值的总和 sum_numbers(2)(3)(4)......(n)
使用Python的数据模型功能将结果转换为所需的类型.
class sum_number(object):
def __init__(self, val):
self.val = val
def __call__(self, val):
self.val += val
return self
def __float__(self):
return float(self.val)
def __int__(self):
return int(self.val)
print '{}'.format(int(sum_number(2)(3)(8)))
print '{}'.format(float(sum_number(2)(3)(8)))
Run Code Online (Sandbox Code Playgroud)
您可以创建一个int可调用的子类:
class sum_numbers (int):
def __new__ (cls, *args, **kwargs):
return super().__new__(cls, *args, **kwargs)
def __call__ (self, val):
return sum_numbers(self + val)
Run Code Online (Sandbox Code Playgroud)
这样,您就可以与普通整数完全兼容(因为该类型的对象是普通整数),因此以下示例有效:
>>> sum_numbers(2)(3)(4)(5)
14
>>> isinstance(sum_numbers(2)(3), int)
True
>>> sum_numbers(2)(3) + 4
9
Run Code Online (Sandbox Code Playgroud)
当然,您可能想要重写其他方法,例如__add__,添加普通整数仍将返回您类型的对象。否则,您必须使用结果调用类型,例如:
>>> sum_numbers(sum_numbers(2)(3) + 5)(6)
16
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |