본문 바로가기
Python

13. 파이썬 반복문(for)

by To올라운더 2023. 7. 1.
반응형

[1] for 반복문

우리가 지금까지 배운 자료유형과 조건문(if)를 정확히 이해했다면 대부분의 상황을 코딩으로 정의할 수 있다.

하지만 2가지 문제점이 있는데 첫번째는 프로그램 동작이 1회성으로 끝이 난다는 것이고,

두번째는 반복되는 불필요한 코드를 계속 작성해야 한다는 것이다.

아래 예시에서 보면 10명의 학생의 시험 점수에 따라 결과를 안내하는 프로그램이다.

student1 = 80
student2 = 70
student3 = 100
student4 = 80
student5 = 60
student6 = 50
student7 = 50
student8 = 40
student9 = 70
student10 = 80

if student1 >= 60:
    print('pass')
else:
    print('fail')

if student2 >= 60:
    print('pass')
else:
    print('fail')

if student3 >= 60:
    print('pass')
else:
    print('fail')


# student4 ~ 9 생략

if student10 >= 60:
    print('pass')
else:
    print('fail')

의미가 없는 반복적인 부분이 많아 student4~9까지는 생략하였으나, 이런 유사한 형태를 지닌 반복적인 작업을 효율적으로 수행하기 위해 우리가 배운 리스트를 먼저 적용해보겠다.

class1_score 라는 리스트에 해당 학생들의 점수를 순차적으로 넣어보면

처음 student1부터 10까지 10줄에 해당 하는 점수에 대한 변수가 간단히 한줄의 리스트로 작성되었고

리스트의 특성을 이용하여 인덱싱을 통해 각각의 점수를 관리할 수 있게 되었다.

class1_score = [80, 70, 100, 80, 60, 50, 50, 40, 70, 80]

if class1_score[0] >= 60:
    print('pass')
else:
    print('fail')

if class1_score[1] >= 60:
    print('pass')
else:
    print('fail')

if class1_score[2] >= 60:
    print('pass')
else:
    print('fail')


# class1_score[4 ~ 9 생략

if class1_score[9] >= 60:
    print('pass')
else:
    print('fail')

그런데 student 변수의 숫자는 리스트라는 자료 유형으로 효율적인 관리를 하지만,

대상만 다르고 똑같은 기능을 하는 명령문은 효율적이지 못하다.

이런 부분을 for 반복문을 사용해보면

class1_score = [80, 70, 100, 80, 60, 50, 50, 40, 70, 80]

for ind_score in class1_score: 
    if ind_score >= 60:
        print('pass')
    else:
        print('fail')

이전까지 1명의 학생에게 4줄의 if와 else문을 사용한 것과 달리(10명일때 40줄)

for문은 10명의 결과를 처리하는데 5줄로 완료되었다.

학생이 15명이 되더라도 class1_score에 각 요소문 추가할 뿐 반복문은 수정할 필요도 없다.

얼마나 효과적인 방법인가? 이제 이런 for문에 대해 좀 더 자세히 알아보겠다.

 

1. 구조

  - 위에서 간단히 본 것 같이(사실 거의 대부분을 보았다고 해도 할말이 없다...) 

     for 반복문은 'for 변수 in 대상 리스트(튜플, 문자열 도 가능): ' 의 형태로 구성된다.

     여기에서의 변수는 대상 리스트의 순차적인 값을 불러오는 용도이다.

     class1_score[0], class1_score[1], class1_score[2] 등 우리가 직접 입력하지 않아도

      인덱스 순서에 맞게 순차적으로 불러오는 기능을 수행한다.

 

 2. 반복 작업 확인하기(count 더해보기)

  - 실제 반복적으로 진행되는 여부를 확인하기 위해 학생들의 이름과 함께 pass, fail을 출력해보겠다.

class1_score = [80, 70, 100, 80, 60, 50, 50, 40, 70, 80]

student_id = 1 # 초기화 값 지정

for ind_score in class1_score: 

    print(f'student{student_id}', end='  : ') # f string, end 파라미터 사용

    if ind_score >= 60:
        print('pass')
    else:
        print('fail')

    student_id += 1 # student_id = student_id + 1 과 같은 의미

- 처음 student_id 값을 1로 지정하였으나, for 반복문의 가장 하단(15라인)을 통해 1씩 증감하는 동작이 진행되고 있음을 확인할 수 있다.

- 위의 코드에서 지금까지 배운 문자열 f string 과 end 파라미터(print end기본 값, 줄바뀜)의 용도를 확인할 수 있고

- student_id 의 경우 2가지를 유의해야 하는데, 

  첫번째는 변수를 사용 시 항상 사용처에 맞는 초기 값(초기화)가 필요하다는 것과(4라인)

  두번째로 '+=' 이라는 기호를 통해 반복되는 변수의 사용 없이 간결하고 효율적인 표현이 가능하다는 것이다.

 - 그런데 이런 index 번호 조차 선언 없이 사용 할 수 있는 방법이 있는데, enumerate 함수이다.

