StandardML和Haskell等一些(很多?所有?)函数式编程语言都有let ... in ...
形式的表达式,可以创建临时变量,其范围为表达本身。
示例:let a=b*c in a*(a+1)
似乎在Python中没有与此类似的表达式构造。
动机:
例如lambda
函数的主体必须是(一)表达式。不是两个表达。不是声明(赋值是声明而不是表达式)。
此外,在python中编写函数式表达式和一般 one-liners 时,事情很容易变得混乱(参见my answer到Python 2 list comprehension and eval)。
这种结构的重点是避免重复(有时会导致重新计算),例如l[:l.index(a)]+l[l.index(a)+1:]
而不是假设let i=l.index(a) in l[:i]+l[i+1:]
我们如何在python2 / python3中实现类似的语言功能?
答案 0 :(得分:6)
这不是真正惯用的代码,但对于单个表达式,您可以使用您立即调用的lambdas。你的例子看起来像这样:
>>> b, c = 2, 3
>>> (lambda a: a * (a + 1))(b * c)
42
如果这有助于提高可读性,您也可以使用关键字参数来编写:
>>> (lambda a: a * (a + 1))(a=b * c)
42
答案 1 :(得分:0)
您可以通过将临时变量放入可迭代变量然后循环遍历该迭代变量来为您的临时变量模拟较小的范围:
>>> b,c = 2,3
>>> var = [a*(a+1) for a in [b*c]][0]
>>> var
42
这会将单个值b*c
放入list
,然后在理解中循环遍历list
,每个新值由每个元素的某些转换组成。创建的list
长度为一个元素,我们使用[0]
获取其中的第一个元素。如果没有理解,它看起来如下:
>>> b,c = 2,3
>>> var = []
>>> for a in [b*c]:
... var.append(a*(a+1))
...
>>> var = var[0]
>>> var
42