Подтвердить что ты не робот

Есть ли функция "foreach" в Python 3?

Когда я встречаю ситуацию, я могу сделать это в javascript, я всегда думаю, что если функция foreach будет удобна. В foreach я имею в виду функцию, которая описана ниже:

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

они просто делают это на каждом элементе и ничего не дают или не возвращают, я думаю, что он должен быть встроенной функцией и должен быть быстрее, чем писать его с чистым Python, но я не нашел его на список, или он просто называется другим именем, или я просто пропущу несколько пунктов здесь?

Возможно, я ошибаюсь, потому что вызов функции в Python стоит дорого, определенно не очень хорошая практика для примера. Вместо того, чтобы выходить из цикла, функция должна делать петлю внутри, ее тело выглядит так, как показано ниже, что уже упоминалось во многих предложениях кода python:

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

но я думал, что foreach по-прежнему приветствуется в основе двух фактов:

  • В обычных случаях люди просто не заботятся о производительности
  • Когда-то API не принимал итеративный объект, и вы не можете переписать его источник.
4b9b3361

Ответ 1

Каждое появление "foreach", которое я видел (PHP, С#,...), в основном то же, что и оператор 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". Он называется "для".

То, что вы описываете, является функцией "map map". Это можно сделать с помощью списка понятий в python:

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

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

Ответ 2

У 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.

Ответ 3

Другие примеры:

Цикл 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

Ответ 4

map может быть использована для ситуации, упомянутой в вопросе.

Например

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

Для функций, которые принимают несколько аргументов, можно указать больше аргументов для map:

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

Ответ 5

Если я правильно понял, вы имеете в виду, что если у вас есть функция func, вы хотите проверить каждый элемент в списке, если func (item) возвращает true; если вы вернетесь ко всем, тогда сделайте что-нибудь.

Вы можете использовать "все".

Например: я хочу получить все простые числа в диапазоне 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))]

Ответ 6

Это делает foreach в Python 3

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

for fetch in test:
    print(fetch)

Ответ 7

Посмотрите в этой статье. Объект итератора nditer из пакета numpy, представленный в NumPy 1.6, предоставляет множество гибких способов систематического использования всех элементов одного или нескольких массивов.

Пример:

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

Ответ 8

Если вы просто ищете более краткий синтаксис, вы можете поместить цикл for в одну строку:

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

Просто разделите дополнительные операторы точкой с запятой.

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

Это может не соответствовать вашему местному руководству по стилю, но может иметь смысл сделать это так, когда вы играете в консоли.

Ответ 9

Да, хотя он использует тот же синтаксис, что и для цикла.

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