수색…


소개

프로그래밍에서 가장 기본적인 기능 중 하나 인 루프는 거의 모든 프로그래밍 언어에서 중요한 부분입니다. 루프를 사용하면 개발자는 코드의 특정 부분을 반복이라고하는 여러 루프를 반복하도록 설정할 수 있습니다. 이 주제에서는 여러 유형의 루프와 Python에서 루프 응용 프로그램을 사용하는 방법을 다룹니다.

통사론

  • while <boolean expression> :
  • <iterable>의 <variable>에 대해 :
  • 범위 (<번호>)에있는 <변수>에 대해 :
  • 범위 내의 <variable> (<start_number>, <end_number>) :
  • (<시작 _ 번호>, <끝 _ 번호>, <단계 크기>) 범위의 <변수>에 대해 :
  • i, <변수> in enumerate (<iterable>) : #와 인덱스 i
  • zip (<iterable1>, <iterable2>)의 <variable1>, <variable2>

매개 변수

매개 변수 세부
부울 표현식 부울 문맥에서 평가할 수있는 표현식, 예 : x < 10
변하기 쉬운 iterable 의 현재 요소에 대한 변수 이름
반복 가능한 반복을 구현하는 모든 것

리스트 반복하기

당신이 사용할 수있는 목록을 반복하기 for :

for x in ['one', 'two', 'three', 'four']:
    print(x)

이렇게하면 목록의 요소가 인쇄됩니다.

one
two
three
four

range 함수는 for 루프에서 자주 사용되는 숫자를 생성합니다.

for x in range(1, 6):
    print(x)

결과는 파이썬> = 3의 특수 범위 시퀀스 유형 과 파이썬 <= 2의 목록이됩니다. 둘 다 for 루프를 사용하여 루프 할 수 있습니다.

1
2
3
4
5

당신이 목록의 두 요소하지만 루프 할뿐만 아니라 요소에 대한 인덱스가있는 경우, 당신은 파이썬의 사용할 수있는 enumerate 기능을 :

for index, item in enumerate(['one', 'two', 'three', 'four']):
    print(index, '::', item)

enumerateindex (정수)와 item (목록의 실제 값)으로 압축 된 튜플을 생성합니다. 위의 루프가 인쇄됩니다.

(0, '::', 'one')
(1, '::', 'two')
(2, '::', 'three')
(3, '::', 'four')

maplambda 사용하여 값 조작으로 목록을 반복합니다. 즉, 목록의 각 요소에 람다 함수를 적용합니다.

x = map(lambda e :  e.upper(), ['one', 'two', 'three', 'four'])
print(x)

산출:

['ONE', 'TWO', 'THREE', 'FOUR'] # Python 2.x

