我偶尔使用Python,有没有办法让这种语法起作用?
import math
print (value1 = math.factorial(5))
这给出了错误:
print (value1 = math.factorial(5)) ^
SyntaxError:语法无效
或者我必须做很长的事情吗?
import math
value1 = math.factorial(5)
print value1
答案 0 :(得分:4)
您无法在表达式中嵌入作业。表达/声明的区别是Python设计的基础,如果你问Guido如何做你想做的事,他会告诉你用两行来做。或者,更好的是,升级另一个级别,看看是否有另一种方法来做你想做的事情。
例如,在表达式中分配变量的最常见原因是简化while
或for
循环。在Python中,您通常只想将其转换为迭代器上的for
循环,而不是从迭代器中获取下一个值的while
或for
循环。
这在Why can't I use an assignment in an expression下的官方Python设计和历史常见问题解答中进行了讨论,它明确地给出了这个例子:
while (line = readline(f)) {
// do something with line
}
for line in f:
# do something with line
常见问题解答还承认,这使得从C和Perl等语言逐行翻译变得更加困难,并解释了为什么这对Python来说是好事而不是消极的。
话虽如此,有些方法可以伪造它,使用闭包或nonlocal
变量。例如:
def set_value1_to(new_value):
global value1
value1 = new_value
return value1
print(set_value1_to(math.factorial(5))
然而,很难想象这是一个正确的解决方案。
答案 1 :(得分:2)
不,Python不允许这样做。赋值只是一个语句,不能嵌入表达式中。
答案 2 :(得分:0)
不,没有。您无法在作业发生时打印作业的结果。
答案 3 :(得分:0)
无法从赋值运算符中提取值,但如果必须在一行中绝对执行,则可以编写一个对象,其setter将存储接收到的值和将其返回:
class AssignExpr(object):
def set(self, value):
self.value = value
return value
assign = AssignExpr()
print assign.set(math.factorial(5))
# result available as assign.value
请注意,这违反了Python的约定,这些约定适用于setter(以及其他类型的mutator,例如set.discard
或list.sort
)以返回None
。
答案 4 :(得分:0)
请注意,如果您要做的只是使用表达式而不将其分配给您永远不会重复使用的变量,那么Python会让您执行print math.factorial(5)
之类的操作。