class1_score = [80, 70, 100, 80, 60, 50, 50, 40, 70, 80]


#student_id = 1 # 초기화 값 지정, enumerate 사용시 불필요

for id, ind_score in enumerate(class1_score, 1): 

    #print(f'student{student_id}', end='  : ') # f string, end 파라미터 사용
    print(f'student{id}', end='  : ')
    if ind_score >= 60:
        print('pass')
    else:
        print('fail')

    #student_id += 1 # student_id = student_id + 1 과 같은 의미, enumerate 사용시 불필요

- enumerate는 해당 리스트의 인덱스 번호와 값을 반환해주는 함수이며,

   enumerate를 사용하게 되면 함수에서 인덱스 값을 생성해주므로

   위에서와 같은 인덱스 값을 가져오기 위해 직접 student_id 변수값 선언 및 값의 증가가 필요 없어진다.

   사용방법은 6라인과 같이 enumerate 함수 안에 원하는 리스트를 넣어주면 되고, 시작 인덱스 값이 0 일때는 생략 또는 0을 입력하고, 1번부터 시작하고 싶을 때는 예시와 같이 1을 입력한다.

 

3. continue

  - 파이썬은 들여쓰기의 위치에 따라 수행하는 명령어의 범위가 달라진다고 언급하였는데,

   아래에서와 같이 파란색 영역에 대한 조건을 반환한 뒤, 보라색 영역은 파란색 영역의 결과에 상관없이 진행된다.

class1_score = [80, 70, 100, 80, 60, 50, 50, 40, 70, 80]


for id, ind_score in enumerate(class1_score, 1): 

    
    print(f'student{id}', end='  : ')
    if ind_score >= 60:
        print('pass')
    else:
        print('fail')
    
    print('한 학기동안 수고하셨습니다.')

 - 그런데 '한 학기 동안 수고하셨습니다.' 라는 멘트가 60점 이하의 학생에게는 출력하지 않으려면,

   print문의 위치를 if문으로 옮길 수도 있지만, 

   else문에 continue 를 추가함으로써 이후 동작은 하지 않고 다음 리스트의 점수를 비교하도록 반복문을 진행할 수 있는데, 코드는 아래와 같다.

class1_score = [80, 70, 100, 80, 60, 50, 50, 40, 70, 80]

for id, ind_score in enumerate(class1_score, 1): 
    
    print(f'student{id}', end='  : ')
    if ind_score >= 60:
        print('pass')
    else:
        print('fail')
        continue
    
    print('한 학기동안 수고하셨습니다.')

4. break

  - break는 continue와 달리 해당 조건을 만족하면 뒤에 처리해야할 대상 리스트가 남아 있어도 해당 조건문(for 반복문)을 종료시키는 명령어다.

class1_score = [80, 70, 100, 80, 60, 50, 50, 40, 70, 80]

for id, ind_score in enumerate(class1_score, 1): 
    
    print(f'student{id}', end='  : ')
    if ind_score >= 60:
        print('pass')
    else:
        print('fail')
        break

    print('한 학기동안 수고하셨습니다.')

  -  10명의 점수가 있었지만, 최초 60점 이하인 student6 이후 반복문이 종료되었음을 알 수 있다.

 

5. range

  - for 문의 대상에 리스트나 튜플 등의 자료 유형이 사용될 수 있는데, 실제 연속된 정수형은 숫자는 range 함수를 이용하면 편리하게 사용할 수 있다. range(0, 10)은 0이상 10미만의 정수를 순차적으로 출력하는 함수이며, 지금은 interval 값이 생략되어 1로 기본 지정이되지만, range(0,10,2) 처럼 2씩 증가하는 방식으로도 사용가능하다.

# 반복문 range
for i in range(0,10): # interval 생략 시 기본 값 1
    print(i, end=', ')

print('\n\n')
for i in range(0,10,2): # 2씩 증가
    print(i, end=', ')

 

6. 이중 for문 / 구구단 만들기

  - for 문도 들여쓰기에 따라 이중이나 그 이상으로 구성할 수 있다.

  - 아래는 2중 for문을 이용하여 구구단을 출력해보겠다.

# 구구단 만들기
for i in range(1,10):
    print(f'{i}단')
    
    for j in range(1,10):
        print(f'{i} * {j} = {i*j}', end=', ')

    print('\n')

  - 코드 결과에서 보이듯이 i 에 1이 할당된 후, 내부 블럭인 j의 1~9까지의 숫잘를 반복한다.

  - 해당 결과가 완료되면 i 값이 증가한 후 다시 j의 반복문이 진행된다.

 

반응형

'Python' 카테고리의 다른 글

15. 파이썬 함수  (0) 2023.07.04
14. 파이썬 반복문(while)  (0) 2023.07.03
12. 파이썬 조건문(if)  (0) 2023.06.30
11. 딕셔너리(dictionary) 특징  (0) 2023.06.29
10. 파이썬 집합(set) 특징  (0) 2023.06.27