在Python中应该用什么替代表达式中的赋值?

3 投票
9 回答
4563 浏览
提问于 2025-04-15 14:46

根据这个页面的说法,代码中不能使用像下面这样的赋值方式:

if variable = something():
#do something with variable, whose value is the result of something() and is true

所以如果我想要有以下的代码结构:

if a = something():
#do something with a
elif a = somethingelse():
#...
#5 more elifs

在这种情况下,something() 函数的计算量很大(我的意思是,如果第一次调用这个函数后再用它的结果给一个变量赋值是行不通的),那么在 Python 中我应该怎么写呢?是要添加7个变量而不是1个吗?

9 个回答

3

你可以这样做:

a = something()
if a:
    #do something with a
else:
    a = somethingelse()
    if a:
        #...
    else:
        #5 more nested ifs

或者,在一个函数里面,你可以通过在每个匹配的情况下使用一个 return 来限制嵌套的层级:

def f():
    a = something()
    if a:
        #do something with a
        return
    a = somethingelse()
    if a:
        #...
        return
    #5 more ifs
4

还有一种选择,可以让你有更多的灵活性:

# Functions to be tested (can be expanded):
tests = [something, somethingelse, yetsomethingelse, anotherfunction, another]
for i, f in enumerate(tests):
    a = f()
    if a:
        if i == 0:
            # do something with a
        elif 1 <= i <= 3:
            # do something else with a
        else:
            # ...
        break

或者你可以直接和这个函数进行比较:

tests = [something, somethingelse, yetsomethingelse, anotherfunction, another]
for i, f in enumerate(tests):
    a = f()
    if a: break
if not a:
    # no result
elif f == something:
    # ...
elif f == somethingelse:
    # ...

如果有些函数需要传入参数,你可以使用lambda来保持函数的风格:

tests = [lambda: something(args), somethingelse, lambda: something(otherargs)]
for i, f in enumerate(tests):
    a = f()
    if a: break
if not a:
    # no result
elif i == 0:
    # ...
elif i == 1:
    # ...
12

我在2001年遇到过这个问题。当时我正在把一个用C语言写的参考算法转到Python上,因为那个C语言的算法大量使用了赋值和测试的方式,所以我想在初稿中保持类似的结构(然后在确认正确性后再进行重构)。于是我在一本食谱中写了一个食谱(也可以查看这里

class DataHolder(object):
    def set(self, value): self.value = value; return value

所以这个if/elif结构可以变成:

dh = DataHolder()
if dh.set(something()):
  # do something with dh.value
elif dh.set(somethingelse()):
  # ...

DataHolder类可以有很多不同的改进方式(在网上和书中的版本都有这些改进),但这就是主要内容,足以回答你的问题。

撰写回答