功能更强的python

2024-07-02 12:40:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一种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

Tags: 对象方法lambda函数compose代码inreturn
3条回答

在Python中,使用lambda关键字,只能生成一个对单个表达式求值并返回结果的函数对象。要使用语句或具有多行的函数,必须使用def关键字,它需要名称。在

lambda进行限制的原因主要是因为Python将行尾视为一件重要的事情:

No Multiline Lambda in Python: Why not?

不过,名字并不重要。您可以制定一个约定,每个“匿名”函数都将用名称anon或其他名称来定义。如果你真的在乎,你可以抹去名字的所有痕迹:

y = 5
def anon(x):
    return x + y  # note "closure" over the current value of y

myFunction = anon

# if you really care, you can erase all evidence of name "anon"
anon.__name__ = ''  # wipe the record of original name "anon"
del(anon)  # unbind the name "anon"

因此,对于函数式编程,Python可以创建一流的函数对象,传递它们等等。Python不能做的一件事就是创建一个从来没有名字的复杂函数对象,但这确实没有任何理由重要。在

我有一个hack,这确实是唯一合适的术语,它使用嵌套函数来提供多行lambda可能提供的功能。您可以查看我的GitHub存储库here。在

基本上可以让你做喜欢的事情:

fibonacci = f('result = t(a-1)+t(a-2) if a>2 else 1; return result')
fibonacci(6) #Output: 8

或者更多的匿名函数:

^{pr2}$

这种方法显然有一些局限性;例如,我还没有找到一种方法来实现更复杂的缩进结构,如if或{},但这又是一种非常廉价的方法。在

使用lambda的w.r.t Python没有任何优势。Lambda函数和匿名函数通常用于简单函数,如果需要更复杂的多行函数,则编写命名函数更具可读性。在

由于函数是第一类对象,您可以简单地定义它,将其分配给一个变量,然后使用它并传递它。 除非您需要一个可以选择lambda函数的一次性简单函数,否则命名函数是最合适的。尽管如此,在从来没有完全的Python中使用lambda。在

回到你的例子

myFunction=MyFunction(
  a = b+c
  print(c)
  return a)

在Python中,编写类似于

^{pr2}$

然后将它作为MyFunction传递给您的代码,这很像python。我在Javascripts中看到过回调是匿名编写的。但是每种语言都有自己的哲学,Python的哲学是可读性。在

可读性计数。

相关问题 更多 >