PYTHON 제어문(반복문)

PromptAction·2023년 5월 2일
0

백엔드

목록 보기
5/20

파이썬에서 반복문은 특정 조건이 만족될 때까지 코드를 반복해서 실행할 때 사용된다. 파이썬에서는 대표적으로 for와 while 반복문이 있다.

WHILE

while 반복문은 조건이 참(True)일 때 반복해서 실행할 때 사용된다. while 반복문은 다음과 같이 작성할 수 있다.

while 조건:
    반복해서 실행할 코드
   
while <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    <수행할 문장3>
   
i = 1
while i <= 10:
    print(i)
    i += 1
    
i+=1은 i= i+1
i=+1은 i= 1

ex)

treehit = 0
while treehit < 10:
    treehit = treehit + 1
    print("나무를 %d번 찍었습니다" %treehit)
    if treehit == 10:
     print("나무를 베었습니다")
     
->     
나무를 1번 찍었습니다
나무를 2번 찍었습니다
나무를 3번 찍었습니다
나무를 4번 찍었습니다
나무를 5번 찍었습니다
나무를 6번 찍었습니다
나무를 7번 찍었습니다
나무를 8번 찍었습니다
나무를 9번 찍었습니다
나무를 10번 찍었습니다
나무를 베었습니다


위 예에서 while문의 조건문은 treeHit < 10이다. 즉 treeHit가 10보다 작은 동안에 while문에 포함된 문장들을 계속 수행한다. whlie문 안의 문장을 보면 제일 먼저 treeHit = treeHit + 1로 treeHit 값이 계속 1씩 증가한다. 그리고 나무를 treeHit번만큼 찍었음을 알리는 문장을 출력하고 treeHit가 10이 되면 "나무 넘어갑니다."라는 문장을 출력한다. 그러고 나면 treeHit < 10 조건문이 거짓이 되므로 while문을 빠져나가게 된다.

while문을 만드는 기본을 알아보자

>>> prompt = """
... 1. Add
... 2. Del
... 3. List
... 4. Quit
...
... Enter number: """
>>>

이어서 number 변수에 0을 먼저 대입한다. 이렇게 변수를 먼저 설정해 놓지 않으면 다음에 나올 while문의 조건문인 number != 4에서 변수가 존재하지 않는다는 오류가 발생한다.

>>> number = 0
>>> while number != 4:
...     print(prompt)
...     number = int(input())
...
1. Add
2. Del
3. List
4. Quit

Enter number:

while문을 보면 number가 4가 아닌 동안 prompt를 출력하고 사용자로부터 번호를 입력받는다. 다음 결과 화면처럼 사용자가 값 4를 입력하지 않으면 계속해서 prompt를 출력한다.

Enter number:
1

1. Add
2. Del
3. List
4. Quit

4를 입력하면 조건문이 거짓이 되어 while문을 빠져나가게 된다.

While문을 강제로 빠져나가려면 어떻게 해야될까.

while문은 조건문이 참인 동안 계속해서 while문 안의 내용을 반복적으로 수행한다. 하지만 강제로 while문을 빠져나가고 싶을 때가 있다. 예를 들어 커피 자판기를 생각해 보자. 자판기 안에 커피가 충분히 있을 때에는 동전을 넣으면 커피가 나온다. 그런데 자판기가 제대로 작동하려면 커피가 얼마나 남았는지 항상 검사해야 한다. 만약 커피가 떨어졌다면 판매를 중단하고 "판매 중지" 문구를 사용자에게 보여주어야 한다. 이렇게 판매를 강제로 멈추게 하는 것이 바로 break문이다.

coffee = 10
money = 300
while money:
    print("돈을 받았으니 커피를 줍니다.")
    coffee = coffee -1
    print("커피의 남은 양은 %d개 입니다" % coffee)
    if coffee == 0:
       print("판매를 종료합니다")
       break
     
->     
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 9개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 8개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 7개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 6개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 5개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 4개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 3개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 2개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 1개 입니다
돈을 받았으니 커피를 줍니다.
커피의 남은 양은 0개 입니다
판매를 종료합니다

money가 300으로 고정되어 있으므로 while money:에서 조건문인 money는 0이 아니기 때문에 항상 참이다. 따라서 무한히 반복되는 무한 루프를 돌게 된다. 그리고 while문의 내용을 한 번 수행할 때마다 coffee = coffee - 1에 의해서 coffee의 개수가 1개씩 줄어든다. 만약 coffee가 0이 되면 if coffee == 0: 문장에서 coffee == 0:이 참이 되므로 if문 다음 문장 "커피가 다 떨어졌습니다. 판매를 중지합니다."가 수행되고 break문이 호출되어 while문을 빠져나가게 된다.

맨 처음으로 돌아가보자.

while문 안의 문장을 수행할 때 입력 조건을 검사해서 조건에 맞지 않으면 while문을 빠져나간다. 그런데 프로그래밍을 하다 보면 while문을 빠져나가지 않고 while문의 맨 처음(조건문)으로 다시 돌아가게 만들고 싶은 경우가 생기게 된다. 이때 사용하는 것이 바로 continue문이다.