NB : 파이썬 3.x map 에서 목록 대신 반복자를 반환하므로 결과를 캐스팅해야하는 목록이 필요한 경우 print(list(x)) 참조 하십시오 ( http://www.riptutorial.com/python/ 참조) . example / 8186 / map-- http://www.riptutorial.com/python/topic/809/incompatibilities-moving-from-python-2-to-python-3 ).

For 루프

for 루프는 list 또는 dict 와 같은 항목 모음을 반복하고 컬렉션의 각 요소로 코드 블록을 실행합니다.

for i in [0, 1, 2, 3, 4]:
    print(i)

위의 for 루프는 숫자 목록을 반복합니다.

각 반복은 i 의 값을 목록의 다음 요소로 설정합니다. 그래서 처음에는 0 , 1 , 2 등이 될 것입니다. 출력은 다음과 같습니다 :

0  
1
2
3
4

range 는 반복 가능한 형식으로 일련의 숫자를 반환하는 함수이므로 for 루프에서 사용할 수 있습니다.

for i in range(5):
    print(i)

첫 번째 for 루프와 완전히 동일한 결과를 제공합니다. 여기서 범위는 0 부터 세는 처음 5 개의 숫자이므로 5 가 인쇄되지 않습니다.

반복 가능한 객체 및 반복자

for 루프는 __getitem__ 또는 __iter__ 함수를 정의하는 객체 인 모든 반복 가능한 객체를 반복 할 수 있습니다. __iter__ 함수는 반복기의 다음 요소에 액세스하는 데 사용되는 next 함수가있는 객체 인 반복기를 반환합니다.

루프에서 끊기 및 계속하기

break

break 문이 루프 내에서 실행되면 제어 흐름이 루프에서 즉시 "중단"됩니다.

i = 0
while i < 7:
    print(i)
    if i == 4:
        print("Breaking from loop")
        break
    i += 1

루프 조건은 break 문이 실행 된 후에 평가되지 않습니다. break 문은 루프 내 에서만 구문 적으로 허용 됩니다 . 함수 내의 break 문은 해당 함수를 호출 한 루프를 종료하는 데 사용할 수 없습니다.

다음을 실행하면 break 문이 만료되고 루프가 멈출 때까지 숫자 4 까지 모든 자릿수가 인쇄됩니다.

0
1
2
3
4
Breaking from loop

break 문은 for 루프 내부 for 사용할 수 있습니다. 다른 루프 구조는 Python에서 제공합니다.

for i in (0, 1, 2, 3, 4):
    print(i)
    if i == 2:
        break

이 루프를 실행하면 다음과 같이 인쇄됩니다.

0
1
2

루프가 종료되었으므로 3과 4는 인쇄되지 않습니다.

루프 else 절이 있으면 break 문을 통해 루프가 종료 될 때 실행되지 않습니다.

continue 진술하다

continue 문은 현재 블록의 나머지 부분을 우회하지만 루프를 계속하는 루프의 다음 반복으로 건너 뜁니다. break 와 마찬가지로 continue 는 루프 내부에만 나타날 수 있습니다.

for i in (0, 1, 2, 3, 4, 5):
    if i == 2 or i == 4:
        continue
    print(i)

0
1
3
5

24 는 인쇄되지 않는다. 왜냐하면 i == 2 또는 i == 4print(i) 를 계속하지 않고 continue 가 다음 반복으로 넘어 가기 때문이다.

중첩 루프

break 하고 continue 하면 루프의 단일 레벨에서만 작동합니다. 다음 예는 단지 내부 벗어날 것이다 for 루프가 아닌 외부 while 루프 :

while True:
    for i in range(1,5):
        if i == 2:
            break    # Will only break out of the inner loop!

파이썬에는 한 번에 여러 수준의 루프를 벗어날 수있는 기능이 없습니다.이 동작이 필요한 경우 하나 이상의 루프를 함수로 리팩터링하고 breakreturn 바꾸는 것이 좋습니다.

함수 내에서 returnbreak

return 은 함수 다음에 오는 코드를 실행하지 않고 함수에서 나옵니다.

함수 내부에 루프가있는 경우 해당 루프 내부에서 return 을 사용하면 루프의 나머지 코드가 실행되지 않으므로 break 되는 것과 같습니다 ( 루프 뒤의 코드는 실행되지 않습니다 ).

def break_loop():
    for i in range(1, 5):
        if (i == 2):
            return(i)
        print(i)
    return(5)

중첩 루프가있는 경우 return 문은 모든 루프를 중단합니다.

def break_all():
    for j in range(1, 5):
        for i in range(1,4):
            if i*j == 6:
                return(i)
            print(i*j)

출력됩니다 :

1 # 1*1
2 # 1*2
3 # 1*3
4 # 1*4
2 # 2*1
4 # 2*2
# return because 2*3 = 6, the remaining iterations of both loops are not executed

"else"절이있는 루프

forwhile 복합 명령문 (루프)은 선택적으로 else 절을 가질 수 있습니다 (실제로이 사용법은 매우 드뭅니다).

else 절은 for 루프가 완료 될 때까지 반복되거나 while 조건부 표현식이 false가되어 while 루프가 종료 된 후에 만 ​​실행됩니다.

for i in range(3):
    print(i)
else:
    print('done')

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('done')

산출:

 0
 1
 2
 done

루프가 다른 방법으로 종료되면 ( break 문이나 예외를 발생 시킴) else 절은 실행되지 않습니다 .

for i in range(2):
    print(i)
    if i == 1:
        break
else:
    print('done')

산출:

0
1

대부분의 다른 프로그래밍 언어에는 루프의이 선택적 else 절이 else . 특히 else 키워드의 사용은 종종 혼란스러운 것으로 간주됩니다.

그러한 절에 대한 원래의 개념은 Donald Knuth에게 돌아갔다. else 키워드의 의미는 구조화 된 프로그래밍 이전 또는 저급 어셈블리 언어에서 if 문 및 goto 문과 관련하여 루프를 다시 작성하면 분명해진다.

예 :

while loop_condition():
    ...
    if break_condition():
        break
    ...

다음과 같습니다.

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>

<<end>>:

이것들은 각각에 else 절을 첨부하면 동일하게 유지됩니다.

예 :

while loop_condition():
    ...
    if break_condition():
        break
    ...
else:
    print('done')

다음과 같습니다.

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>
else:
    print('done')

<<end>>:

else 절이있는 for 루프는 같은 방식으로 이해할 수 있습니다. 개념적으로, 반복 가능한 객체 나 시퀀스가 ​​여전히 남아있는 요소를 가지고있는 한 True로 유지되는 루프 조건이 있습니다.

왜이 이상한 구조를 사용합니까?

for...else 구문의 주요 사용 사례는 다음과 같이 간결한 검색 구현입니다.

a = [1, 2, 3, 4]
for i in a:
    if type(i) is not int:
        print(i)
        break
else:
    print("no exception") 

이 구조에서 else 이 혼동을 덜 일으키게하려면 " 깨지지 않는 경우 "또는 " 발견되지 않은 경우 "로 생각할 수 있습니다.

이것에 대한 토론은 [Python-ideas] for for ... else threads의 요약 에서 볼 수 있습니다. for 및 while 루프 다음에 'else'를 사용하는 이유는 무엇입니까? , 및 루프 절에 대한 Else 절

사전에 반복

다음 사전을 고려하십시오.

 d = {"a": 1, "b": 2, "c": 3}

키를 반복하려면 다음을 사용할 수 있습니다.

for key in d:
    print(key)

산출:

"a"
"b"
"c"

이것은 다음과 같습니다.

for key in d.keys():
    print(key)

또는 Python 2 :

for key in d.iterkeys():
    print(key)

값을 반복하려면 다음을 사용하십시오.

for value in d.values():
    print(value)

산출:

1
2
3

키와 값을 반복하려면 다음을 사용하십시오.

for key, value in d.items():
    print(key, "::", value)

산출:

a :: 1
b :: 2
c :: 3

Python 2에서 .keys() , .values().items()list 객체를 반환합니다. 당신은 단순히 결과 물마루 반복해야하는 경우에는 해당 사용할 수 있습니다 .iterkeys() , .itervalues().iteritems() .

차이 .keys().iterkeys() , .values().itervalues() , .items().iteritems() 이다 iter* 방법 발전기이다. 따라서 사전 내의 요소들은 평가 될 때마다 하나씩 산출됩니다. list 개체가 반환되면 모든 요소가 목록에 압축 된 다음 추가 평가를 위해 반환됩니다.

파이썬 3에서 위의 방식으로 인쇄 된 항목의 순서는 순서를 따르지 않습니다.

While 루프

while 루프는 루프 조건이 false 일 때까지 루프 문을 실행합니다. 다음 코드는 루프 문을 총 4 회 실행합니다.

i = 0 
while i < 4:
    #loop statements
    i = i + 1

위의 루프는 좀 더 우아한 for 루프로 쉽게 변환 될 수 있지만 while 루프는 일부 조건이 충족되었는지 확인하는 데 유용합니다. 다음 루프는 myObject 가 준비 될 때까지 계속 실행됩니다.

myObject = anObject()
while myObject.isNotReady():
    myObject.tryToGetReady()

while 루프는 조건없이 숫자 (복합 또는 실수) 또는 True )을 사용하여 실행할 수도 있습니다.

