python 表达式中的临时变量
temporary variables in a python expression
一些(很多?全部?)函数式编程语言,如 StandardML and Haskell 有一种形式为 let ... in ...
的表达式类型,可以在表达式本身的范围内创建临时变量。
示例:let a=b*c in a*(a+1)
好像在Python中没有类似这样的表达式构造。
动机:
例如,lambda
函数的主体必须是一个(一个)表达式。不是两个表情。不是语句(赋值是语句而不是表达式)。
此外,在 python 中编写函数表达式和一般 一行 时,事情很容易变得混乱(参见 to )。
这种构造的要点是避免重复(有时会导致重新计算),例如 l[:l.index(a)]+l[l.index(a)+1:]
而不是假设的 let i=l.index(a) in l[:i]+l[i+1:]
我们如何在 python2 / python3 中实现类似的语言功能?
这不是真正地道的代码,但对于单个表达式,您可以使用立即调用的 lambda。您的示例如下所示:
>>> b, c = 2, 3
>>> (lambda a: a * (a + 1))(b * c)
42
如果有助于提高可读性,您也可以使用关键字参数编写此代码:
>>> (lambda a: a * (a + 1))(a=b * c)
42
您可以通过将临时变量放入可迭代对象中然后遍历该可迭代对象来为临时变量模拟较小的范围:
>>> 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
一些(很多?全部?)函数式编程语言,如 StandardML and Haskell 有一种形式为 let ... in ...
的表达式类型,可以在表达式本身的范围内创建临时变量。
示例:let a=b*c in a*(a+1)
好像在Python中没有类似这样的表达式构造。
动机:
例如,lambda
函数的主体必须是一个(一个)表达式。不是两个表情。不是语句(赋值是语句而不是表达式)。
此外,在 python 中编写函数表达式和一般 一行 时,事情很容易变得混乱(参见
这种构造的要点是避免重复(有时会导致重新计算),例如 l[:l.index(a)]+l[l.index(a)+1:]
而不是假设的 let i=l.index(a) in l[:i]+l[i+1:]
我们如何在 python2 / python3 中实现类似的语言功能?
这不是真正地道的代码,但对于单个表达式,您可以使用立即调用的 lambda。您的示例如下所示:
>>> b, c = 2, 3
>>> (lambda a: a * (a + 1))(b * c)
42
如果有助于提高可读性,您也可以使用关键字参数编写此代码:
>>> (lambda a: a * (a + 1))(a=b * c)
42
您可以通过将临时变量放入可迭代对象中然后遍历该可迭代对象来为临时变量模拟较小的范围:
>>> 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