2012-09-24 45 views
4

正常方式:是否有某種方式簡單地執行每個元素?

for x in myList: 
    myFunc(x) 

你必須使用一個變量x

使用

map(myFunc,myList) 

,事實上,你必須使用此做出上述工作

list(map(myFunc,myList)) 

那會建立一個列表,我不需要建立一個列表

也許有些人會認爲我這樣做

def func(l): 
    for x in l: 
     .... 

那是另一個話題

是有這樣的事?

every(func,myList) 
+0

你的問題是 - 我怎樣才能執行某個列表中的每個元素的函數?使用'map()'有什麼問題? –

+0

@BurhanKhalid它在內存中建立一個列表(很可能是一個'None'的列表)。 – jamylak

+1

'for'循環(或類似的列表理解)對我來說似乎很簡潔。有時候,儘可能縮短事情比一個好習慣更容易陷入困境。簡潔性對於可讀性來說是有利的,但僅限於一點。自然語言有很多冗餘的原因。 – Steve314

回答

6

「普通道路」絕對是最好的方法,雖然itertools沒有提供消耗不管出於什麼原因,你可能需要它配方:

import collections 
from itertools import islice 

def consume(iterator, n): 
    "Advance the iterator n-steps ahead. If n is none, consume entirely." 
    # Use functions that consume iterators at C speed. 
    if n is None: 
     # feed the entire iterator into a zero-length deque 
     collections.deque(iterator, maxlen=0) 
    else: 
     # advance to the empty slice starting at position n 
     next(islice(iterator, n, n), None) 

這可以用於像:

consume(imap(func, my_list), None) # On python 3 use map 

該函數執行速度最快,因爲它通過使用在C端運行的函數來避免python for循環開銷。

+1

這很好,但它像使用canon在紙上打洞 - 我想知道使用map()時OP的問題是什麼。 –

+0

@BurhanKhalid我回復了你的評論:) – jamylak

+0

代替生成器表達式,你可以使用'itertools.imap'(因爲你已經在使用itertools) –

0

如果你只是想myList進行修改,以包含myFunc(x)myList所有的x那麼你可以嘗試列表理解這也需要一個變量,但不會讓變量泄漏出來的理解的範圍:

myList = [myFunc(x) for x in myList] 

希望幫助

+1

*「這將建立一個列表,我不需要建立一個列表」* – jamylak

3

AFAIK有標準庫中沒有「的foreach」快捷方式,但這樣的事情是很容易實現:

def every(fun, iterable): 
    for i in iterable: 
     fun(i) 
相關問題