Python 3'te 'foreach' işlevi var mı?


139

Javascript ile yapabileceğim durumla karşılaştığımda, her zaman bir foreachişlev varsa kolaylık olacağını düşünüyorum. Foreach ile aşağıda açıklanan işlevi kastediyorum:

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

sadece her öğede yapıyorlar ve bir şey vermediler ya da geri vermediler, bence yerleşik bir işlev olmalı ve saf Python ile yazmaktan daha hızlı olmalı, ama listede bulamadım ya da sadece başka bir isim mi aradı yoksa burada bazı noktaları mı özlüyorum?

Belki yanıldım, çünkü Python'da bir fonksiyon çağırmanın maliyeti yüksek, kesinlikle iyi bir örnek değil. Bir out döngüsünden ziyade, işlev, birçok python'un kod önerilerinde daha önce bahsedilen, aşağıdaki gibi görünen döngüyü yanda yapmalıdır:

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

ama her iki olguda da her şeyin hoş karşılandığını düşünüyordum:

  1. Normal durumlarda, insanlar performansı umursamazlar
  2. Bazen API yinelenebilir nesneyi kabul etmedi ve kaynağını yeniden yazamazsınız.

3
Sadece bir fordöngü kullanmanın nesi yanlış ?

1
Bu tam olarak forbunun için.
user2357112 Monica

2
Sadece kolaylık için döngü ile yanlış bir şey,
user2003548

6
@ user2357112, bir liste öğesi başına bir işlevi çağırmak için bir stenografi olması arzu edilir. IMO'dan list.each(func)daha temiz for item in list: func(item). Sorun Python en gibi fonksiyonel sık değiştirilmesi iyi bir iş çıkarmış olmasıdır map()ve filter()basitçe uzatmak liste comprehensions ile kendi dahili forve if(ki homojen ve okunabilir) ve belirli .each()buna karşı gidebilir.
sevko

sum(0 for _ in map(f, seq))okunabilir bir çözümdür.
Johannes Schaub - litb

Yanıtlar:


171

