Python函数式编程

use*_*519 -1 python functional-programming function

有我的问题:

假设我们有3个函数:f,g,h和以下代码

y = f(x)
a = g(y)
b = h(y)
Run Code Online (Sandbox Code Playgroud)

我想在一行上完成这项工作,例如:

a,b = g(f(x)),h(f(x))
Run Code Online (Sandbox Code Playgroud)

但如果f非常慢(并且没有缓存它的结果),这效率不高

我有一个带发电机的解决方案:

a,b = ((g(y),h(y)) for y in (f(x),)).next()
Run Code Online (Sandbox Code Playgroud)

但这不是很可读

我想做一些这样的事情:

with  f(x) as y: a,b = g(y),h(y)
Run Code Online (Sandbox Code Playgroud)

有没有人有想法?

(这是骗子

y = f(x);a = g(y);b = h(y)
Run Code Online (Sandbox Code Playgroud)

)

码

import time
def f(t): 
    time.sleep(1)
    print 'f called'
    return t

def g(t): return 1

def h(t): return 2

a,b = g(f(x)),h(f(x))
a,b = ((g(y),h(y)) for y in (f(x),)).next()
Run Code Online (Sandbox Code Playgroud)

opq*_*nut 6

使用lambda.TA-DAH !:

>>> def f(a):
...     return a+1
... 
>>> def g(a):
...     return a*2
... 
>>> def h(a):
...     return a*3
... 
>>> (lambda x: (g(x),h(x)))(1)
(2, 3)
>>> (lambda x: (g(x),h(x)))(f(1))
(4, 6)
>>> a,b=(lambda x: (g(x),h(x)))(f(1))
>>> a
4
>>> b
6
Run Code Online (Sandbox Code Playgroud)

  • imho,这比旧的`y = f(x)既不短也不易读; a,b = g(y),h(y)`"作弊" (2认同)