2013-08-18 32 views
51

當我遇到這種情況時,我可以用javascript做到這一點,我總是認爲如果有一個foreach函數,這將是方便。通過的foreach我的意思是這是下面所描述的功能:在Python 3中是否有'foreach'函數?

def foreach(fn,iterable): 
    for x in iterable: 
     fn(x) 

,他們只是做它的每一個元素上並沒有產生或返回的東西,我認爲它應該是一個內置的功能,應該比多快用純Python編寫它,但是我沒有在列表中找到它,或者它只是調用另一個名稱?或者我只是在這裏錯過了一些觀點?

也許我錯了,因爲在Python中調用函數的代價很高,對於這個例子絕對不是一個好習慣。而不是退出循環,功能應該做在側它的身體看起來像下面這樣在許多python的代碼的建議已經提到的循環:

def fn(*args): 
    for x in args: 
     dosomething 

,但我想的foreach仍對兩個事實歡迎基地:

  1. 在正常情況下,人們只是不關心性能
  2. 有時的API不接受迭代的對象,你不能重寫它的來源。
+2

出了什麼問題只是在使用'for'循環? – delnan

+1

這正是「for」的意思。 – user2357112

+0

for循環沒什麼問題,只是爲了方便 – user2003548

回答

20

Python沒有foreach聲明本身。它內置了for循環。

for element in iterable: 
    operate(element) 

如果你真的想,你可以定義自己的foreach功能:

def foreach(function, iterable): 
    for element in iterable: 
     function(element) 

作爲一個側面說明了for element in iterable語法來自the ABC編程語言,Python的影響之一。

+10

如果你這樣做是爲了副作用,而不是爲了映射的結果,那麼以這種方式使用'map'在Python 3中不適用,其中'map'是懶惰的。也就是說,它現在返回一個迭代器,而不是已經計算好的列表。直到迭代結果列表後纔會發生副作用。 –

+0

這是真的,當然也是一個有效的觀點,但問題表明OP可能不關心這種微妙之處。 –

+0

@LaurenceGonsalves謝謝。我編輯了Python 3中的第一個示例。 –

81

我見過的每一個「foreach」(PHP,C#,...)都與python的「for」語句基本相同。

這些都或多或少等價的:

// PHP: 
foreach ($array as $val) { 
    print($val); 
} 

// C# 
foreach (String val in array) { 
    console.writeline(val); 
} 

// Python 
for val in array: 
    print(val) 

所以,是的,有在python 「的foreach」。它被稱爲「for」。

你所描述的是一個「數組映射」功能。這可能與list comprehensions在Python來完成:

names = ['tom', 'john', 'simon'] 

namesCapitalized = [capitalize(n) for n in names] 
+1

它不是map(),因爲map()會累積並返回一個列表,而foreach()不會。如果您正在遍歷一長串項目,則差異可能會非常昂貴。一致認爲()能做到這一點。 – Canuck

+2

我見過這個被稱爲__for-in__循環。 – Vox

3

map最好在大多數情況下,在問題中提到的情況。

E.g.

map(len, ['abcd','abc', 'a']) # 4 3 1 

對於採用多個參數的函數,可以給出更多的參數來映射:

map(pow, [2, 3], [4,2]) # 16 9 

它在python 2返回一個列表。x和在Python 3

迭代器如果您的函數有多個參數和參數都是已經在元組的形式(或因爲Python 2.6的任何迭代器),可以使用itertools.starmap。 (它與你正在尋找的語法非常相似)。它返回一個迭代器。

E.g.

for num in starmap(pow, [(2,3), (3,2)]): 
    print(num) 

給了我們8,9

+1

'map'和'foreach'有不同的含義。'map'返回結果的列表(這意味着創建一個列表,或枚舉結構,或將被消耗的結構,因此不立刻調用),'foreach'呼籲每個項目的功能,忽視了結果。 – njzk2

+0

'Foreach'必須立即返回結果。說創建迭代器而不是foreach是首選的是完全廢話。 –

2

另一個例子

// Python Foreach Loop 
for val in array: 
    print(val) 

// Python For Loop 
for index in range(len(array)): 
    print(array[index]) 
    index+= 1 
0

如果我理解你的權利,你的意思是,如果你有一個函數「功能」,你要檢查每個項目在列表中,如果func(item)返回true;如果你對所有人都是真的,那就做點什麼吧。

您可以使用'全部'。

例如:我想在0-10範圍內的所有質數的列表:

from math import sqrt 
primes = [x for x in range(10) if x > 2 and all(x % i !=0 for i in range(2, int(sqrt(x)) + 1))] 
1

this article。迭代器對象nditer from numpy在NumPy 1.6中引入的包提供了許多靈活的方式來以系統化的方式訪問一個或多個陣列的所有元素。

例子:

import random 
import numpy as np 

ptrs = np.int32([[0, 0], [400, 0], [0, 400], [400, 400]]) 

for ptr in np.nditer(ptrs, op_flags=['readwrite']): 
    # apply random shift on 1 for each element of the matrix 
    ptr += random.choice([-1, 1]) 

print(ptrs) 

d:\>python nditer.py 
[[ -1 1] 
[399 -1] 
[ 1 399] 
[399 401]] 
相關問題