2012-01-04 69 views
-2

有我的问题:Python的函数式编程

假设我们有3个功能:F,G,H和下面的代码

y = f(x) 
a = g(y) 
b = h(y) 

我想这样做,在一行上,如:

a,b = g(f(x)),h(f(x)) 

但如果f是非常缓慢的(并且不缓存它的结果)

我甲肝这是效率不高Ë一个解决方案与发电机:

a,b = ((g(y),h(y)) for y in (f(x),)).next() 

但是这不是很可读

我愿做一些事情像:

with f(x) as y: a,b = g(y),h(y) 

有没有人有一个想法?

(这是欺骗

y = f(x);a = g(y);b = h(y) 

代码

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() 
+7

只是使它2行。 – kennytm 2012-01-04 09:26:51

+2

'y = f(x); a,b =(g(y),h(y))'? – Marcin 2012-01-04 09:44:02

+0

你的第一个答案是正确的,但这不是函数式编程。这个问题只是为了好玩并且深入学习python。 – user1129519 2012-01-04 10:04:04

回答

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 
+2

imho,这个既不短也不可读,比旧的'y = f(x); a,b = g(y),h(y)''作弊“ – joaquin 2012-01-04 10:04:19

+0

当然不是,但它是对这个问题的回答:) – opqdonut 2012-01-04 11:41:49

+0

耶和一个有趣的,这就是为什么我没有donwvoted它。我只是一个评论(关于这个事实,通常更习惯的方式也是最简单的方式) – joaquin 2012-01-04 11:50:47

3

我可能错过了点,在这里,但我认为没有错

y = f(x); a,b = (g(y), h(y)) 

如果你在你的代码执行此操作时往往不够,功能和简单易用你以后,那么也许你可以创建一个效用函数参数映射到的功能列表:

def xmap(v, f_iter): 
    "Subjects v to every function in f_iter and returns a list of results" 
    return [f(v) for f in f_iter] 

你可以再做:

a, b = xmap(f(x), [g, h]) 

map成语是公知的所以这种方法可以说是可读和完全可以理解的,即xmap()就像map()但与指定参数和funcs中换位

+0

你的第一个答案是正确的,但这不是函数式编程。这个问题只是为了好玩并且深入学习python。 – user1129519 2012-01-04 10:00:07

+1

@ user1129519不够公平。请问为什么你要用Python做函数式编程?如果你在学习Python,你不应该专注于Pythonic成语而不是其他范式吗? – 2012-01-04 10:04:42

+0

Python支持多种编程范例,主要但不限于面向对象,命令式,以及函数式编程风格(wikipaedia) – joaquin 2012-01-04 10:13:30

1

如果你想使用with语句,可以,只是装饰用f()contextlib.contextmanager从它产生:

from contextlib import contextmanager 

@contextmanager 
def f(t): 
    time.sleep(1) 
    print 'f called' 
    yield t 

with f(1) as y: 
    a, b = g(y), h(y) 
+0

谢谢你让我发现新的python功能... – user1129519 2012-01-04 10:51:35