파이썬의 루프문(for, while)
1. while
1
2
3
4
while True:
print(num1 % 2)
num1 //= 2
if num1 == 0: break
파이썬의 while문은 while 키워드, 조건식, 콜론 연산자로 이루어진다. 함수 선언과 마찬가지로 while문의 콜론 연산자 뒤에는 다른 구문을 쓸 수 없다.
1
2
3
4
5
6
while num1 > 0:
print(num1 % 2)
num1 //= 2
if num1 == 1: break
else:
print("while문 중단된 적 없음")
while문이 끝나는 지점에 else: 구문을 사용할 수 있다. 이 else: 구문은 for문 내부 루프가 break 명령으로 수행 도중 중단되는 일 없이 끝까지 수행되었 때 수행된다.
2. for
1
2
3
list1 = [1, 2, 3, 4, 5]
for elem in list1:
print(elem)
파이썬의 for문은 for와 in 키워드, iterable한 객체, 객체의 원소를 받을 변수명, 콜론으로 이루어진다.
1
2
3
list1 = [[1, 2], [3, 4], [5, 6]]
for e1, e2 in list1:
print(e1, e2)
in 예약어 뒤에 놓는 객체의 유형에 따라 객체의 원소를 받을 변수명을 둘 이상 쓸 수도 있다. 위 코드는 각 행이 2개의 원소를 갖는 2차원 리스트에서 각 행의 원소들을 e1과 e2라는 변수에 담도록 한 코드이다.
1
2
3
4
for i in range(10):
if i > 5: break
else:
print("for문 중단된 적 없음")
for문이 끝나는 지점에도 while문의 경우와 같이 else: 구문을 사용할 수 있다.
한편, for문이 break에 의해 중단되는 경우, 그 for문 바로 밖에서는 중단된 시점에 for문 내부에서 쓰이던 값(예를 들면, for와 in 사이에 쓰는 위 코드의 i 같은 변수)을 그대로 쓸 수 있다.
* range() 함수
1
2
3
4
r1 = range(1, 10, 2)
r2 = range(1, 5)
r3 = range(5)
r4 = range(10, 1, -1)
- range() 함수는 처음값, 끝값, 간격을 인자로 받는 함수로서 리턴값으로 처음값부터 끝값까지 주어진 간격만큼 증가하는 수로 구성된 range형 객체를 리턴한다. range형 객체는 iterable하므로 이러한 특성을 이용할 때 많이 쓰인다. for문의 in 예약어 뒤에 쓸 수 있어 for문을 쓸 때 많이 쓴다.
- range() 함수의 인자 중 간격과 처음값은 생략 가능하다. 위 코드의 경우 r1에는 1, 3, 5, 7, 9가, r2에는 1, 2, 3, 4가, r3에는 0, 1, 2, 3, 4가 각각 저장된다.
- range() 함수의 끝값이 반드시 처음값보다 커야 하는 것은 아니지만, 끝값이 처음값보다 작은 경우 간격 인자를 음수로 넣어주어야 한다.
* enumerate() 함수
1
2
for idx, elem in enumerate([2, 3, 5, 7]):
print("{}번째 인덱스의 원소는 {}".format(idx, elem))
- enumerate() 함수는 iterable 객체를 인자로 받아 enumerate형 객체를 리턴한다. enumerate형 객체는 각 행이 튜플형 객체로 이루어져 있으며, 각 행의 첫 번째 인덱스의 원소는 그 행의 인덱스가 저장돼 있다. enumerate형 객체는 iterable하므로 for문에 쓸 수 있다.
- for문을 쓰다 보면 내부 내용에서 리스트, 튜플 등의 객체의 엘리먼트와 인덱스가 동시에 필요한 경우가 많다. 이럴 때 enumerate 객체를 사용하면 간편하게 엘리먼트와 인덱스 모두 사용할 수 있다.