반복문이란 같은 작업을 반복하도록 지시하는 것이 반복문입니다.
예를 들어 "Hello World"를 5번 반복적으로 출력하고 싶다면 간단히 print를 5번 연속으로 사용하면 원하는 결과를 얻을 수 있습니다.
print("Hello World")
print("Hello World")
print("Hello World")
print("Hello World")
print("Hello World")
#출력
Hello World
Hello World
Hello World
Hello World
Hello World
하지만 100번 1000번 혹은 무한하게 반복 작업하고 싶을 때 코드를 계속 붙여넣기하는 것은 힘듭니다. 이때 사용하는 것이 반복문입니다.
파이썬 반복문은 for, while이 있습니다.
while의 기본구조는 아래와 같습니다.
while 조건:
본문1
본문2
...
while은 조건이 참일 때만 반복문을 수행합니다. 따라서 조건이 거짓이면 반복을 종료합니다.
cnt = 0
while cnt < 10:
cnt += 1
if cnt == 7:
cnt = 10
print(cnt)
print("while is done")
#출력
1
2
3
4
5
6
10
while is done
위 코딩은 다음 설명과 같이 실행됩니다.
1. cnt값이 0이므로 while의 조건문이 참이되어 cnt에 1을 더합니다.
2. 위 단계를 cnt가 7이 될때까지 반복합니다.
3. cnt가 7이 되는 순간 if문이 참이 되어 cnt가 10이 됩니다.
4. while의 조건문이 false가 되어 while이 종료되고 print("while is done")이 실행됩니다.
여기서 유의해야할 점은 cnt가 10이 되는 순간 while이 종료가 되는 것이 아니라는 겁니다.
while은 조건문의 변수가 변경되어 종료조건이 성립되어도 반복문이 자신의 조건을 검사할 때까지 본문을 실행합니다.
for문의 기본구조는 아래와 같습니다.
for 변수 in iterable:
본문1
본문2
...
여기서 iterable이란 반복 가능한 것을 의미합니다.
여기엔 str, list, tuple, range(), set,dict들이 사용 가능합니다.
iterable즉 list나 tuble, 문자열의 첫 번째 요소부터 마지막 요소까지 차례대로 변수에 대입되어 for문 안에 있는 본문을 실행합니다.
for문이 어떻게 사용되는지 알기 위해 list를 사용해보겠습니다.
list = ["one","two","three","four","five"]
for i in list:
print(i)
출력
one
two
three
four
five
이런식으로 for문은 list를 사용해서 작동할 때 list의 첫 번째 요소인 "one"이 먼저 변수 i에 대입된 후 print(i)가 실행됩니다. 이후 list의 마지막 요소까지 이를 반복 수행합니다.
이번엔 str을 사용해보겠습니다.
str = "abcde"
for i in str:
print(i)
#출력
a
b
c
d
e
list를 사용했을 때와 같은 메커니즘으로 str첫 문자인 a부터 변수i에 대입되어 print(i)가 실행되고 마지막 문자까지 반복 수행합니다.
앞에서 for을 사용할때 interable을 사용하여 범위를 설정해 사용했습니다.
하지만 for을 사용할 때마다 list와 같은 변수를 새로 만들어 사용하는 것은 매우 번거롭습니다. 이때 사용 하는 것이 range입니다.
range는 특정 범위의 정수값을 생성합니다.
예를들어
range(end) # 0~(end-1)까지 정수
range(start, end) # start부터 end-1까지 정수생성
range(start, end, step) #start부터 step만큼증가하여 end-1까지 정수생성
range(5) # 01234
range(1,5) #1234
range(1,10,2) #13579
이런식으로 range를 사용하여 정수를 생성하면 for문을 사용할때 range의 요소들을 하나씩 가져와 손쉽게 원하는 반복횟수나 변수값을 지정해줄 수 있습니다.
for문에 range를 사용하여 아주 간단하게 구구단을 만들어 보겠습니다.
for i in range(2,10):
for j in range(1,10):
print(f"{i}x{j}={i*j}")
print("\n")
#출력
2x1=2
2x2=4
2x3=6
2x4=8
2x5=10
2x6=12
2x7=14
2x8=16
2x9=18
...
9x1=9
9x2=18
9x3=27
9x4=36
9x5=45
9x6=54
9x7=63
9x8=72
9x9=81
range를 사용 할 경우 end값은 포함하지 않는 다는 걸 조심해야 합니다.
예를 들어 range(0,5)의 경우 0,1,2,3,4를 의미 합니다.
continue는 while문과 for문에서 특정한 조건이 성립되면 반복문을 빠져나가지 않고 처음(조건문)으로 다시 돌아가게 할 경우 사용합니다.
break는 continue와 동일하게 while과 for에서 사용하는데 조건문이 완료되지 않아도 강제로 반복문을 빠져나오게 할 때 사용됩니다.
for i in range(10):
if i < 4:
continue
print(i)
if i == 8:
break
#출력
4
5
6
7
8
위 코딩을 보면 i가 4미만일때는 continue때문에 반복문의 조건문으로 돌아가 print(i)가 실행되지 않기 때문에 1,2,3값들은 출력되지 않습니다.
i가4이상이 되는 시점부터 print(i)가 실행되다가 i가 8이 되는 순간 break이 실행되어 반복문의 조건이 끝나기전에 반복문을 강제종료하게 됩니다. 이로인해 9값은 출력되지 않습니다.
리스트 내포(list comprehension)이란 list안에 for문은 직접 넣어 list를 생성하는 것을 의미합니다.
기본적인 구조는 아래와 같습니다.
list = [본문 for i in iterable]
이를 이용해서 좀 더 간단하게 for문을 사용하여 list를 만들 수 있습니다.
예를 들어 일반적으로 for문을 사용하여 30미만의 짝수들을 요소로하는 list를 만들고 싶다면 아래처럼 코딩할 수 있습니다.
list = []
for i in range[2,30,2]:
list.append(i)
print(list)
#출력
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
반면에 간단하게 리스트 내포(list comprehension)를 사용하면 아래와 같이 단 한 줄로 표현할 수 있습니다.
list = [i for i in range(2,30,2)]
print(list)
#출력
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
위처럼 리스트 내포(list comprehension)를 사용하여 코드가 훨씬 간단해졌습니다.. 솔직히 쉬운지는 모르겠습니다.
심지어 if문을 리스트 내포안에서 사용할 수 있다..!
이를 이용해서 이번엔 30미만의 홀수를 출력해보자.
list = [i for i in range(30) if i % 2 == 1]
print(list)
#출력
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29]
이처럼 리스트 내포(list comprehension)를 사용하면 좀 더 간단하게 list를 표현 할 수 있습니다.