enumerate()와 range(len())의 차이를 이해해야 한다. data의 길이를 기준으로 인덱스만 필요하면 range(len(data))를 사용하고, 인덱스와 값을 함께 사용할 필요가 있으면 enumerate(data)를 활용한다. start 매개변수의 오해로, enumerate(start=1)은 출력 번호만 바뀌고 실제 인덱스는 0에서 시작하는 점을 명확히 구분한다.
zip()의 반복 범위 역시 주의가 필요하다. 여러 시퀀스 중 가장 짧은 길이까지만 반복되므로 길이가 다른 경우 짧은 쪽에 맞춰 종료된다. 슬라이싱의 끝값은 포함되지 않는다는 점도 자주 헷갈린다. 예를 들어 data[1:4]는 인덱스 1, 2, 3에 해당하는 요소들만 포함된다. 슬라이싱 후 인덱스가 다시 0부터 시작되는 점도 기억해야 한다. 예를 들어 part = data[2:]는 부분 데이터의 인덱스가 0부터 재시작된다.
step의 계산은 신중히 다뤄야 한다. 예를 들어 range(0, 10, 2)에서는 0, 2, 4, 6, 8이 나와야 하며, step이 0이면 ValueError가 발생한다. 증가 방향과 감소 방향의 혼동도 흔하다. range(10, 0, 1)은 아무 것도 반복되지 않는다. 또한 range(5, 5)처럼 시작과 끝이 같은 경우에는 반복이 일어나지 않음을 명확히 한다.
reversed(range())의 동작 차이를 이해해야 한다. reversed(range(5))는 4, 3, 2, 1, 0으로 역순으로 순회한다. 반복 중 데이터의 변경은 주의가 필요하다. pop()이나 append()를 사용해도 반복 횟수에는 영향을 주지 않는다. 문자열과 튜플은 불변이므로 인덱스로 값을 수정할 수 없다.
딕셔너리나 셋은 인덱스 접근이 다르게 작동한다. set_data[0]은 TypeError를, dict_data[0]은 KeyError를 발생시킬 수 있다. 다차원 리스트의 길이도 주의가 필요하다. 각 행의 길이가 다를 수 있어 len(matrix[i])로 확인이 필요하다. 길이가 다르면 IndexError가 발생할 여지가 커진다. 반복 변수 변경에 대해서도 주의가 필요하다. for i in range(5)에서 i를 100으로 바꿔도 반복은 여전히 0에서 4까지 진행된다.
반복문 내에서의 흐름 제어도 정확히 파악해야 한다. continue는 현재 반복만 건너뛰고 다음 반복으로 넘어가며, break는 전체 반복을 종료한다. 반복 종료 후 변수 상태는 마지막 반복의 값이나, 한 번도 실행되지 않으면 생성되지 않는 점도 주의한다. 중첩 반복문에서 내부 변수가 외부 변수를 덮어쓰면 논리 오류가 발생한다. range()의 범위는 고정되어 있어 중간에 값을 바꿔도 반복 범위에 영향을 주지 않는다.
#
for문
#
파이썬실수
#
파이썬반복문
#
파이썬독학
#
파이썬공부
#
파이썬
#
코딩독학
#
while문
#
Python
#
파이썬에러