1부터 10까지의 숫자 중에서 홀수만 출력하는 것을 while문을 사용해서 작성한다고 생각해보자. 어떤 방법이 좋을까?
ex)

a = 0
while a < 10:
    a = a + 1
    if a %2 == 0: continue
    print(a)
    
->
1
3
5
7
9

위 예는 1부터 10까지의 숫자 중 홀수만 출력하는 예이다. a가 10보다 작은 동안 a는 1만큼씩 계속 증가한다. if a % 2 == 0(a를 2로 나누었을 때 나머지가 0인 경우)이 참이 되는 경우는 a가 짝수일 때이다. 즉 a가 짝수이면 continue 문장을 수행한다. 이 continue문은 while문의 맨 처음(조건문: a<10)으로 돌아가게 하는 명령어이다. 따라서 위 예에서 a가 짝수이면 print(a) 문장은 수행되지 않을 것이다.

무한루프

이번에는 무한 루프(Loop)에 대해 알아보자. 무한 루프란 무한히 반복한다는 의미이다. 우리가 사용하는 일반 프로그램 중에서 무한 루프 개념을 사용하지 않는 프로그램은 거의 없다. 그만큼 자주 사용한다는 뜻이다.

파이썬에서 무한 루프는 while문으로 구현할 수 있다. 다음은 무한 루프의 기본 형태이다.

while True: 
    수행할 문장1 
    수행할 문장2

while문의 조건문이 True 이므로 항상 참이 된다. 따라서 while문 안에 있는 문장은 무한히 반복된다.

while True:
    print("Ctrl + C를 눌러야지 while문을 빠져나갈 수 있습니다")
    
->    
Ctrl + C를 눌러야지 while문을 빠져나갈 수 있습니다
Ctrl + C를 눌러야지 while문을 빠져나갈 수 있습니다
Ctrl + C를 눌러야지 while문을 빠져나갈 수 있습니다
Ctrl + C를 눌러야지 while문을 빠져나갈 수 있습니다
Ctrl + C를 눌러야지 while문을 빠져나갈 수 있습니다 
.
.
.
.
.

FOR

for 반복문은 주로 리스트, 튜플, 문자열과 같은 순회 가능한(iterable) 객체를 반복할 때 사용된다. for 반복문은 다음과 같이 작성할 수 있다.

for 변수 in 순회가능한객체:
    반복해서 실행할 코드

for i in range(1, 11):
    print(i)

For 문의 기본구조부터 보고가자.

for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...

For문은 예제를 통해서 보는게 제일 쉽다고 한다.

test_list = ['one', 'two', 'three']
for i in test_list:
    print(i)

-> 
one
two
three

['one', 'two', 'three'] 리스트의 첫 번째 요소인 'one'이 먼저 i 변수에 대입된 후 print(i) 문장을 수행한다. 다음에 두 번째 요소 'two'가 i 변수에 대입된 후 print(i) 문장을 수행하고 리스트의 마지막 요소까지 이것을 반복한다.

a = [(1,2), (3,4), (5,6)]
for (first, last) in a:
    print(first + last)
    
-> 
3
7
11

a 리스트의 요솟값이 튜플이기 때문에 각각의 요소가 자동으로 (first, last) 변수에 대입된다.

ex)총 5명의 학생이 시험을 보았는데 시험 점수가 60점 이상이면 합격이고 그렇지 않으면 불합격이다. 합격인지 불합격인지 결과를 보여 주시오.
marks = [90, 25, 67, 45, 80]

marks = [90, 25, 67, 45, 80]
number = 0
for mark in marks:
  number = number +1
  if mark >= 60:
     print("%d번 학생은 합격입니다." % number)
  else:
     print("%d번 학생은 불합격입니다." % number)
     
->      
1번 학생은 합격입니다.
2번 학생은 불합격입니다.
3번 학생은 합격입니다.
4번 학생은 불합격입니다.
5번 학생은 합격입니다.

각각의 학생에게 번호를 붙여 주기 위해 number 변수를 사용하였다. 점수 리스트 marks에서 차례로 점수를 꺼내어 mark라는 변수에 대입하고 for문 안의 문장들을 수행한다. 우선 for문이 한 번씩 수행될 때마다 number는 1씩 증가한다.

이 프로그램을 실행하면 mark가 60 이상일 때 합격 메시지를 출력하고 60을 넘지 않을 때 불합격 메시지를 출력한다

**For문 + Continue

while문에서 살펴본 continue문을 for문에서도 사용할 수 있다. 즉 for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다.

앞의 예제를 그대로 사용해서 60점 이상인 사람에게는 축하 메시지를 보내고 아닌 사람에게는 아무 메시지도 보내지 않는 프로그램을 작성해보자.

marks = [90, 25, 67, 45, 80]
number = 0
for mark in marks:
  number = number +1
  if mark <60:
      continue
  print("%d번 학생 축하합니다. 합격입니다" % number)
  
