2013-04-28 151 views
1

我似乎做了很多(不管是不是我應該或許是另一個話題)在我的Python代碼:爲*鑄造Python的分配速記*

the_list = get_list_generator() 
#So `the_list` is a generator object right now 

#Iterate the generator pulling the list into memory 
the_list = list(the_list) 

在做算術作業,我們有速記像這樣...

the_number += 1 

那麼,有什麼方法可以在使用函數進行賦值時完成相同的速記。我不知道是否有一個內置的,或者如果我需要定義一個自定義操作符(我從來沒有這樣做過),或者其他方式,最終導致更清潔的代碼(我保證我會只用於泛型類型轉換)。

#Maybe using a custom operator ? 
the_list @= list() 
#Same as above, `the_list` was a generator, but is a list after this line 

編輯::

我沒有最初提及:這發生在我身上最經常在交互模式(因此爲什麼我希望削減所需打字)。我會嘗試索引一個迭代器gen_obj[3],得到一個錯誤,然後必須施放它。

如所暗示的,這可能是最好的,但最終不是我所期待的。

the_list = list(get_list_generator()) 
+7

怎麼樣'the_list =名單(get_list_generator())'? – 2013-04-28 19:14:33

回答

1

沒有將迭代器轉換爲列表的語法快捷方式。所以只是運行list(it)是慣例。

如果您需要的是隻檢查的結果,使用取()配方從itertools模塊裏:

def take(n, iterable): 
    "Return first n items of the iterable as a list" 
    return list(islice(iterable, n)) 

這配方效果特別好,當底層迭代器是漫長的,無限的,還是貴計算。

+0

對於我的交互式場景來說,這實際上相當不錯,我很少想要將整個迭代轉換爲列表。經過一些測試後,我發現它非常容忍輸入。它會處理列表和迭代器(所以我不必付出太多的關注),並且似乎沒有抱怨如果範圍是錯誤的(它只是返回空列表)。因此,爲了保持我的交互式歷史日誌清潔,這個技巧就是了(我會馬上把它稱爲通常避免我原來需要第二次重新分配)。 – user2097818 2013-04-28 20:59:14

1

沒有

增強分配只能由結合運營assignement工作。 list(...)功能調用而不是操作員。您可以找到可能的擴充作業清單here

如果您想避免執行兩個作業,請立即撥打list

1

也許你可以去一個不同的方式:如果你有,你想返回一個list發電機功能

,你可以裝點它。

def apply(after): 
    import functools 
    "Apply a function to the result of a function call." 
    def decorator(func): 
     @wraps(func) 
     def wrapper(*a, **k): 
      return after(func(*a, **k)) 
     return wrapper 
    return decorator 

之後,你有這個功能,你可以用這種方式:

@apply(list) 
def get_list_generator(n): 
    yield n 

l = get_list_generator(12) 
+0

在交互模式下使用時,這需要更多的深思熟慮,但仍然非常靈活,快速應用,而且絕對是我原先想到的*速記類型。 – user2097818 2013-04-28 21:11:58