2013-07-04 133 views
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) 

,但有沒有可能做到這一點的一條線,沒有通列表,方法參數?

+5

首先,不建議用'list'作爲名稱來聲明一個變量,因爲這將覆蓋內建'list'類。因爲,你希望'list'的內容用'second_value'更新,那麼你必須把這個'list'作爲輸入傳遞給函數,或者你必須訪問函數中的全局值。由於列表對象是作爲對象傳遞給函數的,因此可以使用列表的'.append'函數來更新最新的元素,這也將反映在模塊名稱空間中。使用'.append',你可以簡單地從函數 – Nakamura

+0

@rogaos返回'first_value':上面的事情適用於在非常複雜的模擬中多次調用的小方法,所以我正在尋找簡單和短小的解決方案 –

+0

@Nakamura:你說得對,在示例中使用保留名是有壞習慣的(例如命名列表爲'list') –

回答

1

你能在列表中返回第二個值?

像這樣:

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

真的,不過,你不妨第二返回值賦給一箇中間變量,只是使用list.append(),使用兩行。

0

不是沒有調用該函數兩次:

>>> L = [] 
>>> def foo(): 
...  return 1, 2 
... 
>>> myvar, L = foo()[0], L+[foo()[1]] 
>>> myvar 
1 
>>> L 
[2] 
1

如果你真的想要的話,你也可以繼承列表和使這樣的事情:

>>> 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] 
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] 
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] 

這滿足,它應該是一個班輪的要求,但它似乎很醜陋的我。

我更喜歡使用裝飾器的想法。