Python(파이썬) 기본 - 19. for in 반복문, Range, enumerate

아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.

1. for in 반복문

  • 여타 다른 언어에서는 일반적인 for문, foreach문, for of문등 여러가지 방식을 한꺼번에 지원하는 경우가 많습니다.
  • Python에서는 for in문 한가지 방식의 for 문만 제공합니다.
  • REPL 에서 확인해보겠습니다.

  • for in 문 형식 입니다.
  • iterable은 사전적의미와 똑같이 반복가능한 객체를 말합니다.
      for item in iterable:
          ... 반복할 구문...
    
  • iterable 객체를 판별하기 위해서는 아래의 방법이 있습니다.
  • collections.Iterable에 속한 instance인지 확인하면 됩니다.
  • isinstance 함수는 첫번째 파라미터, 두번째 파라미터 클래스의 instance이면 True를 반환합니다.

      >>> import collections
        
      # iterable 한 타입
      >>> var_list = [1, 3, 5, 7]
      >>> isinstance(var_list, collections.Iterable)
      True
      >>> var_dict = {"a": 1, "b":1}
      >>> isinstance(var_dict, collections.Iterable)
      True
      >>> var_set = {1, 3}
      >>> isinstance(var_set, collections.Iterable)
      True
      >>> var_str = "abc"
      >>> isinstance(var_str, collections.Iterable)
      True
      >>> var_bytes = b'abcdef'
      >>> isinstance(var_bytes, collections.Iterable)
      True
      >>> var_tuple = (1, 3, 5, 7)
      >>> isinstance(var_tuple, collections.Iterable)
      True
      >>> var_range = range(0,5)
      >>> isinstance(var_range, collections.Iterable)
      True
    
      # iterable하지 않은 타입
      >>> var_int = 932
      >>> isinstance(var_int, collections.Iterable)
      False
      >>> var_float = 10.2
      >>> isinstance(var_float, collections.Iterable)
      False
      >>> var_none = None
      >>> isinstance(var_none, collections.Iterable)
      False
    
  • 앞서 다룬 타입 중 list, dictionary, set, string, tuple, bytes가 iterable한 타입입니다.
  • range도 iterable 합니다. 이번 포스트 아래쪽에서 다루겠습니다.

  • for문을 동작시켜봅니다.
      >>> for i in var_list:
      ...     print(i)
      ... 
      1
      3
      5
      7
      >>> for i in var_dict:
      ...     print(i)
      ... 
      a
      b
      >>> for i in var_set:
      ...     print(i)
      ... 
      1
      3
      >>> for i in var_str:
      ...     print(i)
      ... 
      a
      b
      c
      >>> for i in var_bytes:
      ...     print(i)
      ... 
      97
      98
      99
      100
      101
      102
      >>> for i in var_tuple:
      ...     print(i)
      ... 
      1
      3
      5
      7
      >>> for i in var_range:
      ...     print(i)
      ... 
      0
      1
      2
      3
      4
    
  • dictionary의 for문을 다시 보면 key값만 출력됩니다.
  • dictionary의 for문은 17.dictionary(딕셔너리) 포스팅에서 자세한 내용 확인 가능합니다.
      >>> for i in var_dict:
              ...     print(i)
              ... 
              a
              b
    

2. range

  • 위쪽 for문의 range 결과 값이 0, 1, 2, 3, 4 순서대로 결과 값이 출력되었습니다.
  • range는 range(시작숫자, 종료숫자, step)의 형태로 리스트 슬라이싱과 유사합니다.
  • range의 결과는 시작숫자부터 종료숫자 바로 앞 숫자까지 컬렉션을 만듭니다.
  • 시작숫자와 step은 생략가능합니다.
     >>> range(5)
     range(0, 5)
     >>> for i in range(5):
     ...     print(i)
     ... 
     0
     1
     2
     3
     4
    
  • range는 값을 확인하기 위해서 다른 순서 있는 컬렉션으로 변환해야합니다.
     >>> range(5,10)
     range(5, 10)
     >>> list(range(5,10))
     [5, 6, 7, 8, 9]
     >>> tuple(range(5,10))
     (5, 6, 7, 8, 9)
    
  • step을 사용해봅니다.
      >>> list(range(10,20,2))
      [10, 12, 14, 16, 18]
      >>> list(range(10,20,3))
      [10, 13, 16, 19]
    
  • 파이썬에서 권장하지 않는 패턴입니다.
      >>> s = [1, 3, 5]
      >>> for i in range(len(s)):
      ...     print(s[i])
      ... 
      1
      3
      5
    
  • 파이썬에서 권장하는 패턴
        
      >>> for v in s:
      ...     print(v)
      ... 
      1
      3
      5
        
    

3. enumerate

  • 반복문 사용 시 몇 번째 반복문인지 확인이 필요할 수 있습니다. 이때 사용합니다.
  • 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환합니다.
      >>> t = [1, 5, 7, 33, 39, 52]
      >>> for p in enumerate(t):
      ...     print(p)
      ... 
      (0, 1)
      (1, 5)
      (2, 7)
      (3, 33)
      (4, 39)
      (5, 52)
    
  • tuple형태 반환을 이용하여 아래처럼 활용할 수 있습니다.
      >>> for i, v in enumerate(t):
      ...     print("index : {}, value: {}".format(i,v))
      ... 
      index : 0, value: 1
      index : 1, value: 5
      index : 2, value: 7
      index : 3, value: 33
      index : 4, value: 39
      index : 5, value: 52