我想写一种CPS代码的高级函数。他们应该获取一个函数代码,将其封装在对象中,并添加组合这些对象的方法。在
像这样:
myFunction=MyFunction(
a = b+c
print(c)
return a)
但是对于匿名函数只有一个python表达式-lambda语句。它不太合身。在
Python是一种功能强大的语言,它有不同的表达式:decorators、eval等。。。有没有一种好方法可以像上面提到的例子那样编写匿名函数?在
另一种方法是使用诸如一元bind和return之类的特殊函数和其他用于编写复杂表达式的高阶函数来扩展lambda表达式。在
主要目的是创建自定义抛出控件表达式。在
^{pr2}$其用法如下:
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
在Python中,使用
lambda
关键字,只能生成一个对单个表达式求值并返回结果的函数对象。要使用语句或具有多行的函数,必须使用def
关键字,它需要名称。在对
lambda
进行限制的原因主要是因为Python将行尾视为一件重要的事情:No Multiline Lambda in Python: Why not?
不过,名字并不重要。您可以制定一个约定,每个“匿名”函数都将用名称
anon
或其他名称来定义。如果你真的在乎,你可以抹去名字的所有痕迹:因此,对于函数式编程,Python可以创建一流的函数对象,传递它们等等。Python不能做的一件事就是创建一个从来没有名字的复杂函数对象,但这确实没有任何理由重要。在
我有一个hack,这确实是唯一合适的术语,它使用嵌套函数来提供多行lambda可能提供的功能。您可以查看我的GitHub存储库here。在
基本上可以让你做喜欢的事情:
或者更多的匿名函数:
^{pr2}$这种方法显然有一些局限性;例如,我还没有找到一种方法来实现更复杂的缩进结构,如},但这又是一种非常廉价的方法。在
if
或{使用lambda的w.r.t Python没有任何优势。Lambda函数和匿名函数通常用于简单函数,如果需要更复杂的多行函数,则编写命名函数更具可读性。在
由于函数是第一类对象,您可以简单地定义它,将其分配给一个变量,然后使用它并传递它。 除非您需要一个可以选择lambda函数的一次性简单函数,否则命名函数是最合适的。尽管如此,在从来没有完全的Python中使用lambda。在
回到你的例子
在Python中,编写类似于
^{pr2}$然后将它作为
MyFunction
传递给您的代码,这很像python。我在Javascripts中看到过回调是匿名编写的。但是每种语言都有自己的哲学,Python的哲学是可读性。在可读性计数。
相关问题 更多 >
编程相关推荐