코딩 노트

04-3 반복문과 while 반복문 본문

Python

04-3 반복문과 while 반복문

newbyeol 2021. 4. 26. 17:13

0. 시작하기 전에...

for 반복문과 함께 많이 사용되는 자료형을 하나 더 꼽자면 범위가 있다. 특정한 횟수만큼 반복해서 돌리고 싶을 때는

for 반복문과 범위를 조합해서 사용한다.

 

첫째, 매개변수에 숫자 한 개를 넣는 방법

둘째, 매개변수에 숫자 두 개를 넣는 방법

셋째, 매개변수에 숫자 세 개를 넣는 방법

 

1. 범위

리스트, 딕셔너리 외에 for 반복문과 함께 많이 사용되는 범위 자료형의 사용법에 대해 알아보겠다.

 

첫째, 매개변수에 숫자를 한 개 넣는 방법

0부터 A-1까지의 정수로 범위를 만든다.

range(A) # A는 숫자

매개변수에 숫자를 한 개 넣는 방법이다. 범위를 선언하고 범위 이름을 입력하면 다음과 같은 형태로 출력된다.

list() 함수를 이용해 범위를 리스트로 변경하면 범위 내부에 어떤 값이 들어 있는지 확인 할 수 있다.

>>> a = range(5)
>>> a
range(0, 5)
>>> list(range(10))
[0,1,2,3,4,5,6,7,8,9]

둘째, 매개변수에 숫자를 두 개 넣는 방법

A부터 B-1까지의 정수로 범위를 만든다.

range(A,B) #A와 B는 숫자
>>> list(range(0, 5)) #0부터 (5-1)까지의 정수로 범위를 만든다.
[0,1,2,3,4]
>>> list(range(5, 10))  #5부터 (10-1)까지의 정수로 범위를 만든다
[5,6,7,8,9]

셋째, 매개변수에 숫자를 세 개 넣는 방법

A부터 B-1까지의 정수로 범위를 만드는 데, 앞뒤의 숫자가 C 만큼의 차이를 가진다.

range(A, B, C) #A,B,C는 숫자
>>> list(range(0,10,2)) #0부터 2씩 증가하면서(10-1)까지의 정수로 범위를 만든다.
[0,2,4,6,8]
>>> list(range(0, 10, 3)) #0부터 3씩 증가하면서(10-1)까지의 정수로 범위를 만든다.
[0,3,6,9]

 

범위를 만들 때 매개변수 내부에 수식을 사용하는 경우도 많다. 예를 들어 0부터 10까지의 범위를 생성하는 데,

10을 반드시 포함해야 한다는 것을 강조하고 싶을 때는 다음과 같이 작성하기도 한다.

>>> a = range(0, 10 + 1)
>>> list(a)
[0,1,2,3,4,5,6,7,8,9,10]

비효율적으로 보일 수도 있지만 "매일매일 이 영양제를 하나씩 드세요"가 아니라, "이 영양제는 월화수목금토일 

매일매일 꼭 드셔야해요" 처럼 정확하게 콕 집어 표현함으로써 받아들이는 사람에게 강조할 수 있는 것이다. 

이때 받아들이는 사람이란 다른 사람일 수도 있지만, 미래에 해당 코드를 다시 보는 자신일 수도 있다.

 

수식에 나누기 연산자를 사용하면,

>>> n = 10
>>> a = range(0, n / 2) # 매개변수로 나눗셈을 사용한 경우 오류 발생
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    a = range(0, n / 2)
TypeError: 'float' object cannot be interpreted as an integer

에러가 발생하는데, range() 함수의 매개변수로는 반드시 정수를 입력해야 하기 때문이다. 

int() 함수 등으로 실수를 정수로 바꾸는 방법도 있겠지만, 다음과 같이 정수 나누기 연산자를 많이 사용한다.

>>> a = range(0, int(n / 2)) #실수를 정수로 바꾸는 방법보다
>>> list(a)
[0, 1, 2, 3, 4]

