wim*_*wim 5 python lambda key max
我正在研究项目euler问题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)))
Run Code Online (Sandbox Code Playgroud)
我的问题是关于lambda,我通常不愿意使用它们,但在这种情况下我不知道有什么优雅的方法可以避免它.functools链接两个callables 有什么内容或其他东西,或者我缺少任何其他简洁的替代品?
如果有一个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)
Run Code Online (Sandbox Code Playgroud)
另外,看看这个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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
418 次 |
| 最近记录: |