import cmath

complex_num = cmath.sqrt(-1)
while complex_num:      # You can also replace complex_num with any number, True or a value of any type
    print(complex_num)   # Prints 1j forever

조건이 항상 true이면 while 루프는 break 또는 return 문 또는 예외에 의해 종료되지 않으면 영원히 (무한 루프) 실행됩니다.

while True:
    print "Infinite loop"
# Infinite loop
# Infinite loop
# Infinite loop
# ...

패스 성명

pass 는 Python 구문 (예 : for 또는 while 루프의 본문 내에서)에서 명령문이 필요한 경우 null 문이지만 프로그래머가 필요하거나 원하는 작업은 없습니다. 이것은 아직 작성되지 않은 코드의 자리 표시 자로 유용 할 수 있습니다.

for x in range(10):
    pass #we don't want to do anything, or are not ready to do anything here, so we'll pass

이 예에서는 아무 일도 일어나지 않습니다. for 루프는 오류없이 완료되지만 명령이나 코드는 실행되지 않습니다. pass 사용하면 모든 명령과 액션을 완전히 구현하지 않고도 코드를 성공적으로 실행할 수 있습니다.

마찬가지로 passwhile 루프, 선택 및 함수 정의 등에서 사용할 수 있습니다.

while x == y:
    pass

