我想编写一种CPS代码高级功能。他们应该采用功能代码,将其封装在对象中,并添加用于组合该对象的方法。
像这样:
myFunction=MyFunction(
a = b+c
print(c)
return a)
但是匿名函数只有一个pythonic表达式-lambda语句。它不太适合。
Python是一种功能强大的语言,它具有不同的表达方式:装饰器,eval等。是否有编写上述示例中所述的匿名函数的好方法?
另一种方法是使用特殊功能扩展lambda表达式,例如monadic bind和return,以及其他用于单行编写复杂表达式的高阶函数。
主要目的是创建自定义的抛出控制表达式。
class TimeoutExpression:
def __init__(self,name,function,timeout):
...
def eval(self):
""" eval functions, print result and error message
if functions failed to calculate in time """
...
def andThen(self,otherExpression):
""" create complex sequential expression"
...
def __call__(self):
...
它的使用方式如下:
TimeoutExpression( time consuming calculation ).andThen(
file object access).andThen(
other timer consuming calcualtion )
创建自定义控制流构造的最佳python惯用方式是什么?
我已经阅读了以下讨论:How to make an anonymous function in Python without Christening it?
提到了几种使用相同方法的决策:从三重引用字符串生成函数。
虽然绝对正确地表现,但似乎很麻烦。这是目前设计的最佳方法吗?
更新:
有人告诉我没有问题,python允许您在任何上下文中使用def。我假设我的python经验欺骗了我,并尝试按照建议在任何范围内使用def。我有一个错误。我应该如何准确地将def放在任何上下文中?
def compose(f):
return lambda k: lambda x: f(k(x))
test = compose( def sqr(x) :
print ("sqr "+str(x))
return x*x
return sqr) ( def x2(x):
print("x2 "+str(x))
return x*2
return x2 )
错误:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "anonFunction.py", line 4
test = compose( def sqr(x) :
^
SyntaxError: invalid syntax
最佳答案
使用lambda的w.r.t Python没有任何优势。 Lambda和Anonymous函数通常用于简单函数,如果需要更复杂的多行函数,则编写命名函数的可读性更高。
由于Function是一流的对象,因此您可以简单地定义它,将其分配给变量,使用它并传递它。
除非您另外需要一个简单的函数以选择lambda函数,否则命名函数是有利的。尽管如此,在从未有过的Python语言中也使用了lambda。
回到你的例子,
myFunction=MyFunction(
a = b+c
print(c)
return a)
在Python中,其编写方式与
def MyFunction:
a =b + c
print c
return a
然后将其作为
MyFunction
传递给您的代码是相当Python风格的。我已经在Javascript中看到了将回调写为匿名的代码。但是每种语言都有自己的哲学,Python的哲学是可读性。---可读性很重要。
关于python - 更多功能的python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10235074/