while문은 로직을 실행 후 조건을 확인하러 다시 올라오지만,

for문은 조건을 확인한 후 그 횟수만큼 로직을 실행한다.

따라서, for문은 while문과 달리 조건의 반복 횟수나 로직의 실행에서 오류가 나기 쉽다.

 

1. (for문의 반복 횟수) >  (로직의 함수가 실행 가능한 횟수)로 로직이 실행되지 못 해 오류 발생

"A02"가 1개밖에 없는데 2번 이상 반복해서 삭제하라 하면 remove 함수가 지울 대상이 없어 오류가 생긴다. 따라서, 반복 횟수를 줄이거나 로직에 조건문을 사용하여 무조건 함수가 실행되지 않도록 하여 해결.

 

 

TestList = ["한국","A01","프랑스","A02","독일","A03"] 에서 국가 이름만 뽑아내고 싶다고 해보자.

2. 원본 리스트 값의 삭제로 리스트가 짧아져 발생하는 오류

국가 이름만 뽑아내려고 "A"가 1개 이상 포함된 리스트를 제거한 다음 출력하려 하였지만 len(TestList) = 6인데 del 함수로 인해 리스트 자체가 작아져 버려서

i = 0,  TestList[0] = 한국, pass, TestList = ["한국","A01","프랑스","A02","독일","A03"]

i = 1, TestList[1] = A01, del, TestList = ["한국","프랑스","A02","독일","A03"]

i = 2, TestList[2] = A02, del, TestList = ["한국","프랑스","독일","A03"]

i = 3, TestList[3] = A03, del, TestList = ["한국","프랑스","독일"]

i = 4, TestList[4] = error 리스트가 0~3인데 4를 호출하게 됨으로 에러 발생.

따라서 범위를 0 ~ 4 전까지, 즉, in range(0,4,)로 줄여야 한다. → 반복 횟수를 줄여서 해결

하지만 가장 좋은 방법은 홀수값만 뽑아내는거다.

홀수라 하면 1, 3, 5, ... 니까 2, 4, 6, ... 을 삭제하면 된다고 생각해 for문에 +2로 옵션을 주면 반복 횟수를 줄여 로직은 오류가 발생하지 않더라도 다음과 같은 문제가 발생한다.

3.값이 삭제됨에 따라 리스트 내 값의 순서가 바뀌어서 발생하는 문제

횟수를 제한해서 반복문은 에러 없이 돌아갔지만, 원본 리스트 내 이 삭제됨에 따라 순서가 바뀌어 원하는 값이 나오지 않음.

따라서, 홀수값을 추출하거나 짝수값을 추출할 때는 하나의 빈 리스트를 생성하고 그 리스트에 값을 집어 넣는게 좋다.

 

 

홀수값만 뽑아내기

위 방법 3가지는 모두 리스트의 개수가 홀수든 짝수든 동일하게 작동하는걸 볼 수 있다.

반복문 사용하지 않기를 꼭 확인하자

 

 

짝수값만 뽑아내기

위 방법 3가지는 모두 리스트의 개수가 홀수든 짝수든 동일하게 작동하는걸 볼 수 있다.

반복문 사용하지 않기를 꼭 확인하자

 

 

그리고 마지막으로, 반복문이나 조건문은 최소한으로 사용하는게 좋다. 반복문이나 조건문이 많아질수록 코드 실행은 느려지고, 설명하기 힘들어진다. 위에서 본 2번 '원본 리스트 값의 삭제로 리스트가 짧아져 발생하는 오류' 보다 '홀수값만 뽑아내기'가 더 좋은 코드다.

반복문의 횟수가 너무 커져 무한루프에 가깝게 빠지는 예를 다음 링크로 추가한다.

너무 많은 반복문 횟수로 인한 문제

+ Recent posts