Python 3に「foreach」関数はありますか?


139

私は、JavaScriptでできる状況に出会ったとき、foreach関数があれば便利だといつも思っています。foreachとは、以下に説明する機能を意味します。

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

彼らはすべての要素でそれを行うだけで、何かを生成したり返したりしませんでした、それは組み込み関数であり、純粋なPythonで書くよりも高速であるはずですが、リストに見つかりませんでした、またはそれは単に別の名前を呼んだのですか?それとも私はここでいくつかのポイントを逃していますか?

多分私は間違ったかもしれません、Pythonで関数を呼び出すのは高くつくので、間違いなくこの例では良い習慣ではありません。関数は、outループではなく、本体のループを実行する必要があります。これは、以下のようになり、Pythonの多くのコード提案ですでに言及されています。

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

しかし、私はforeachが2つの事実に基づいてまだ歓迎されていると思いました:

  1. 通常の場合、人々はパフォーマンスを気にしません
  2. APIが反復可能なオブジェクトを受け入れず、そのソースを書き換えることができない場合があります。

3
forループを使用することの何が問題になっていますか?

1
これがまさにそのforためです。
user2357112は

2
forループには何の問題もありません。単に便宜上です
user2003548 '18

6
@ user2357112、リストの項目ごとに1回関数を呼び出すための省略形があることが望ましいです。IMO list.each(func)よりもきれいですfor item in list: func(item)。問題は、Pythonのは、同様の機能お気に入り置き換えるの良い仕事行われていることであるmap()filter()単純にそのビルトインを拡張するリスト内包とforし、if(均質と読める)と特定は.each()その反するかもしれません。
sevko 2014

sum(0 for _ in map(f, seq))読みやすい回避策です。
ヨハネスシャウブ-litb

回答:


171

私が見たすべての "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」と呼ばれています。

あなたが説明しているのは「配列マップ」関数です。これは、Pythonのリスト内包表記で実行できます。

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

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

5
map()はリストを累積して返しますが、foreach()はそうしないため、map()ではありません。アイテムの長いリストを繰り返し処理する場合、違いは非常に高くつく可能性があります。for()がトリックを行うことに同意しました。
カナック2015

2
これはfor-inループと呼ばれるものです。
Vox 2015

5
彼らは機能について尋ねましたが、あなたはforステートメントで答えました。
Johannes Schaub-litb

@ JohannesSchaub-litb事は彼が正しいことです... pythonの 'for'は他の言語で文字通り知られている 'foreach'です... tclの例では、 'for'ループはforのようなものですloop} {ここに条件} {各反復で実行されるもの} {ここにコマンド...}例:{set x 1} {$ x <= 10} {incr x} {puts $ x}の場合は、さらに追加することもできます';'を使用して反復中括弧内をチェックします。彼がここに来てpythonに真の「for」ループがあるかどうか尋ねるなら、私にはもっと意味があるでしょう
Francisco

3
@Francisco地球は平らではないと言ってもいいです。ただし、回答としては追加しません。
ヨハネスシャウブ-litb

49

Python 自体にforeachステートメントはありません。言語に組み込まれたループがあります。for

for element in iterable:
    operate(element)

本当にしたい場合は、独自のforeach関数を定義できます。

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

余談ですが、for element in iterable構文はPythonの影響の1つであるABCプログラミング言語に由来しいます。


14
マッピングの結果ではなく、副作用のためにこれを行う場合map、このように使用してmapも、遅延が発生するPython 3では実際に機能しません。つまり、すでに計算されたリストではなく、反復子を返すようになりました。結果のリストを反復処理するまで、副作用は発生しません。
ローレンスゴンサルベス2013

それは事実であり、確かに有効な点ですが、質問は、OPがおそらくそのような機微に関係していないことを示唆しています。
Phillip Cloud

@LaurenceGonsalvesありがとう。最初の例がPython 3で正しくなるように編集しました
Phillip Cloud

これは醜いです。forループとほぼ同じ長さで、反復可能オブジェクトが長い(おそらく無限)か、関数の戻り値が大きい場合は、で壊れMemoryErrorます。
user2357112は2013

醜いとは何ですか?最初の例は?確かに、それは質問に答えます。また、単純なforループを使用するだけでなく、リスト内包表記を使用することも述べました。
Phillip Cloud

31

その他の例:

Python Foreachループ:

array = ['a', 'b']
for value in array:
    print(value)
    # a
    # b

Python Forループ:

array = ['a', 'b']
for index in range(len(array)):
    print("index: %s | value: %s" % (index, array[index]))
    # index: 0 | value: a
    # index: 1 | value: b

9

map 質問に記載されている状況に使用できます。

例えば

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。(あなたが探していたものと非常に似た構文を持っています)。イテレータを返します。

例えば

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

私たちに8と9を与えます


3
mapforeach意味が異なります。map結果のリストを返し(リスト、列挙可能な構造、または消費されるためすぐには呼び出されない構造を作成することを意味します)、foreach結果を無視して各アイテムの関数を呼び出します。
njzk2

1
Foreach結果をすぐに返す必要があります。foreachの代わりにイテレータを作成することが望ましいと言っているのは、まったくがらくたです。
リトルエイリアン

map()結果が無視される場合の使用はアンチパターンです。代わりにforループを使用する必要があります。
odie5533

1
map結果を使用して無視すると、Python 3では望ましくない結果が生成mapされます。これは、結果のリストが消費されたときにのみ遅延評価されるためです。の結果がmap消費されない場合、呼び出しは適用されません。
ドミトリーB.

5

これはPython 3のforeachを行います

test = [0,1,2,3,4,5,6,7,8,"test"]

for fetch in test:
    print(fetch)

7
これは質問の答えにはなりません。
Boiethios

5

はい、ただしforループと同じ構文を使用します。

for x in ['a', 'b']: print(x)

残念ながら、これはそうではありませんforEach
ニーム

@nehem必要に応じて関数で囲みます。
穴居

@nehem See question

2

私があなたの言うことを正しく理解していれば、 'func'関数がある場合、func(item)がtrueを返すかどうかをリスト内の各項目について確認したいということです。すべてに当てはまる場合は、何かを行います。

'all'を使用できます。

例:リストの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))]

2

これは、Pythonの要素インデックスに同時にアクセスする「foreach」構造の例です。

for idx, val in enumerate([3, 4, 5]):
    print (idx, val)

1

この記事を見てください。イテレータオブジェクトnditerからnumpyの 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]]

1

より簡潔な構文を探しているだけの場合は、forループを1行記述できます。

array = ['a', 'b']
for value in array: print(value)

追加のステートメントをセミコロンで区切るだけです。

array = ['a', 'b']
for value in array: print(value); print('hello')

これはローカルスタイルガイドに準拠していない場合がありますが、コンソールで遊んでいるときにこのようにすることは理にかなっています。


0

「for each」ループのようなものなので、これはあなたの質問に答えると思います。
以下のスクリプトはpython(バージョン3.8)で有効です。

a=[1,7,77,7777,77777,777777,7777777,765,456,345,2342,4]
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.