목록의 다른 부분을 다른 단계 크기로 반복

긴 요소 목록이 있고 목록의 다른 모든 요소에만 관심이 있다고 가정 해보십시오. 아마도 첫 번째 또는 마지막 요소 또는 목록의 특정 범위의 항목을 검사하기 만하면됩니다. 파이썬은 강력한 인덱싱 내장 기능을 제공합니다. 다음은 이러한 시나리오를 달성하는 방법에 대한 몇 가지 예입니다.

다음은 예제 전체에서 사용되는 간단한 목록입니다.

lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']

전체 목록 반복

목록의 각 요소를 반복하려면 다음과 같은 for 루프를 사용할 수 있습니다.

for s in lst:
    print s[:1] # print the first letter

for 루프는 lst 각 요소에 s를 할당합니다. 그러면 다음과 같이 인쇄됩니다.

a
b
c
d
e

종종 해당 요소의 요소와 색인이 모두 필요합니다. enumerate 키워드는 해당 작업을 수행합니다.

for idx, s in enumerate(lst):
    print("%s has an index of %d" % (s, idx))

인덱스 idx 는 각 반복마다 0부터 증가하고, s 는 처리되는 요소를 포함합니다. 이전 스 니펫은 다음과 같이 출력됩니다.

alpha has an index of 0
bravo has an index of 1
charlie has an index of 2
delta has an index of 3
echo has an index of 4

하위 목록 반복

범위를 반복하고 싶다면 (파이썬이 0부터 시작하는 인덱싱을 사용한다는 것을 기억하자) range 키워드를 사용한다.

for i in range(2,4):
    print("lst at %d contains %s" % (i, lst[i]))

그러면 다음과 같이 출력됩니다.

lst at 2 contains charlie
lst at 3 contains delta

목록은 슬라이스 될 수도 있습니다. 다음 슬라이스 표기법은 인덱스 1의 요소에서 끝까지 2 단계로 진행됩니다. 두 개의 for 루프는 동일한 결과를 제공합니다.

for s in lst[1::2]:
    print(s)

for i in range(1, len(lst), 2):
    print(lst[i])

위의 스 니펫은 다음을 출력합니다.

bravo
delta

인덱싱 및 분할 은 자체적 인 주제입니다.

"하프 루프"do-while

다른 언어와 달리 Python에는 do-until 또는 do-while 구문이 없습니다 (조건이 테스트되기 전에 코드가 한 번 실행될 수 있습니다). 그러나, 당신은 결합 할 수 있습니다 while Truebreak 같은 목적을 달성하기 위해.

a = 10
while True:
    a = a-1
    print(a)
    if a<7:
        break
print('Done.')

그러면 다음과 같이 인쇄됩니다.

9
8
7
6
Done.

루핑 및 풀기

예를 들어 튜플 목록을 반복하려면 다음을 수행하십시오.

collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]

이런 식으로 뭔가를하는 대신 :

for item in collection:
    i1 = item[0]
    i2 = item[1]
    i3 = item[2]
    # logic

또는 이와 비슷한 것 :

for item in collection:
    i1, i2, i3 = item
    # logic

다음과 같이하면됩니다.

for i1, i2, i3 in collection:
    # logic

이는 튜플이 아닌 대부분의 유형의 iterable에도 적용됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow