본문 바로가기
C++ 200제/코딩 IT 정보

파이썬 for문(반복 루프) 사용법 12가지

by vicddory 2019. 5. 16.
반응형

Python for문을 활용한 루프 처리 방법을 설명합니다.

  • 기본문법
  • 편리한 기능
  • 다른 주제

파이썬 for문(반복 루프) 사용법 12가지

목차

     

    기본적인 문법

    Python for문 기본 사용법

    C언어 계열 프로그래밍 언어의 for문 (for 루프)은 카운터 변수(인덱스)와 조건을 사용하여 작성합니다.

     

    1
    2
    for (int i = 0; i < 10; i++
        처리
    cs

     

    Python for문은 C언어 계열과 달리 카운터 변수(인덱스)를 사용하지 않습니다.

     

    1
    2
    for 변수 이름 in 이터레이터 오브젝트 : 
        처리
    cs

     

    다른 언어의 foreach 문에 해당합니다. 리스트(배열) 등 개체 요소가 차례로 변수에 할당되어 처리됩니다.

     

    구체적인 예는 다음과 같습니다.

     

    1
    2
    3
    4
    5
    6
    7
    = ['Alice''Bob''Charlie']
     
    for name in l:
        print(name)
    # Alice
    # Bob
    # Charlie
    cs

     

    조건에 따라 중간 종료 : break

    for 문 중간에 프로세스를 종료하려면 break를 사용합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    = ['Alice''Bob''Charlie']
     
    for name in l:
        if name == 'Bob':
            print('!!BREAK!!')
            break
        print(name)
    # Alice
    # !!BREAK!!
    cs

     

    특정 요소 처리를 생략 : continue

    특정 요소에 대한 처리를 생략하려면 continue를 사용합니다.

    break는 for 루프 전체가 종료되지만, continue는 해당 요소에 대해서만 처리가 생략되므로 for 루프는 끝까지 실행됩니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    = ['Alice''Bob''Charlie']
     
    for name in l:
        if name == 'Bob':
            print('!!SKIP!!')
            continue
        print(name)
    # Alice
    # !!SKIP!!
    # Charlie
    cs

     

    for 루프 완료 후 처리 : else

    for문 루프가 종료된 후 어떤 작업을 수행하려면 else를 사용합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    = ['Alice''Bob''Charlie']
     
    for name in l:
        print(name)
    else:
        print('!!FINISH!!')
    # Alice
    # Bob
    # Charlie
    # !!FINISH!!
    cs

     

    break에 의해 중간에 종료된다면 else는 실행되지 않습니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    for name in l:
        if name == 'Bob':
            print('!!BREAK!!')
            break
        print(name)
    else:
        print('!!FINISH!!')
    # Alice
    # !!BREAK!!
    cs

     

    continue의 경우 for 루프가 끝까지 실행되므로 else가 실행됩니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for name in l:
        if name == 'Bob':
            print('!!SKIP!!')
            continue
        print(name)
    else:
        print('!!FINISH!!')
    # Alice
    # !!SKIP!!
    # Charlie
    # !!FINISH!!
    cs

     

     

    for문에서 사용하면 편리한 기능

    인덱스 (카운터) : range () 함수

    Python for 문에서 인덱스(카운터)를 얻고 싶을 때 range()함수를 사용합니다.

     

    1
    2
    3
    4
    5
    for i in range(3):
        print(i)
    # 0
    # 1
    # 2
    cs

     

    range() 함수가 range 클래스의 생성자입니다.

     

    1
    2
    3
    4
    print(range(3))
    print(type(range(3)))
    # range(0, 3)
    # <class 'range'>
    cs

     

    설명을 위해 list() 요소를 출력하여 표시해 보겠습니다.

     

    range(stop)에서 0 <= i < stop 인덱스 번호를 반환합니다.

     

    1
    2
    3
    4
    5
    print(list(range(3)))
    # [0, 1, 2]
     
    print(list(range(6)))
    # [0, 1, 2, 3, 4, 5]
    cs

     

    0부터 시작이 아니라 범위를 지정하고 싶다면, range(start, stop)와 같이 2개의 인수를 지정합니다.

     

    start <= i < stop을 통해 인덱스를 반환합니다.

     

    1
    2
    print(list(range(1013)))
    # [10, 11, 12]
    cs

     

    또한, 1이 아니라 다른 숫자만큼 증가하고 싶다면 range(start, stop, step)와 같이 3개의 인수를 지정합니다.

     

    start <= i < stop 범위에서 스텝(3)에 맞는 정수를 출력합니다.

     

    1
    2
    print(list(range(0103)))
    # [0, 3, 6, 9]
    cs

     

    step에는 음수 값을 지정할 수도 있습니다.

     

    1
    2
    print(list(range(100-3)))
    # [10, 7, 4, 1]
    cs

     

    for 문에서 실행하면 다음과 같습니다.

     

    1
    2
    3
    4
    5
    6
    for i in range(100-3):
        print(i)
    # 10
    # 7
    # 4
    # 1
    cs

     

    LIST For문 함께 사용하기

     

     

     

     

    LIST 요소와 인덱스 : enumerate () 함수

    리스트(배열) 등의 요소를 인덱스(카운터)와 함께 얻으려면 enumerate()함수를 사용합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    = ['Alice''Bob''Charlie']
     
    for name in l:
        print(name)
    # Alice
    # Bob
    # Charlie
     
    for i, name in enumerate(l):
        print(i, name)
    # 0 Alice
    # 1 Bob
    # 2 Charlie
    cs

     

    enumerate() 함수의 두 번째 인수는 시작 값입니다. 0 부터가 아니라 시작이 임의의 정수 값부터 시작합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i, name in enumerate(l, 1):
        print(i, name)
    # 1 Alice
    # 2 Bob
    # 3 Charlie
     
    for i, name in enumerate(l, 42):
        print(i, name)
    # 42 Alice
    # 43 Bob
    # 44 Charlie
    cs

     

    enumerate() 함수에 step을 지정하는 인수는 없지만, 다음과 같이하면 코딩하면 똑같이 흉내낼 수 있습니다.

     

    1
    2
    3
    4
    5
    6
    step = 3
    for i, name in enumerate(l):
        print(i * step, name)
    # 0 Alice
    # 3 Bob
    # 6 Charlie
    cs

     

    LIST의 요소 (복수 변수) : zip () 함수

    LIST 개체(목록)의 요소를 여러 변수로 정리하고 싶다면 zip()함수를 사용합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    names = ['Alice''Bob''Charlie']
    ages = [245018]
     
    for name, age in zip(names, ages):
        print(name, age)
    # Alice 24
    # Bob 50
    # Charlie 18
    cs

     

    변수 2개에 한정하지 않고, 3개 이상의 개체로 정리할 수도 있습니다.

     

    1
    2
    3
    4
    5
    6
    7
    points = [1008590]
     
    for name, age, point in zip(names, ages, points):
        print(name, age, point)
    # Alice 24 100
    # Bob 50 85
    # Charlie 18 90
    cs

     

    예제처럼 zip() 함수를 통해 여러 요소를 순차적으로 얻을 수 있습니다.

     

    LIST 요소와 인덱스 : enumerate(), zip() 함수

    LIST의 여러 개체(목록)에서 요소와 인덱스(카운터)를 동시에 얻으려면 enumerate(), zip() 함수를 함께 사용합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    names = ['Alice''Bob''Charlie']
    ages = [245018]
     
    for i, (name, age) in enumerate(zip(names, ages)):
        print(i, name, age)
    # 0 Alice 24
    # 1 Bob 50
    # 2 Charlie 18
    cs

     

    역순 : reversed () 함수

    요소를 역순으로 얻으려면 reversed() 함수를 사용합니다.

     

    1
    2
    3
    4
    5
    6
    7
    = ['Alice''Bob''Charlie']
     
    for name in reversed(l):
        print(name)
    # Charlie
    # Bob
    # Alice
    cs

     

    range 개체도 역순으로 얻을 수 있습니다. reversed() 함수를 사용하지 않고 step에 음수 값을 지정합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for i in reversed(range(3)):
        print(i)
    # 2
    # 1
    # 0
     
    for i in range(2-1-1):
        print(i)
    # 2
    # 1
    # 0
    cs

     

    enumerate 객체는 반전이 안 됩니다. 그래서 list()로 변경합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # for i, name in reversed(enumerate(l)):
    #     print(i, name)
    # TypeError: 'enumerate' object is not reversible
     
    for i, name in reversed(list(enumerate(l))):
        print(i, name)
    # 2 Charlie
    # 1 Bob
    # 0 Alice
    cs

     

    인덱스(카운터)를 뒤집지 않으려면 enumerate() 가운데 reversed()를 추가하여 사용합니다.

     

    1
    2
    3
    4
    5
    for i, name in enumerate(reversed(l)):
        print(i, name)
    # 0 Charlie
    # 1 Bob
    # 2 Alice
    cs

     

    zip 개체도 반전이 안 됩니다. 그래서 list로 변경하여 출력해 봅니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    l2 = [245018]
     
    # for name, age in reversed(zip(l, l2)):
    #     print(name, age)
    # TypeError: 'zip' object is not reversible
     
    for name, age in reversed(list(zip(l, l2))):
        print(name, age)
    # Charlie 18
    # Bob 50
    # Alice 24
    cs

     

    다중 루프 : itertools.product()함수

    Python에서 다중 루프는 다음과 같이 사용할 수 있습니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    l1 = [123]
    l2 = [102030]
     
    for i in l1:
        for j in l2:
            print(i, j)
    # 1 10
    # 1 20
    # 1 30
    # 2 10
    # 2 20
    # 2 30
    # 3 10
    # 3 20
    # 3 30
    cs

     

    표준 라이브러리 itertools 모듈의 itertools.product() 함수를 사용합니다. for문을 중첩하여 사용하지 않고 다중 루프와 비슷한 결과를 얻을 수 있습니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import itertools
     
    l1 = [123]
    l2 = [102030]
     
    for i, j in itertools.product(l1, l2):
        print(i, j)
    # 1 10
    # 1 20
    # 1 30
    # 2 10
    # 2 20
    # 2 30
    # 3 10
    # 3 20
    # 3 30
    cs
     

    다른 주제

    DICTIONARY for 루프

    딕셔너리 dict의 개체를 for 루프로 돌려 키를 얻을 수 있습니다.

     

    1
    2
    3
    4
    5
    6
    7
    = {'key1'1'key2'2'key3'3}
     
    for k in d:
        print(k)
    # key1
    # key2
    # key3
    cs

     

    값, 키, 둘 다 등을 원한다면 values() 메소드, items() 메소드를 사용합니다.

     

    1
    2
    3
    4
    5
    for v in d.values():
        print(v)
    # 1
    # 2
    # 3
    cs

     

    1
    2
    3
    4
    5
    for k, v in d.items():
        print(k, v)
    # key1 1
    # key2 2
    # key3 3
    cs

     

    List 내포

    LIST(배열) 등의 요소를 통해 새로운 리스트를 생성한다면, for문보다 내포를 사용하세요.

     

    LIST 내포 표기는 다음과 같습니다.

     

    1
    [식 for 변수 이름 in 개체 ]
    cs

     

    for 반복문을 통해 예제를 소개합니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    squares = [i**2 for i in range(5)]
    print(squares)
    # [0, 1, 4, 9, 16]
     
    squares = []
    for i in range(5):
        squares.append(i**2)
     
    print(squares)
    # [0, 1, 4, 9, 16]
    cs

     

    LIST 내포를 사용하면 내부 요소를 처리할 수 있습니다. 또한, 조건에 따라 요소를 추출해 새로운 LIST를 생성할 수 있습니다.

     

    파이썬 추가 정보

     

    반응형