상황: for in 구문에서 범위를 지정하는 부분을 정수로 주었을때 나타나는 오류. for 반복문 쓸때 제일 많이 볼 수 있다.
예를 들면 다음 코드를 실행하면 바로 이 오류가 뜬다.
for i in 10:
print(i)
오류 발생 이유: iterable 객체 자리에 정수형 자료(int)를 입력했기 때문. C++처럼 10을 넣으면 10번을 반복해준다는게 아니다. iterable 객체에서 자료를 하나씩 꺼내오는 것이기 때문.
iterable 객체 - 리스트(list), 튜플(tuple), 딕셔너리(dict), 집합(set), 문자열(str), range(범위값)
해결법: iterble 객체를 입력하면 됨. 특히 위의 상황처럼 10번을 반복하고 싶다면 range(10)을 입력해서 실행하자.
파이썬의 for in 반복문은 C++의 그것과 다름을 인지하자.
def makeScode3(ttt=''):
ttt=txt.strip()
parts=ttt.split("','")
lim=round(len(parts)/8)
sssdict={}
for i in range(lim):
seed=i*8+1
scode=parts[seed]
com=parts[seed+1].strip()
sssdict[scode]=com
return sssdict
makeScode3(txt)
오류 발생 이유: for문의 iterable 객체에서 가져올 수 있는 인덱스의 수를 초과해서 for문이 실행되기 때문에 발생한다.
위 코드에서는 원본 자료에서 일정 부분만 추출할 때, 특정 문자를 찾을 때 실행되는 코드가 전체 문자열 개수보다 훨씬 더 많이 실행되기 때문이다.
해결법: for문의 실행 순서를 차례차례 따져보면서(i를 함께 출력) iterable 객체의 인덱스보다 얼마나 과도하게 초과하는지, 초과한다면 어떻게 조절할지를 판단해서 수정한다.
# 성공 한 경우(사실 이것도 약간 부족)
a='banana'
for i in range(len(a)):
b=a.index('a',i)
print(i,b)
a='banana'
a.index('k')