Gördüğüm her "foreach" oluşumu (PHP, C #, ...) temelde pythons "for" deyimi ile aynıdır.

Bunlar aşağı yukarı eşdeğerdir:

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

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

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

Yani, evet, python'da bir "foreach" var. Buna "için" denir.

Açıkladığınız şey bir "dizi haritası" işlevidir. Bu , python'daki liste kavrayışları ile yapılabilir :

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

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

5
Map () değildir, çünkü map () bir liste biriktirir ve döndürür, foreach () ise. Uzun bir öğe listesi üzerinde yineleme yapıyorsanız fark oldukça pahalı olabilir. () İçin hile yaptığını kabul etti.
Canuck

2
Bunun for-in döngüsü olarak adlandırıldığını gördüm .
Vox

5
Fonksiyonu sordular, ama siz açıklama için cevap verdiniz.
Johannes Schaub - Litb

@ JohannesSchaub-litb şey o doğru ... 'için' python 'tam anlamıyla diğer dillerde bilinen' foreach 'olduğunu ... tcl için örneğin bir' for 'döngü için bir şey olurdu {şeylerin başında koştu loop} {koşul burada} {her yinelemede çalışan şeyler} {buradaki komutlar ...} örn .: {set x 1} için {$ x <= 10} {incr x} {$ $} ekleyebilir ';' kullanarak yineleme parantezlerini kontrol eder. Buraya gelip python'un gerçek bir 'for' döngüsüne sahip olup olmadığını sorarak daha mantıklı olurdu
Francisco

3
@Francisco Ayrıca dünyanın düz olmadığını söylemekte haklıyım. Ama cevap olarak eklemeyeceğim.
Johannes Schaub - litb

49

Python'un kendi başına bir foreachifadesi yok . Dilde yerleşik döngüler vardır .for

for element in iterable:
    operate(element)

Gerçekten isterseniz, kendi foreachişlevinizi tanımlayabilirsiniz :

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

Bir yan not olarak, for element in iterablesözdizimi Python'un etkilerinden biri olan ABC programlama dilinden geliyor .


14
Bunu eşlemenin sonucu yerine yan etkiler için yapıyorsanız map, bu şekilde kullanmak maptembel olan Python 3'te işe yaramaz. Yani, zaten hesaplanmış bir liste değil, bir yineleyici döndürür. Yan etkiler, ortaya çıkan listeyi tekrarlayana kadar gerçekleşmez.
Laurence Gonsalves

Bu doğru ve kesinlikle geçerli bir nokta, ancak soru OP'nin muhtemelen bu inceliklerle ilgili olmadığını gösteriyor.
Phillip Cloud

@LaurenceGonsalves Teşekkürler. İlk örneği Python 3'te düzeltmek için düzenledim
Phillip Cloud

Bu çirkin, fordöngü kadar uzun ve yinelenebilir uzunsa (belki de sonsuz) veya işlev dönüş değerleri büyükse, a ile kırılır MemoryError.
user2357112 Monica

Çirkin nedir? İlk örnek? Tabii, ama soruyu cevaplıyor. Ayrıca for, liste kavrayışlarının yanı sıra düz bir döngü çalışması da kullandım .
Phillip Cloud

31

Diğer örnekler:

Python Foreach Döngüsü:

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

Döngü için Python:

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 soruda belirtilen durum için kullanılabilir.

Örneğin

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

Birden çok bağımsız değişken alan işlevler için eşlemeye daha fazla bağımsız değişken verilebilir:

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

Python 2.x içinde bir liste ve python 3'te bir yineleyici döndürür

İşlevinizin birden fazla bağımsız değişken alması ve bağımsız değişkenlerin zaten tuples (veya python 2.6'dan beri yinelenebilir) biçiminde olması durumunda kullanabilirsiniz itertools.starmap. (aradığınıza çok benzer bir sözdizimine sahiptir). Bir yineleyici döndürür.

Örneğin

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

bize 8 ve 9 verir


3
mapve foreachfarklı bir anlamı var. mapbir sonuç listesi döndürür (bir liste veya numaralandırılabilir bir yapı veya tüketilecek ve bu nedenle hemen çağrılmayacak bir yapı oluşturmayı ima eder), foreachher öğedeki işlevi çağırır ve sonucu yok sayar.
njzk2

1
Foreachsonucu derhal iade etmelidir. Foreach yerine yineleyici oluşturmanın tercih edildiğini söylemek tam bir saçmalıktır.
Küçük Uzaylı

Kullanımı map()sonucu göz ardı edildiğinde bir anti-kalıptır. Bunun yerine for döngüsü kullanmalısınız.
odie5533

1
mapSonuçları kullanmak ve görmezden gelmek, Python 3'te istenmeyen sonuçlar doğuracaktır map, çünkü artık sadece sonuç listesi tüketildiğinde tembel olarak değerlendirilmektedir. Sonucu ise maptüketilen asla, aramalar hiçbir zaman uygulanır.
Dmitry B.

5

Bu python 3 foreach yapar

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

for fetch in test:
    print(fetch)

7
Bu soruya cevap vermiyor.
Boiethios


2

Eğer seni doğru anladıysam, 'func' fonksiyonuna sahipseniz, func (item) doğru döndürürse listedeki her bir öğeyi kontrol etmek istediğiniz anlamına gelir; eğer herkes için doğruysanız, bir şeyler yapın.

'Tümünü' kullanabilirsiniz.

Örneğin: Bir listede 0-10 aralığındaki tüm asal sayıları almak istiyorum:

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'daki eleman indekslerine aynı anda erişime sahip "foreach" yapısına bir örnek :

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

1

Bak bu makalede . Yineleyici nesne nditer gelen numpy numpy 1.6 tanıtılan pakette, sistematik biçimde bir veya daha fazla diziler tüm unsurları ziyaret etmek birçok esnek yollar sunar.

Misal:

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

Sadece daha kısa bir sözdizimi arıyorsanız, for döngüsünü bir satıra koyabilirsiniz :

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

Ek ifadeleri noktalı virgülle ayırın.

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

Bu, yerel stil rehberinize uygun olmayabilir, ancak konsolda oynarken bunu böyle yapmak mantıklı olabilir.


0

Sanırım bu sorunuzu cevaplıyor, çünkü "her biri için bir döngü" gibidir.
Aşağıdaki komut dosyası python (sürüm 3.8) için geçerlidir:

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)")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.