>>> a = range(0, n // 2) #정수 나누기 연산자를 많이 사용합니다!
>>> list(a)
[0, 1, 2, 3, 4]

2. for 반복문: 범위와 함께 사용하기

for 반복문과 범위를 조합해서 사용하면 다음과 같은 형태가 된다.

for 숫자 변수 in 범위:
	코드
# for 반복문과 범위를 함께 조합해서 사용합니다.
for i in range(5): 
	print(str(i) + "=반복변수")
    print()
    
for i in range (5, 10)":
	print(Str(i) + "=반복변수")
    print()
    
for i in range(0, 10, 3):
	print(str(i) + "=반복 변수")
    print()

· for 반복문과 범위

# for 반복문과 범위를 함께 조합해서 사용합니다.
for i in range(5): 
	print(str(i) + "=반복변수")
    print()
    
for i in range (5, 10):
	print(Str(i) + "=반복변수")
    print()
    
for i in range(0, 10, 3):
	print(str(i) + "=반복 변수")
    print()

첫 번째 반복문은 [0,1,2,3,4]로, 두 번째는 [5,6,7,8,9]로, 세 번째는 [0,3,6,9]로 반복이 일어난다.

3. for 반복문: 리스트와 범위 조합하기

#리스트를 선언합니다.
array = [273, 32, 103, 57, 52]

#리스트에 반복문을 적용합니다.
for element in array:
	#출력합니다.
    print(element) #현재 무엇을 출력하고 있는지 보다, 몇 번째 출력인지 알아야 하는 경우가 있다.

몇 번째인지 알아내는 방법은 많다. 가장 쉬운 방법은 범위를 조합해서 사용하는 것이다.

 

· 리스트와 범위를 조합해서 사용하기

#리스트를 선언합니다.
array = [273, 32, 103, 57, 52]

#리스트에 반복문을 적용합니다.
for i in range(len(array)):
	#출력합니다.
    print("{}번째 반복: {}".format(i, array[i]))

4. for 반복문: 반대로 반복하기

위 반복문은 작은 숫자에서 큰 숫자 순서로 올라갔지만 큰 숫자에서 작은 숫자로 된 역반복문을 적용해야 할 경우도

있는데 크게 두 가지 방법이 있다.

 

첫 번째는 range() 함수의 매개변수를 세 개 사용하는 방법이다.

· 반대로 반복하기(1)

#역반복문
for i in range(4, 0 - 1, -1):
	#출력합니다.
    print("현재 반복 변수: {}".format(i))

range() 함수의 매개변수에 0-1이라는 수식을 넣었는데, 그냥 -1로 입력해도 상관 없다.

이전에 언급했던 것처럼 "0까지 반복하고 싶어서 이 코드를 사용했어"를 강조하기 위해서 이렇게 입력해 본 것이다.

 

두 번재는 reversed() 함수를 사용하는 방법이다.

· 반대로 반복하기(2)

#역반복문
for i in reversed(range(5)):
    #출력합니다.
    print("현재 반복 변수: {}".format(i))

reversed() 함수를 적용하면 [0,1,2,3,4] 라는 형태의 범위가 [4,3,2,1,0]으로 뒤집어진다.

따라서 9부터 0까지 반대로 반복문을 돌릴 수 있다. revresed() 함수는 리스트 등에도 적용할 수 있다.

5. while 반복문

리스트 또는 딕셔너리 내부의 요소를 모두 순화하는 경우, 즉 특정 횟수만큼 반복하는 경우에는 for 반복문을 사용한다.

그런데 파이썬에는 for 반복문 이외에도 범용적으로 사용할 수 있는 while 반복문이 있다.

while 불 표현식:
	문장

if 조건문과 굉장히 비슷한 형식인데, <불 표현식>이 참인 동안 문장을 계속 반복한다. 

 

· 무한 반복

#while 반복문을 사용합니다.
while True:
    #"."을 출력합니다.
    #기본적으로 end가 "\n"이라 줄바꿈이 일어나는데
    #빈 문자열 ""로 바꿔서 줄바꿈이 일어나지 않게 합니다.
    print(".", end="")

무한하게 반복되므로 Ctrl+C를 눌러 강제 종료를 해야한다. 개발할 때 이와 같이 먹통이 발생하면 Ctrl+C를 눌러

강제 종료 하면 된다.

 

6. While 반복문: for 반복문처럼 사용하기

· while 반복문을 for 반복문처럼 사용하기

# 반복 변수를 기반으로 반복하기
i = 0
while i < 10:
    print("{}번째 반복입니다.".format(i))
    i += 1

for 반복문을 설명할 때 언급했던 것 이외에는 모두 while 반복물을 사용하는데, 대표적으로 무한 반복이다.

for 반복문으로는 무한 반복을 구현할 수 없다. 그리고 while 반복문에서 가장 중요한 키워드는 '조건'이다.

조건을 활용해서 반복을 사용해야 한다면 while 반복문을 사용하는 것이 좋다. 조건이 중요항 경우에 대해 살펴보겠다.

 

7. while 반복문: 상태를 기반으로 반복하기

· 해당하는 값 모두 제거하기

# 변수를 선언합니다.
list_test = [1,2,1,2]
value = 2

#list_test 내부에 value가 있다면 반복
while value in list_test:
    list_test.remove(value)


#출력합니다.
print(list_test)

리스트 내부에 있는 모든 2가 제거될 때까지 반복하기 때문에 2가 모두 제거된 결과가 출력된다.

 

8. while 반복문: 시간을 기반으로 반복하기

시간을 기반으로 반복하려면 유닉스 타임이라는 개념을 알아야 한다. 유닉스 타임이란 세계 표준시로,

1970년 1월 1일 0시 0분 0초를 기준으로 몇 초가 지났는 지를 정수로 나타낸 것을 말한다.

파이썬에서 유닉스 타임을 구할 때는 다음과 같은 코드를 사용한다.

 

먼저 시간과 관련된 기능을 가져오고, 유닉스 타임을 구한다.

>>> import time
>>> time.time()
1619427082.6571472

· 5초 동안 반복하기

# 시간과 관련된 기능을 가져옵니다.
import time

#변수를 선언합니다.
number = 0

# 5초 동안 반복합니다.
target_tick = time.time() + 5
while time.time() < target_tick:
    number += 1

#출력합니다.
print("5초 동안 {}번 반복했습니다.".format(number))

물론 컴퓨터의 성능과 상황에 따라 반복 횟수는 계속 달라진다. 이를 활용하면 5초 동안 다른 사용자의 응답을

기다릴 수 있다. 통신할 때 자주 사용하는 코드이므로 시간을 기반으로 조건을 걸 때는 while 반복문을 활용한다고 기억하자.

 

9. while 반복문: break 키워드/continue 키워드

반복문 내부에서만 사용할 수 있는 break와 continue라는 특수한 키워드가 있다.

break 키워드는 반복문을 벗어날 떄 사용하는 키워드이다. 일반적으로 무한 반복문을 만들고, 내부의 반복을 벗어날 때

많이 사용한다.

 

· break 키워드

#변수를 선언합니다.
i = 0

#무한 반복합니다.
while True:
	# 몇 번째 반복인지 출력합니다.
    print("{}번째 반복문입니다.".format(i))
    i = i + 1
    #반복을 종료합니다.
    input_text = input(">종료하시겠습니까?(y/n):")
    if input_text in ["y", "Y"]:
    print("반복을 종료합니다.")
    break     

코드를 실행하면 "0번째 반복문입니다."를 출력하고 프로그램을 종료할지 물어본다. 이때 "y", "Y" 둘 중 한나를 입력하면

break 키워드를 만나 반복문을 벗어나게 되므로 프로그램이 종료된다. 이외의 경우에는 반복문을 계속 실행한다.

 

continue 키워드는 현재 반복을 생략하고, 다음 반복으로 넘어갈 때 사용하는 키워드이다. 

 

· continue 키워드

#변수를 선언합니다.
number = [5, 15, 6, 20, 7, 25]

#반복을 돌립니다.
for number in numbers:
    #number가 10보다 작으면 다음 반복으로 넘어갑니다.
    if number < 10:
        continue
    #출력합니다.
    print(number)

물론 현재 코드를 보면 if else 구문을 사용해도 된다. 다만 다음과 같이 처음부터 반복에 조건을 걸고 사용하고 

싶을 때 continue 키워드를 사용하면 이후 처리의 들여쓰기를 하나 줄일 수  있다.

 

#contunue 키워드를 사용하지 않은 경우

#반복을 돌립니다.
for number in numbers:
	#반복 대상을 한정합니다.
    if number >= 10:
    
#contunue 키워드를 사용한 경우

#반복을 돌립니다.
for number in numbers:
	#반복 대상에서 제외해버립니다.
    if number < 10:
    continue
    #문장
    #문장
    #문장