当前位置: 首页 > 面试题库 >

Python避免使用lambda作为需要两个可调用对象的键(函数组合)

暴德运
2023-03-14
问题内容

我正在研究项目欧拉问题14,并且第一次尝试提出了这种蛮力解决方案:

def collatz(n, memo={1: [1]}):
    if n not in memo:
        memo[n] = [n] + collatz(3 * n + 1 if n % 2 else n // 2)
    return memo[n]

def p014():
    return max(xrange(1, 10**6), key=lambda n: len(collatz(n)))

我的问题是关于那个lambda的,我通常不愿意使用它们,但是在这种情况下,我不知道有什么优雅的方法来避免使用它。是否存在functools将两个可调用对象链接起来的东西或其他东西,或者我缺少的其他任何巧妙的选择?


问题答案:

如果有一个compose功能的话-
也许在里面会很可爱functools。没有,我也不指望会有,唉。用Raymond
Hettinger的话来说,

先前已在其他论坛中进行了讨论和拒绝。问题之一是通常的数学顺序是不直观的,并且不能自我证明-即compose(f,g)
f(g(x))g(f(x))?相同。此外,它已经是污垢容易创建自己构建功能,或者直接做组成: h = lambda x: f(g(x))

这里有两个简单的实现方式的compose一个可调用的类,可能对你有用,但:

# Scott Daniels, http://code.activestate.com/recipes/52902-function-composition/
# Lightly edited for style.
class Compose(object):
    '''Compose functions. compose(f,g,x...)(y...) = f(g(y...),x...))'''
    def __init__(self, f, g, *args, **kwargs):
        self.f = f
        self.g = g
        self.pending = args[:]
        self.kwargs = kwargs.copy()

    def __call__(self, *args, **kwargs):
        return self.f(self.g(*args, **kwargs), *self.pending, **self.kwargs)


class Starcompose:
    '''Compose functions. Starcompose(f,g,x...)(y...) = f(*g(y...),x...))'''
    TupleType = type(())

    def __init__(self, f, g, *args, **kwargs):
        self.f = f
        self.g = g
        self.pending = args[:]
        self.kwargs = kwargs.copy()

    def __call__(self, *args, **kwargs):
        mid = self.g(*args, **kwargs)
        if isinstance(mid, self.TupleType):
            return self.f(*(mid + self.pending), **self.kwargs)
        return self.f(mid, *self.pending, **self.kwargs)

另外,请参阅该functional软件包,它启发compose_many了我的这个非常简单的功能:

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

def compose_many(*funcs):
    return reduce(compose, funcs)


 类似资料:
  • 问题内容: 我想将某些对象存储在HashMap中。问题是,通常您只使用一个对象作为键。(例如,您可以使用字符串。)要使用多个对象,我想这样做。例如,一个类和一个字符串。有没有简单干净的方法来实现这一目标? 问题答案: 您的密钥必须实现hashCode和equals。如果它是 SortedMap ,则还必须实现Comparable接口

  • 问题内容: 我正在研究PHP的转换机制,并且在将数组转换为对象时遇到了一个奇怪的情况 据我了解,PHP属性必须使用与PHP变量相同的规则声明。也就是说,有效的变量名称以字母或下划线开头,后跟任意数量的字母,数字或下划线。但是,上面的代码产生以下输出 当您尝试访问对象中的信息时,它真正变得很奇怪。 无论如何,是否可以获得对象中var_dump报告的信息,还是只是在请求生命周期的剩余时间内被锁定了?(

  • 垃圾回收期在管理内存方面非常出色,它非常高效地移除不再使用的对象。但是无论你如何看待它,分配和销毁一个基于堆内存的对象花费处理器时间比分配和销毁不是基于堆内存的对象要多。在函数内创建大量的引用类型对象会引入严重的性能消耗问题。 所以不能让垃圾回收器超负荷工作。你可以借鉴一些简单的技巧最小化垃圾回收器的工作。所有的引用类型对象,即使是局部变量,都被分配存储在堆内存上。每个引用类型的局部变量在函数结束

  • 我需要制作两个lambda函数,一个用参数调用另一个,被调用的函数将参数打印出来。我很难让它工作:第一个函数: 请告知我应该在被调用函数中输入什么代码才能接收参数“hello Jenny”?非常感谢。

  • 现在假设我有许多动物子类,我将连续得到许多“else if...” 我的问题是:有没有办法避免这种情况?我已经尝试使用一个接口(动物->接口、狗、猫等实现动物),但是在我的项目中,数组必须是可克隆的,如果动物是一个接口,你就不能克隆一个数组“动物[]ArrayOfAnimals”(该数组中的对象将不会被克隆)

  • 问题内容: 我有两个数组: 阵列1: 和数组2: 我需要基于合并这两个数组,并获得此: 我如何在不迭代低谷的情况下做到这一点? 问题答案: 你可以这样- 如果和的顺序不同,请使用以下代码: 如果和以相同的顺序使用