2013-08-18 15 views
51

私はJavaScriptの中でそれを行うことができる状況に遭遇するとき、私はいつもforeach機能があればそれは便利だろうと思う。彼らはすべての要素でそれを行うと何かを得たり返さなかった、私はそれが組み込み関数であるべきで、より速くされるべきだと思うPython 3には 'foreach'関数がありますか?

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

:foreachのことで私は、以下に説明される機能を意味します純粋なPythonで書いていますが、私はリストでそれを見つけられませんでしたか、それともちょうど別の名前が呼ばれましたか?

多分私は間違っている、おそらく例の良い練習ではない、Pythonコストの高い関数を呼び出します。むしろアウトループよりも、機能が側にループを行う必要があり、その本体は、すでに多くのPythonのコードの提案に言及し、それ以下のようになります。

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

が、私は、foreachのはまだ二つの事実上の歓迎ベースで考えた:

  1. 通常のケースでは、人々はいつかAPIは、反復可能なオブジェクトを受け入れなかったパフォーマンス
  2. を気にしないでください、あなたはそのソースを書き換えることはできません。
+2

ちょうど 'for'ループを使用して何が悪いですか? – delnan

+1

これはまさにforのためのものです。 – user2357112

+0

forループで何も間違っているのではなく、便宜のために – user2003548

答えて

20

Pythonは自体foreach文はありません。言語に組み込まれたループはforです。 for element in iterable構文はthe ABCプログラミング言語Pythonの影響の一つから来ている側の注意点として

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

:あなたが本当にしたい場合

for element in iterable: 
    operate(element) 

、あなた自身のforeach関数を定義することができます。

+10

マッピングの結果ではなく、副作用のためにこれを行っているなら、このように 'map'を使うことは、' map'が怠けているPython 3では本当に動作しません。つまり、現在計算されているリストではなく、イテレータを返します。結果のリストを反復処理するまで、副作用は発生しません。 –

+0

それは本当であり、確かに有効な点ですが、OPは恐らくそのような微妙さに関係していないことを示唆しています。 –

+0

@LaurenceGonsalvesありがとう。私はPython 3で最初の例を修正しました。 –

81

私が見た "foreach"(php、c#、...)の出現は、pythons "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」と呼ばれています。

「アレイマップ」機能について説明します。これはpythonでlist comprehensionsで行うことができます。

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

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

map()はリストを累積して返しますが、foreach()はリストを返しませんので、map()ではありません。あなたが長い項目のリストを反復している場合、その差はかなり高価になる可能性があります。同意するのはトリックです – Canuck

+2

これは__for-in__ループと呼ばれています。 – Vox

3

mapは、問題のような状況のため、ほとんどの場合において好ましいです。

など。複数の引数を取る関数では

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

、より多くの引数がマップに与えることができる。

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

これは、Python 2のリストを返します。xとのpython 3

でイテレータ関数が複数の引数を取り、引数はあなたがitertools.starmapを使用できるタプルの形式(やPython 2.6以降の任意のiterable)にすでにある場合。 (これはあなたが探していたものと非常に似た構文をしています)。イテレータを返します。

など。

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

は、私は右のあなたを理解している場合、あなたは関数「FUNC」を持っている場合、あなたは各項目をチェックすることを意味し、私たちに8と9

+1

'map'と' foreach'は異なる意味を持っています。'map'は結果のリストを返します(これはリストや列挙可能な構造体、あるいは消費される構造体を生成することを意味するので、すぐには呼び出されません)、foreachは結果を無視して各項目の関数を呼び出します。 – njzk2

+0

'Foreach'は結果を即座に返さなければなりません。 foreachの代わりにiteratorを作成することが望ましいとすると、全体的な駄目です。 –

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を返す場合はリスト内にあります。あなたがすべての人にとって真実なら、何かをしてください。

'all'を使用できます。例えば

:私は、リスト内の範囲0-10内のすべての素数を取得したい:this article

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

ルック。反復子オブジェクトnyditernumpyパッケージは、NumPy 1.6で導入されており、1つまたは複数の配列のすべての要素を体系的に参照するための柔軟な方法を提供します。

例:

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]] 
関連する問題