5장. 반복문

asda주asda·2022년 1월 14일
0

Python

목록 보기
5/31

반복문의 필요성

인간은 항상 새롭고 흥미로운 것을 좋아하는 경향이 많아서, 똑같은 작업을 반복하는 것을 지루해한다. 어찌 보면 당연한 일이다. 예를 들어 공장에서 똑같은 공정에서 매일 똑같은 일만 반복한다면 그건 정말 지루하기 짝이 없을 것이다. 이런 경우에 프로그래밍을 통하여 자동화를 시키면 컴퓨터를 통하여 인간은 그 반복적인 작업에서 벗어날 수 있을 것이다.
이처럼 동일한 명령어를 여러 번 실행하는 역할을 반복문이 한다. 반복은 아주 자주 나타내기 때문에 파이썬은 반복을 쉽게 할 수 있는 구조를 가지고 있다.

파이썬에서 지원하는 반복문에는 2가지 종류가 있다. 개발자가 현재 상황에 맞는 구조를 선택하여 사용하면 될 것이다.
1. for문 : 정해진 횟수만큼 반복하는 구조이다.
2. while문 : 어떤 조건이 만족되는 동안, 반복을 계속하는 구조이다.(통상, 무한루프용으로 많이 사용된다.)

for문

for 문은 정해진 횟수만큼 반복할 때 사용하는 반복 구조이다. for 루프(loop)라고도 한다. for 문은 반복 구조 중 에서 가장 많이 사용하는데 그것은 당연히 장점이 많기 때문이다. 시퀀스는 반복하고 싶은 요소를 넣는다고 할 수 있다.

리스트에 대한 반복

각각의 요소들이 연속적으로 이어진 자료형을 시퀀스 자료형(sequence type)이라 한다.
이런 시퀀스 자료형에 리스트를 넣어 반복이 가능하다.
예를 들면 다음과 같다.

for name in ["옥자", "순자","덕자", "내 팔자"]:
	print("안녕! "+name)
결과:
안녕! 옥자
안녕! 순자
안녕! 덕자
안녕! 내 팔자

for문의 name에 해당하는 부분을 '루프 변수'라고 칭한다. 변수의 이름은 얼마든지 변경이 가능하다. 아래 블록에 해당하는 부분도 들여쓰기를 해야한다.
한 번 반복이 끝나면 처리할 항목이 더 있는지 검사를 한 후 처리할 것이 없다면 반복문을 끝낸다.

정수 리스트에 대한 반복

시퀀스 자리에 정수의 리스트를 넣는 것도 가능하다.

for x in [1,2,3,4,5,6,7,8,9]:
	print(x, end="")
결과:
0 1 2 3 4 5 6 7 8 9 

위의 코드는 리스트에 있는 정수들을 for문이 실행되면서 이들 리스트에서 하나씩 꺼내어 변수 x에 할당하며, 각 반복에서 변수 x값을 출력한다. 여기서 end=" "라는 것은 줄을 바꾸지 말라는 의미이다. 원레 print의 마지막은 \n이 되어있다. 하지만
end=""를 이용해 마무리를 설정할 수 있다.

range함수

range(x)함수

0부터 9까지의 정수들의 리스트는 불편하지만 만들 수 있다. 숫자 10개면 손으로 쓸 수 있지만 숫자가 100만개면 어떻게 할까? 골치가 아플 것이다. 이 때 좀더 편리한 방법으로 유용한 함수가 바로 range() 함수이다.
range() 함수는 리스트 타입으로 반환한다.

range()함수를 이용하면 특정 구간의 정수들을 만들 수 있다. 예를 들면 range(10)을 하면 0~9까지의 정수가 생성된다.

sum = 0
for x in range(10):
	sum += x
print(sum)

결과:
45

range(start, stop)함수

아울러 range(start, stop)의 매개변수 2개를 가지는 함수도 사용할 수가 있다. 이 함수를 호출하면 start부터 시작하여 (stop)-1까지의 정수가 생성된다.이 때 stop은 포함되지 않는다.

sum = 0
for x in range(4, 10):
	sum += x
print(sum)
# 4 + 5 + 6 + 7 + 8 + 9

결과:
39

range(start, stop, step)

start 부터 (stop-1)까지 step의 간격으로 정수를 생성한다.
예를 들어서 range(0, 10, 2)와 같이 호출되면 0부터 2씩 건너뛰면서 10보다는 작은 정수 [0, 2, 4, 6, 8]가 생성된다.

range([ start, ] stop [ ,step ])

range( ) 함수는 start부터 stop-1까지 step의 간격으로 정수들을 생성한다. start와 step이 대괄호로 싸여져 있는데 이런 내용은 생략할 수 있다는 의미이다. start나 step이 생략되면 start는 0, step은 1로 간주된다. start에 기입이 안되있으면 0부터 시작한다.

문자열의 반복

문자열도 시퀀스의 일부분이며, 인덱스 또한 존재한다. 따라서 문자열을 대상으로 반복문은 얼마든지 만들 수 있다.
예를 들면 다음과 같다.

for s in "Halo"
	print(s, end="?")

결과:
H?a?l?o?

while문

while문의 개요

while문은 옆의 조건에 해당될 경우에 아래 내용(or 블록)을 반복시키는 반복문이다.
정리하면 반복을 결정하는 조건이 있고 조건이 참이면 반복을 하고 그렇지 않으면 반복 루프를 빠져나온다.

while 문의 구조

while문은 구조는 while문의 옆에 반복의 조건을 기술한다. 조건이 만족되는 동안, 블록 안의 문장이 반복 실행된다. 예를 들면 다음과 같다.

i=0
while i<5:
    print("안녕 친구야!")
    i+=1

