파이썬 3에는 'foreach'함수가 있습니까?


139

상황을 만날 때 자바 스크립트로 foreach할 수 있습니다. 함수가 있으면 편리 할 것이라고 항상 생각 합니다. foreach는 아래에 설명 된 기능을 의미합니다.

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

그들은 모든 요소에서 그것을하고 무언가를 산출하거나 반환하지 않았습니다. 내장 기능이어야하고 순수한 파이썬으로 작성하는 것보다 빠르다고 생각하지만 목록에서 찾지 못했습니다. 방금 다른 이름을 불렀거나 여기서 요점을 놓치셨습니까?

어쩌면 내가 잘못했을 수도 있습니다. 파이썬에서 함수를 호출하면 비용이 많이 들며, 분명히 예제에는 좋지 않습니다. 함수는 out 루프가 아니라 많은 파이썬 코드 제안에서 이미 언급 한 것처럼 몸통에서 루프를 수행해야합니다.

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

그러나 나는 foreach가 여전히 두 가지 사실을 기반으로 환영한다고 생각했습니다.

  1. 일반적인 경우 사람들은 성능에 신경 쓰지 않습니다.
  2. 때로는 API가 반복 가능한 객체를 허용하지 않아 소스를 다시 작성할 수 없습니다.

3
for루프를 사용하는 것의 문제점은 무엇입니까 ?

1
이것은 정확히 무엇 for을위한 것입니다.
user2357112는

2
편의상 for 루프에는 아무 문제가 없습니다
user2003548

6
@ user2357112의 경우, 목록의 항목 당 한 번씩 함수를 호출하기위한 속기를 갖는 것이 바람직합니다. IMO list.each(func)보다 깨끗 for item in list: func(item)합니다. 문제는 파이썬 이 단순히 내장 기능을 확장 하고 (균일하고 읽을 수있는) 목록 이해력 map()과 같은 기능적 즐겨 찾기를 대체하는 훌륭한 작업을 수행 했으며 특정 기능 이 그것에 맞지 않을 수 있다는 것입니다. filter()forif.each()
sevko

sum(0 for _ in map(f, seq))읽을 수있는 해결 방법입니다.
Johannes Schaub-litb

답변:


171

내가 본 "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)

그래서, 파이썬에는 "foreach"가 있습니다. "포"라고합니다.

당신이 설명하는 것은 "배열 맵"기능입니다. 이것은 파이썬에서 목록 이해 로 수행 할 수 있습니다 .

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

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

5
foreach ()는 그렇지 않지만 map ()은 목록을 누적하고 반환하기 때문에 map ()이 아닙니다. 긴 항목 목록을 반복하면 차이가 상당히 비쌀 수 있습니다. for ()가 트릭을 수행한다고 동의했습니다.
Canuck

2
이것을 for-in 루프 라고합니다 .
Vox

5
그들은 기능에 대해 물었지만 당신은 진술에 대해 대답했습니다.
Johannes Schaub-litb

@ JohannesSchaub-litb는 그가 옳다는 것입니다 ... 파이썬에서 'for'는 문자 그대로 다른 언어로 알려진 'foreach'입니다 ... 예를 들어 tcl의 경우 'for'루프는 { loop} {condition here} {각 반복에서 실행되는 항목} {commands here ...} 예 : {set x 1} {$ x <= 10} {incr x} {puts $ x} 추가 ';'을 사용하여 반복 중괄호 내부를 확인합니다. 그가 파이썬에 진정한 'for'루프가 있는지 묻는다면 여기에 더 이해가 될 것입니다
Francisco

3
@Francisco 나는 지구가 평평하지 않다고 말하는 것도 옳습니다. 그러나 나는 그것을 대답으로 추가하지 않을 것입니다.
Johannes Schaub-litb

49

파이썬에는 그 자체foreach진술 이 없습니다 . 그것은이 언어에 내장 된 루프를.for

for element in iterable:
    operate(element)

정말로 원한다면 자신의 foreach기능을 정의 할 수 있습니다.

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

부수적으로, for element in iterable구문은 파이썬의 영향 중 하나 인 ABC 프로그래밍 언어 에서 나옵니다 .


14
매핑 결과가 아닌 부작용 으로이 작업을 수행하는 경우이 map방법 을 사용 하면 실제로 map게으른 Python 3에서 작동하지 않습니다 . 즉, 이제 이미 계산 된 목록이 아닌 반복자를 반환합니다. 결과 목록을 반복 할 때까지 부작용이 발생하지 않습니다.
Laurence Gonsalves

그것은 사실이며 확실히 타당한 요점이지만, OP는 아마도 그러한 미묘함에 관심이 없을 것입니다.
Phillip Cloud

@LaurenceGonsalves 감사합니다. 파이썬 3에서 첫 번째 예제를 수정하도록 편집했습니다.
Phillip Cloud

이것은 추한 것입니다. 거의 for루프 만큼 길며 , iterable이 길거나 (아마도 무한대이거나) 함수 반환 값이 크면 a로 구분 MemoryError됩니다.
user2357112는

못생긴 게 뭐야? 첫 번째 예? 물론, 그것은 질문에 대답합니다. 또한 일반 for루프 작업과 목록 이해를 사용하는 것에 대해서도 언급했습니다 .
Phillip Cloud

31

다른 예 :

파이썬 Foreach 루프 :

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

파이썬 포 루프 :

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

파이썬 2.x의 목록과 파이썬 3의 반복자를 반환합니다.

함수가 여러 인수를 사용하고 인수가 이미 튜플 (또는 python 2.6 이후의 반복 가능) 형식 인 경우을 사용할 수 있습니다 itertools.starmap. (당신이 찾고있는 것과 매우 유사한 구문을 가지고 있습니다). 반복자를 반환합니다.

예 :

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

우리에게 8과 9를 제공합니다


3
map그리고 foreach다른 의미를 가지고있다. map결과 목록을 반환합니다 (목록 또는 열거 가능한 구조 또는 소비되어 즉시 호출되지 않는 구조를 의미 함) foreach. 결과를 무시하고 각 항목에 대해 함수를 호출합니다.
njzk2 2016 년

1
Foreach결과를 즉시 반환해야합니다. foreach 대신 iterator를 만드는 것이 바람직하다고 말하는 것은 쓰레기입니다.
리틀 에일리언

map()결과가 무시 될 때 사용 하는 것은 안티 패턴입니다. 대신 for 루프를 사용해야합니다.
odie5533

1
map결과를 사용 하고 무시하면 결과 map목록이 사용될 때만 게으르게 평가 되므로 Python 3에서 원하지 않는 결과가 생성 됩니다. 의 결과 map가 전혀 사용되지 않으면 통화가 적용되지 않습니다.
Dmitry B.

5

이것은 파이썬 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 원한다면 함수로 감싸세요.
원시인

@nehem 질문보기
Caveman

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

다음은 파이썬 에서 요소 인덱스 에 동시에 액세스 할 수있는 "foreach"구성 의 예입니다 .

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

1

이 문서 . 반복자 객체 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]]

1

더 간결한 구문을 찾고 있다면 for 루프를 한 줄에 넣을 수 있습니다 .

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.