->
1번 학생 축하합니다. 합격입니다
3번 학생 축하합니다. 합격입니다
5번 학생 축하합니다. 합격입니다

점수가 60점 이하인 학생에게는 mark < 60 이 참이 되어 continue 문이 수행된다. 따라서 축하 메세지를 출력하는 부분인 print로 넘어가지 않고 for문의 처음으로 돌아가게 된다.

For문 + Range 함수

간단한 range 함수의 사용법

a=range(100)
print(a)
-> range(0, 100)

range(10)은 0부터 10 미만의 숫자를 포함하는 range 객체를 만들어 준다.
시작 숫자와 끝 숫자를 지정하려면 range(시작 숫자, 끝 숫자) 형태를 사용하는데, 이때 끝 숫자는 포함되지 않는다.

Range함수의 예시

add = 0
for i in range(1,11):
    add = add + i
    print(add)
    
-> 
add = 0
for i in range(1,11):
    add = add + i
    print(add)

range(1, 11)은 숫자 1부터 10까지 (1 이상, 11 미만) 의 숫자를 데이터로 갖는 객체이다. 따라서 위 예에서 i 변수에 숫자가 1부터 10까지 하나씩 차례로 대입되면서 add = add + i 문장을 반복적으로 수행하고 add는 최종적으로55가 된다.

우리가 앞에서 살펴본 "60점 이상이면 합격"이라는 문장을 출력하는 예제도 range 함수를 사용해서 다음과 같이 바꿀 수 있다.

marks=[90, 25, 67, 45, 80]
for number in range(len(marks)):
    if marks[number] < 60:
       continue
    print("%d번 학생 축하합니다. 합격입니다." % (number+1))

->
1번 학생 축하합니다. 합격입니다.
3번 학생 축하합니다. 합격입니다.
5번 학생 축하합니다. 합격입니다.

len 함수는 리스트 안의 요소 개수를 돌려주는 함수이다. 따라서 len(marks)는 5가 될 것이고 range(len(marks))는 range(5)가 될 것이다. number 변수에는 차례로 0부터 4까지의 숫자가 대입될 것이고, marks[number]는 차례대로 90, 25, 67, 45, 80 값을 갖게 된다.

For과 Range를 이용한 구구단

for과 range 함수를 사용하여 소스코드 4줄만으로 구구단을 출력할 수 있다.

for i in range(2, 10):
    for j in range(1, 10):
        print(i*j, end=" ")
    print("")    

->
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81

위 예를 보면 for문을 두 번 사용했다. 1번 for문에서 2부터 9까지의 숫자(range(2, 10))가 차례로 i에 대입된다. i가 처음 2일 때 2번 for문을 만나게 된다. 2번 for문에서 1부터 9까지의 숫자(range(1, 10))가 j에 대입되고 그다음 문장 print(i*j)를 수행한다.

따라서 i가 2일 때 21, 22, 23, … 29까지 차례로 수행되며 그 값을 출력하게 된다. 그다음으로 i가 3일 때 역시 2일 때와 마찬가지로 수행될 것이고 i가 9일 때까지 계속 반복된다. 그리고 print(i*j, end=" ")와 같이 print 함수에 end 파라미터를 설정한 이유는 해당 결괏값을 출력할 때 다음줄로 넘기지 않고 그 줄에 계속해서 출력하기 위해서이다.

그다음에 이어지는 print(' ')는 2단, 3단 등을 구분하기 위해 사용했다. 두 번째 for문이 끝나면 결괏값을 다음 줄부터 출력하게 하는 역할을 한다.

list comprehension

리스트 안에 for문을 포함하는 리스트 컨프리헨션(List Comprehension)을 사용하면 좀 더 편리하고 직관적인 프로그램을 만들 수 있다.

a = [1,2,3,4]
result = []
for num in a:
    result.append(num*3)
    print(result)
    
->
[3]
[3, 6]
[3, 6, 9]
[3, 6, 9, 12]

위 예제는 a 리스트의 각 항목에 3을 곱한 결과를 result 리스트에 담는 예제이다.

이걸 리스트 컨프리헨션을 사용하면 쉽게 해결할 수 있다.

a = [1,2,3,4,]
result=[num * 3 for num in a]
print(result)

->
[3, 6, 9, 12]

만약 [1,2,3,4] 중에 짝수에만 3을 곱하여 담고 싶다면 다음과 같이 리스트 컨프리헨션에 'if 조건'을 사용할 수 있다.

a= [1,2,3,4]
result = [num * 3 for num in a if num % 2 == 0]
print(result)
->
[6, 12]

만약 구구단의 모든 결과를 리스트에 담고 싶다면 리스트 컨프리헨션을 사용하여 다음과 같이 간단하게 구현할 수도 있다.

result = [x*y for x in range(2,10)
              for y in range(1,10)]
print(result)

->
[2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

모든 출처는 https://wikidocs.net/22을 참고함

0개의 댓글