Is er een ‘foreach’-functie in Python 3?

Als ik de situatie tegenkom, kan ik het in javascript doen, ik denk altijd dat het gemak zou zijn als er een foreach-functie is. Met foreach bedoel ik de functie die hieronder wordt beschreven:

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

ze doen het gewoon op elk element en hebben niets opgeleverd of geretourneerd, ik denk dat het een ingebouwde functie zou moeten zijn en sneller zou moeten zijn dan het schrijven met pure Python, maar ik vond het niet op de lijst,of het heeft gewoon een andere naam genoemd?of mis ik hier gewoon wat punten?

Misschien heb ik het mis, want het aanroepen van een functie in Python kost veel, zeker geen goede gewoonte voor het voorbeeld. In plaats van een uit-lus, zou de functie de lus moeten doen in de zijkant van zijn lichaam ziet er als volgt uit, wat al in veel python-codesuggesties wordt genoemd:

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

maar ik dacht dat foreach nog steeds welkom is op basis van de twee feiten:

  1. In normale gevallen geven mensen niets om de uitvoering
  2. Soms accepteerde de API geen itereerbaar object en kun je de bron niet herschrijven.

Antwoord 1, autoriteit 100%

Elk voorkomen van “foreach” dat ik heb gezien (PHP, C#, …) doet in principe hetzelfde als de “for”-statement van pythons.

Deze zijn min of meer gelijkwaardig:

// PHP:
foreach ($array as $val) {
    print($val);
}
// C#
foreach (String val in array) {
    console.writeline(val);
}
// Python
for val in array:
    print(val)

Dus, ja, er is een “foreach” in python. Het heet “voor”.

Wat je beschrijft is een ‘array map’-functie. Dit kan gedaan worden met lijstbegrippenin python:

names = ['tom', 'john', 'simon']
namesCapitalized = [capitalize(n) for n in names]

Antwoord 2, autoriteit 28%

Python heeft geen foreach-statement per se. Het heeft forlussen ingebouwd in de taal.

for element in iterable:
    operate(element)

Als je het echt zou willen, zou je je eigen foreach-functie kunnen definiëren:

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

Als een kanttekening komt de for element in iterablesyntaxis van de programmeertaal ABC, een van de invloeden van Python.


Antwoord 3, autoriteit 15%

Andere voorbeelden:

Python Forreach-lus:

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

Python voor lus:

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

Antwoord 4, autoriteit 5%

mapkan worden gebruikt voor de situatie die in de vraag wordt genoemd.

Bijvoorbeeld

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

Voor functies die meerdere argumenten nodig hebben, kunnen meer argumenten worden gegeven om toe te wijzen:

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

Het geeft een lijst terug in python 2.x en een iterator in python 3

In het geval dat uw functie meerdere argumenten nodig heeft en de argumenten zijn alin de vorm van tuples (of een andere iteratie sinds python 2.6), dan kunt u itertools.starmap. (die een zeer vergelijkbare syntaxis heeft als waar u naar op zoek was). Het geeft een iterator terug.

Bijvoorbeeld

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

geeft ons 8 en 9


Antwoord 5, autoriteit 3%

Ja, hoewel het dezelfde syntaxis gebruikt als een for-lus.

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

Antwoord 6, autoriteit 2%

Hier is het voorbeeld van de “foreach” constructie metgelijktijdige toegang tot de elementindexenin Python:

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

Antwoord 7, autoriteit 2%

Dit doet de foreach in python 3

test = [0,1,2,3,4,5,6,7,8,"test"]
for fetch in test:
    print(fetch)

Antwoord 8

Het juiste antwoord is “pythoncollecties hebben geeneen foreach“. In native python moeten we onze toevlucht nemen tot de externe for _element_ in _collection_syntaxis, wat nietis waar de OP naar op zoek is.

Python is over het algemeen vrij zwak voor functioneel programmeren. Er zijn een paar bibliotheken om een beetje te verzachten. Ik heb geholpen bij het schrijven van een van deze infixpy
https://pypi.org/project/infixpy/

from infixpy import Seq
(Seq([1,2,3]).foreach(lambda x: print(x)))
1
2
3

Zie ook: Links naar rechts-toepassing van bewerkingen op een lijst in Python 3


Antwoord 9

Als ik je goed heb begrepen, bedoel je dat als je een functie ‘func’ hebt, je voor elk item in de lijst wilt controleren of func(item) true retourneert; als je voor iedereen waar wordt, doe dan iets.

Je kunt ‘alle’ gebruiken.

Bijvoorbeeld: ik wil alle priemgetallen in het bereik 0-10 in een lijst:

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))]

Antwoord 10

Bekijk dit artikel. Het iterator-object nditeruit het pakket numpy, geïntroduceerd in NumPy 1.6, biedt veel flexibele manieren om alle elementen van een of meer arrays op een systematische manier te bezoeken.

Voorbeeld:

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]]

Antwoord 11

Als je gewoon op zoek bent naar een meer beknopte syntax kunt u de Te lus op één regel:

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

Just afzonderlijke extra verklaringen met een puntkomma.

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

Dit kan niet voldoen aan uw lokale stijlgids, maar het kan zinvol zijn om het te doen als dit als je spelen rond in de console.


Antwoord 12

Als je echt wilt u kunt dit doen:

[fn(x) for x in iterable]

Maar het punt van de lijst begrip is om een ​​lijst te maken – met behulp van het voor de bijwerking alleen slecht is stijl. De lus is ook minder typen

for x in iterable: fn(x)

Antwoord 13

Ik denk dat dit antwoord op uw vraag, want het is als een “voor elke” loop.
Onderstaande script is geldig in Python (versie 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)")

Other episodes