web-dev-qa-db-ja.com

Python 3には 'foreach'関数がありますか?

私が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が繰り返し可能なオブジェクトを受け入れず、そのソースを書き換えることができない場合があります。
102
user2003548

私が見た「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の リスト内包表記 で行うことができます。

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

namesCapitalized = [capitalize(n) for n in names]
134
Jo Are By

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

for element in iterable:
    operate(element)

本当にやりたければ、独自のforeach関数を定義することができます。

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

ちなみにfor element in iterable構文は ABC プログラミング言語に由来します。これはPythonの影響の1つです。

39
Phillip Cloud

その他の例

PythonのForeachループ:

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

Python For Loop:

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
26
uingtea

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

例えば。

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

複数の引数を取る関数の場合は、さらに多くの引数をmapに指定できます。

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

これはpython 2.xではリストを、python 3ではイテレータを返します。

あなたの関数が複数の引数を取り、その引数がタプルの形式のalready(またはPython 2.6以降で反復可能)の場合、 を使うことができます。 )itertools.starmap 。 (これはあなたが探していたものと非常によく似た構文を持っています)。イテレータを返します。

例えば。

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

8と9

6
Akshit Khurana

私があなたが正しいと理解したならば、あなたがあなたが関数 '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
Be'ezrat Hashem

これは、python 3でforeachを実行します

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

for fetch in test:
    print(fetch)
1
veera sai

この記事を見てください。 NumPy 1.6で導入されたnumpyパッケージのiteratorオブジェクトnditerは、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
foo bar

もっと簡潔な構文を探しているのであれば、forループを1行に入れることができます。

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

追加のステートメントはセミコロンで区切ります。

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

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

0
aris