결과:
안녕 친구야!
안녕 친구야!
안녕 친구야!
안녕 친구야!
안녕 친구야!

만일 위의 코드에서 i의 증가가 없다면 어떻게 될까? 그렇다. 그냥 계속 루프를 돌 것이다. 그 이유는 바로 조건이 계속 참이기 때문인 것이다. 이러한 것을 무한 루프(infinite loop)라고 한다. 결국 이런 형태가 나오지 않도록 프로그램을 작성해야 한다.

그럼에도 불구하고 우리 주변에는 무한 루프로 되어져 있는 프로그램들이 상당히 많이 존재한다. 우리들이 사용하는 에어컨, PC, 모니터, TV, 자판기 등등 여러가지가 있다. 근데 여기서 중요한 건 분명히 이러한 물건들은 반드시 무한 루프를 빠져나가는 곳이 존재한다.

while반복문에서는 무한 루프를 프로그램으로 작성할 때는 어떤 조건일 때 이 루프를 빠져나가는지를 반드시 기술해야 한다

보초값(sentinal)

만일 데이터 입력을 받는 횟수가 정확하게 되어 있지 않는 경우도 있다. 이런 경우 데이터의 끝에 '끝'을 알리는 특수한 데이터를 놓으면 될 것이다. 프로그램에서 데이터를 입력하다가 이 특수한 데이터가 나타나면 데이터의 입력을 중단하는 것이다. 이러한 데이터 값을 '보초값(sentinal)'이라 칭한다.
보초값은 일반적인 데이터 값에서 절대 등장할 수 없는 값으로 선택하는 것이 일반적이다. 가령 성적을 입력받는다고 가정할 때 음수의 데이터를 검색하면 입력을 종료하는 등이 있다. 이때의 경우 음수의 데이터가 보초값이 된다.
구체적인 예시로는 다음과 같다.

# while 문을 이용한 성적의 평균 구하기 프로그램
# 필요한 변수들을 초기화한다.
n = 0
sum = 0
score = 0

print("종료하려면 음수를 입력하시오")
# grade가 0이상이면 반복
# 성적을 입력받아서 합계를 구하고 학생 수를 센다.
while score >= 0 :
   score = int(input("성적을 입력하시오: "))
   if score > 0:
       sum = sum + score
       n += 1

# 평균을 계산하고 화면에 출력한다.
if n > 0 :
	average = sum / n
print("성적의 평균은 %f입니다." % average)

결과:
종료하려면 음수를 입력하시오
성적을 입력하시오: 10
성적을 입력하시오: 20
성적을 입력하시오: 30
성적을 입력하시오: -1
성적의 평균은 20.000000입니다.

몇 개의 데이터가 입력될 지 모르니 음수 값을 보초값으로 세워 두고 음수가 입력되면 루프를 빠져나오게 한 예제이다.

중첩 반복문

반복문은 중첩하여 사용될 수 있다. 즉 반복문 안에 다른 반복문이 포함될 수 있다. 즉, 이러한 형태를 중첩 반복문(nested loop)라고 한다. 외부에 위치하는 반복문을 외부 반복문(outer loop)라고 하며, 안쪽의 반복문을 내부 반복문(inner loop)라고 한다. 중요한 것은 내부 반복문은 외부 반복문이 한번 반복할 때마다 새롭게 실행된다는점이다.
중첩 반복문의 유용한점은 테이블형태의 데이터 처리에 용이하다 . 예를 들면 각 학생들의 성적을 입력받는 것이 있다. 각 학생마다 국어, 수학 등 여러 과목의 성적 처리에 유용하다.

# 중첩 반복을 통해 *으로 사각형을 만드는 프로그램이다.
for x in range(5):
	for y in range(5):
             print("*",end="")
	print("")
결과:
*****
*****
*****
*****
*****
    

문자열 처리하기

문자열을 처리하는 용도로 반복문이 많이 사용된다. 앞서 말한 것처럼 문자열도 시퀀스의 일종이다.
저장된 문자열의 한 글자 변경은 불가하다.

fruit = "apple"
for letter in fruit:
     print(letter, end=" ")
결과:
a p p l e

예를 들면 입력 받은 문자열에 모음만 없애는 것도 가능하다.

text = input("문자를 입력하십시요: ")
gather = "AIOEUaioeu"
result =""

for letter in text:
    if letter not in gather:
        result += letter
print(result)

결과: 
문자를 입력하십시요: HALLO
HLL

또 다른 예로 문자열 중에서 자음과 모음의 개수를 집계하는 프로그램이 있다.

original = input('문자열을 입력하시오: ')
word = original.lower()                           # 입력 받은 문자열을 소문자로 변경한다.
vowels = 0
consonants = 0

if len(original) > 0 and original.isalpha():    # 문자열의 길이가 0초과이고, 알파벳이라면….
    for char in  word:                              # 각 문자에 대한 반복을 실행
        if  char in 'aeiou’:                          # 모음이라면…
            vowels = vowels + 1                  # vowels변수에 1을 증가한다.
        else:                                           # 모음이 아니라면…
            consonants = consonants + 1      # consonants변수에 1을 증가한다.
        		
print("모음의 개수", vowels)
print("자음의 개수", consonants)
결과:
문자열을 입력하시오: iokkk
모음의 개수 2
자음의 개수 3

위의 예시에서 ~~.lower()은 문자열을 소문자로 변경시켜주는 함수이며, 반대로 ~~.upper()은 대문자로 변경 시켜준다. 또한 ~~.isalpha()는 문자열이 '영어 혹은 한글'인지 아닌지에 따라 True, False를 출력한다. 비슷한 함수로 ~~.isalnum()함수는 '영어, 한글 ,숫자'에 따라 True, False를 출력한다.

0개의 댓글

관련 채용 정보