ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Tip - range 보다는 enumerate를 사용
    언어/파이썬 & 장고 2016. 10. 9. 17:47

    내장 함수 range는 정수 집합을 순회(iterate)하는 루프를 실행할 때 유용합니다.

    random_bits = 0
    for i in range(64):
        if randint(0, 1):
            random_bits |= 1 << i


    물론 문자열의 리스트 같이 순회할 자료 구조가 있을땐 직접 루프를 실행할 수 있습니다.

    list = ['a', 'b', 'c']
    for vals in list:
    	print(vals)


    종종 리스트를 순회하거나 리스트의 현재 아이템의 인덱스를 알아야 하는 경우가 있습니다.

    예를 들어 좋아하는 아이스크림의 순위를 출력하는 예제를 코딩하는 한 가지 방법은 range를 사용하는 것입니다.

    flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']
    for i in range(len(flavor_list)):
        flavor = flavor_list[i]
        print('%d: %s' % (i + 1, flavor))


    위의 코드는 리스트의 길이를 알아내야 하고 배열을 인덱스로 접근해야 하며 읽기 불편합니다.

    파이썬은 이런 상황을 처리하기 위해 내장 함수 enumerate를 제공합니다. enumerate는 지연 제너레이터(lazy generator)로 이터레이터를 감쌉니다. 이 제너레이터는 이터레이터에서 루프 인덱스와 다음 값을 한 쌍으로 가져와 넘깁니다.

    flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']
    for i, flavor in enumerate(flavor_list):
        print('%d: %s' % (i + 1, flavor))
    # 결과
    # 1: vanilla
    # 2: chocolate
    # 3: pecan
    # 4: strawberry


    enumerate로 세기 시작할 숫자를 지정하면 코드를 더 짧게 만들 수 있습니다.

    flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']
    for i, flavor in enumerate(flavor_list, 10):
        print('%d: %s' % (i + 1, flavor))
    # 결과
    # 11: vanilla
    # 12: chocolate
    # 13: pecan
    # 14: strawberry

    요약

    enumerate는 이터레이터를 순회하면서 이터레이터에서 각 아이템의 인덱스를 얻어오는 간결한 문법을 제공

    range로 루프를 실행하고 시퀀스에 인덱스로 접근하기보다는 enumerate를 사용하는게 좋음

    enumerate에 두 번째 파라미터를 사용하면 세기 시작할 숫자를 지정할 수 있음 (기본값 0)

    댓글