1

有一些方法可以输出两个变量,例如:

def some_method():
    #some calculations
    return first_value, second_value

现在我想将一行结果放入变量和列表中(放入first_value某个变量并second_value作为新元素添加到列表中)。

我知道我可以做这样的事情:

def some_method(list):
    #some calculations
    return first_value, list+[second_value]

接着:

some_variable, list = some_method(list)

但是有没有机会在一行中做到这一点并且没有传递列表作为方法参数?

4

5 回答 5

1

使用如下函数装饰器来做到这一点:

def remember_history(f):
    l = []
    def wrapper(*args,**kw):
        x,e = f(*args,**kw)
        l.append(e)
        return x,l
    return wrapper

def some_method():
    return 1,2

f = remember_history(some_method)
print f() # 1,[2]
print f() # 1,[2,2]
print f() # 1,[2,2,2]
于 2013-07-04T08:19:37.887 回答
1

如果你真的想要它,你可以继承 list 并做这样的事情:

>>> def f():
...     return 1, 2

>>> class MyList(list):
...     def __setattr__(self, name, value):
...         if name == '_assign_append':
...             self.append(value)
... 

>>> l = MyList()

>>> a, l._assign_append = f()
>>> a
1
>>> l
[2]
>>> b, l._assign_append = f()
>>> a
1
>>> b
1
>>> l
[2, 2]
于 2013-07-04T07:59:41.320 回答
1

你能返回列表中的第二个值吗?

像这样:

>>> L = [1, 2, 3]
>>> def bar():
...     return 'shenanigan', [4]
... 
>>> myVar, L[len(L):] = bar()
>>> L
[1, 2, 3, 4]

不过,实际上,您不妨将第二个返回值分配给一个中间变量,然后使用 list.append(),使用两行。

于 2013-07-04T08:00:23.293 回答
0

并非没有两次调用该函数:

>>> L = []
>>> def foo():
...     return 1, 2
... 
>>> myvar, L = foo()[0], L+[foo()[1]] 
>>> myvar
1
>>> L
[2]
于 2013-07-04T07:46:50.500 回答
0
>>> L = []
>>> def foo():
...     return 1, 2
... 
>>> myvar, _ = tuple(process(i) for process, i in zip((lambda x: x, lambda x: L.append(x)), foo()))
>>> myvar
1
>>> L
[2]

这满足了它应该是单线的要求,但对我来说似乎很丑陋。

我更喜欢使用装饰器的想法。

于 2013-07-04T08:51:33.033 回答