当前位置: 首页 > 知识库问答 >
问题:

将compose函数从javascript转换为python

公羊绪
2023-03-14

我试图将我的Javascript撰写函数翻译成Python,但我对最后一个有问题。我如何推广未知数量的函数?

读完本文后,我想避免使用reduce()方法。

javascript:

/* compose functions */
const comp1 = (fn2, fn1) => arr       => fn2(fn1(arr))                            // 2 functions, one array
const comp2 = (fn2, fn1) => (...arrs) => fn2(fn1(...arrs))                        // 2 functions, multiple arrays
const comp3 = (...fns)   => (...arrs) => fns.reduceRight((v,f) => f(v), arrs)     // multiple functions, multiple arrays

蟒蛇:

/* compose functions */
comp1 = lambda fn2,fn1: lambda arr:   fn2(fn1(arr))   # 2 functions, 1 array
comp2 = lambda fn2,fn1: lambda *arrs: fn2(fn1(*arrs)) # 2 functions, multiple arrays
comp3 = lambda *fns:    lambda *arrs: ????

感谢所有的改进。。。

共有2个答案

卫阳炎
2023-03-14

这里有一个很好的变量组合,可以帮助从右到左的函数组合——它适用于0、1或更多函数

def identity (x):
  return x

def compose (f = identity, *gs):
  if not gs:
    return f
  else:
    return lambda x: f (compose (*gs) (x))

def double (x):
  return x * 2

def add1 (x):
  return x + 1


# identity (5)    
compose () (5)                            # 5

# print (5)
compose (print) (5)                       # 5

# print (add1 (5))
compose (print, add1) (5)                 # 6

# print (add1 (double (5)))
compose (print, add1, double) (5)         # 11

# print (add1 (double (double (5))))
compose (print, add1, double, double) (5) # 21

要使其支持可变参数,只需更新lambda–粗体更改

def identity (x):
  return x

def compose (f = identity, *gs):
  if not gs:
    return f
  else:
    return lambda *xs: f (compose (*gs) (*xs))

def mult (x,y):
  return x * y

def double (x):
  return mult (2, x)

# print (double (double (mult (2, 3))))
compose (print, double, double, mult) (2,3) # 24
轩辕海
2023-03-14

如果你真的不想使用减少,我相信这是正确的方法,你可以有一个循环。尽管如此,这阻止您使用lambda

def compose(*fns):

    def composed(*args, **kwargs):
        output = fns[-1](*args, **kwargs)
        for fn in reversed(fns[:-1]):
            output = fn(output)

        return output

    return composed

我想再次声明,没有理由不使用减少,因为上面只是减少的具体实现。组成是一种减少。

from functools import reduce # Only required in Python3 where reduce was moved

def compose(f1, f2):
    return lambda *args, **kwargs: f1(f2(*args, **kwargs))

def compose_many(*fns):
    return reduce(compose, fns, lambda x: x)
 类似资料:
  • 我正在尝试将我创建的ImageVector图标(例如,创建为图标Default.Home)添加到Google Maps中的标记中。我目前拥有的是: 我发现,BitmapDescriptorFactory可以通过传递资源或位图(分别是BitmapDescriptorFactory.fromResource(resourceId:Int)和BitmapDescriptorFactory)来创建请求的B

  • 问题内容: 好的,所以我试图用“,”分割字符串,它们不在’[‘或’]’内部。我有一个适用于JavaScript的RegEx,但无法将其转换为Java语法。 JS RegEX: 例句: 它在http://refiddle.com上运行良好,但是当我尝试在Java中(在Eclipse下)使用RegEx时,出现错误消息: 索引10附近的未封闭字符类,(?![^ [] *]) 我所做的就是删除开头的“ /

  • 我有一个R的聚合函数: 我想将这段代码转换成python并获取数据帧。我怎样才能做到?

  • 问题内容: 我有一个包含几个整数的数组。我已经向数组添加了一些值,但是现在我需要通过jQuery的方法将此数组发送到页面。如何将其转换为JSON对象进行发送? 问题答案: 并致电: 注意: _JSON对象现在是大多数现代Web浏览器(IE 8及更高版本)的一部分。

  • 问题内容: 我如何以这种格式转换PHP数组 到以下格式的Javascript数组? 问题答案: 安全声明: 您不再需要以下内容 如果您没有PHP 5.2,则可以使用以下代码:

  • 问题内容: 我正在使用PHP和JavaScript。我的JavaScript代码包含一个函数get_data(): 现在我有以下PHP代码。 如何将JavaScript函数数据分配给PHP变量? 问题答案: 使用jQuery将JavaScript变量发送到您的PHP文件: 在你的PHP代码,让你的变量从与这样的: