파이썬과 반복문 (2)
이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.
for
자칭 수학마스터 김씨는 딱 보면 이 수가 홀수인지 짝수인지 바로 판별할 수 있다고 자랑하고 있다. 이게 자랑할만한 거리인지는 모르겠지만, 최씨는 김씨의 자신감을 키워주기 위해 하나의 숫자 리스트를 만들어서 홀수/짝수 맞추기 퀴즈를 시켜보려고 한다.
다음과 같인 숫자 리스트가 주어졌다고 생각해보자.
numbers = [9,3,12,34,132,87,35,75,32,6,10]
각각의 수가 홀수인지 짝수인지 대답하려면, numbers
리스트에 있는 수들을 모두 순회하여야 한다. 어떻게 해야할까?
이전에 배운 반복문으로 어떻게든 될 것 같다.
리스트에 들어있는 데이터의 수를 가져오는 함수는 len()이다.
그리고 리스트의 각 항목의 인덱스는 0에서부터 len() - 1이 될 것이다.
그러면 이렇게 순회할 수 있지 않을까?
index = 0
while index < len(numbers) :
print(numbers[index])
index += 1
현재 탐색중인 리스트의 항목을 index
로 관리하는 방식이다. 리스트의 index
번째 항목을 출력한 후, 다음 항목을 탐색하기 위해 index += 1
을 해 주는 방식으로 반복문을 수행하는 방식으로, index
의 값이 리스트의 크기만큼 되었다면, 이제 모든 리스트의 항목을 순회한 것이 되므로 반복문을 탈출하게 된다.
사실 이렇게 해도 상관은 없다. 하지만 Python은 더 깔끔한 방법을 제공한다.
for
라는 기능이 있다. for는 이렇게 생겼다.
for item in iterable:
code
먼저 iterable
이란 것부터 알아보자.
iterable
은 순회 가능한 객체를 의미한다. 그러면 ‘순회 가능한 객체가 뭐냐?’ 라는 질문이 나올 수 있다. 간단히 이야기 하자면 자신이 가진 항목을 순회할 수 있는 객체라고 보면 되는데, 말만 들어서는 딱히 감이 잡히지 않을 것이다. 일단은 순회 가능한 것들 중엔 문자열, 리스트, 튜플이 있다고 알아두자.
그리고 iterable
에 있는 항목들을 item
으로 받아온다.
while을 사용하여 리스트의 데이터들을 하나씩 가져왔을 때, 우리는 numbers[index]
를 통해 가져왔다. numbers[index]
에 해당하는 것이 item
이라고 보면 된다. while을 쓸 때는 index의 값을 하나씩 올려줘야 했지만, for를 사용하면 그럴 필요가 없다!
그러면 위의 while을 사용한 코드를 for로 바꿔보자.
for number in numbers :
print(number)
while로 작성한 코드와 for로 작성한 코드를 실행시켜보면 둘 다 똑같은 결과가 나오는 것을 알 수 있다.
만약 순회 가능한 객체의 모든 항목을 살펴보고자 한다면, for를 사용하는 것이 가장 깔끔한 방법이라는 것을 기억해두자.
continue
깔끔하게 리스트의 항목들을 순회하는 방법도 배웠겠다, 이제 현재 순회중인 숫자가 홀수인지 짝수인지만 확인하는 코드를 추가하면 될 것 같다.
홀수와 짝수를 구분하는 방법은, 2로 나누어서 나머지가 있는가를 확인하면 된다. 홀수면 나머지가 1이 될 것이고, 짝수면 나머지가 0이 될 것이다.
마침 우리는 나머지를 계산하는 연산인 % 연산을 배운 적이 있다. 따라서 숫자 % 2 == 0
이면 짝수가 될 것이고, 아니면 홀수가 될 것이다. 이를 코드로 표현하면 다음과 같이 표현할 수 있을 것이다.
mathMasta.py
numbers = [9,3,12,34,132,87,35,75,32,6,10]
for number in numbers:
if number%2 == 0:
print('짝수!')
else:
print('홀수!')
그런데 최씨가 리스트를 만드는 도중, 숫자 말고 문자열도 같이 넣어버렸다.
numbers = [9,3,12,'hello',34,132,87,35,75,32,6,10,'coffee']
문자열은 숫자가 아니다. 따라서 특정 문자열이 홀수인지 짝수인지 판단할 수 없다. 따라서 순회 도중에 문자열을 만나면 에러가 발생하게 된다.
최씨가 리스트에 숫자만 넣어주면 가장 좋은 해결방법이 되겠으나, 최씨는 이런 실수를 자주 저지르는 사람이다. 그래서 애초에 숫자가 아니라면 그냥 넘어가는 코드를 추가로 작성하고자 한다. 그러면 어떻게 해야할까?
if type(number) is int:
print('이건 정수야!')
type()을 이용하여 이 데이터의 타입이 무엇인지 알아낼 수 있다.
그리고 type(data) is int
를 통해 data
의 타입이 정수형인지 아닌지를 확인할 수 있다.
type(data) == int 로 해도 된다.
그러면 이렇게 코드를 작성할 수 있을 것 같다.
for number in numbers:
if type(number) is int:
if number%2 == 0:
print('짝수!')
else:
print('홀수!')
이러면 홀수/짝수 확인을 현재 순회중인 항목 number
가 정수형일때만 실행하게 된다.
하지만 continue라는 기능을 사용할 수도 있다.
continue는 반복문 실행 도중에 만나게 되면, 그 즉시 반복문을 중단하고 반복문의 처음으로 돌아간다.
break와 약간은 비슷하다고 할 수 있는데, break는 만나는 즉시 반복문을 탈출하지만, continue는 만나는 즉시 반복문을 다시 시작한다.
continue를 사용해서 위의 코드를 다시 작성한다면, 이렇게 할 수 있다.
mathMasta_continue.py
for number in numbers:
if type(number) is not int:
continue
if number%2 == 0:
print('짝수!')
else:
print('홀수!')
이렇게 하면 number
가 정수형이 아니라면 continue를 만나서 다음 numbers
의 항목을 수행하도록 하고, 정수형이라면 그대로 number
가 홀수인지 짝수인지 확인하는 코드를 실행하게 된다.
필요에 따라 break와 continue를 적절하게 활용하여 반복문을 알맞게 사용할 수 있도록 해 보자.
Comments