파이썬 강좌 – for, range ~ 리스트의 항목을 다루기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 - 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 - 왜 파이썬인가?
    4. 파이썬 설치 - Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 - 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 - 소통하기
    2. 변수와 대입 - 기억하기
    3. 연산자 - 계산하기
    4. 조건문 - 분기를 만들기
    5. 반복문 - 비슷한 작업을 반복하기
    6. 변수와 리스트 - 비슷한 변수들을 묶기
    7. for, range - 리스트의 항목을 다루기
    8. 파이선 기초 꿀팁
      1. 함수와 메소드의 호출 - 편리한 기능 이용하기
      2. 모듈 설치와 사용 - 유용한 기능 끌어다 쓰기
      3. 문자열 - 텍스트 다루기
  4. 파이썬 중급
    1. 정규표현식 - 문자열을 검색하고 치환하기(작성중)
    2. 함수를 직접 만들기 - 자주 쓰는 기능을 묶기
    3. 딕셔너리, 튜플, 세트 - 변수를 다양한 방법으로 묶기
    4. 클래스와 객체 - 변수를 사람으로 진화시키기
    5. 상속 - 클래스를 확장하기
    6. 파이썬 중급 꿀팁
      1. 코드를 작성하는 사람의 의도(작성중)
      2. 정체성과 동질성 - 객체의 성질(작성중)
      3. 명령문, 표현식 - 문법을 이루는 것들 (작성중)
      4. 슬라이싱 - 리스트를 갖고 놀기
  5. 파이썬 고급
    1. 예외와 에러 - 예상치 못한 상황에 대응하기
    2. 특별 메소드와 연산자 - 파이썬의 내부 작동방식 이해하기
    3. 다양한 함수 인수 - 유연한 함수 만들기
    4. 시퀀스와 반복자 - 반복과 순회를 자유자재로 다루기
    5. 변수의 범위 - 이름 검색의 범위
  6. 파이썬 심화
    1. 제너레이터와 코루틴 -
    2. async와 await
    3. 데코레이터 - 함수의 기능을 강화하기
    4. 객체로서의 클래스 - 클래스를 동적으로 정의하기
  7. 실전 (파이썬 외적인 것들)
    1. 유니코드 - 컴퓨터에서 문자를 표기하는 방법
    2. html, css, 인터넷 - 자동화 첫 걸음 내딛기
    3. 네트워크 - 인터넷으로 통신하는 방법
    4. 문서 - 문맥을 읽어보기

학습 목표

이번 시간에 배울 내용은 다음과 같습니다.

  • for
  • range

for, range의 등장

리스트를 배울 때 사용했던 예제를 갖고 와 보겠습니다.

i = 0
scoreAll = 0
students = []
while i < 10:
    students.append(int(input()))
    i += 1

i = 0
while i < 10:
    scoreAll += students[i]
    i += 1

print("점수출력:", students)
print("평균:", scoreAll / 10)
print("최대:", max(students))
print("최소:", min(students))

여기서 i 변수를 주목해주세요. i 변수는 오직 while의 반복을 제어하기 위해 사용됩니다. 하지만 forrange를 쓰게 된다면 코드가 더 간단해집니다. 다음 예제는 위 예제와 동일하게 작동합니다. 한번 실행시켜 보세요.

scoreAll = 0
students = []
for i in range(10): ##a_1##
    students.append(int(input())) 

for st in students: ##a_2##
    scoreAll += st ##a_3##

print("점수출력:", students)
print("평균:", scoreAll / 10)
print("최대:", max(students))
print("최소:", min(students))
1
5
2
6
3
7
5
8
6
9
점수출력: [1, 5, 2, 6, 3, 7, 5, 8, 6, 9]
평균: 5.2
최대: 9
최소: 1

원활히 잘 작동됩니다. 이전 예제와는 달리 i가 한 번 밖에 등장하지 않았고, forrange라는 것이 새롭게 추가되었습니다. 하나하나 어떤 의미인지 대충 훑어본 다음 forrange에 대한 자세한 설명을 하겠습니다.


a_1(1.) for, range의 등장

for i in range(10):

for는 파이썬의 문법입니다. ifwhile의 지위를 함께 누리고 있는 예약어이지요. for의 기능은 리스트의 모든 항목을 한 번씩 순회하는 반복문입니다. for 직후에는 리스트의 항목 하나하나를 대변할 새로운 변수 이름이 등장하고, 그 다음에는 in, 그 다음에는 리스트가 등장합니다. 그리고는 새로운 블록이 시작됩니다.

여기서 range(10)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]와 아주 비슷한 뜻입니다. 우선은 그렇게 이해하고 넘어갑시다.

a_2(2.) for 반복문

for st in students:

for 문과 마찬가지입니다. students 안에 있는 모든 항목을 순회하면서 각 항목을 st에 대입시킵니다.

a_3(3.) 누적

    scoreAll += st

st는 모든 항목에 대응되므로 scoreAll은 결국 모든 학생의 점수를 합한 결과가 됩니다.


for의 사용법

for의 기본 골자는 다음과 같습니다.

for 변수명 in 리스트:
    내용

변수 명은 지금까지 쓰지 않은 새로운 변수명을 작성합니다. 우리는 변수를 이용하려면 먼저 정의를 해야 한다고 배웠는데요, 여기 for문에 들어가는 이 변수는 사전에 정의되지 않아도 됩니다. 리스트의 각 항목에 대응시킬 때 내부적으로 대입문을 사용하기 때문입니다. 그래서 자동으로 초기화 및 정의가 이루어집니다.

in은 우리가 이전에 배운 멤버십 검사 연산자와는 전혀 연관이 없음을 알려드립니다. for가 아닌 곳에서 inTrueFalse를 내뱉는 연산자이지만 여기서는 단순히 변수명과 리스트를 구분짓는 용도이고, for과 완전히 세트로 움직입니다. 그래서 for-in 문이라고도 이야기를 종종 합니다.

리스트에는 리스트 변수가 와도 되고, [1, 2, 3]와 같이 우리가 새로운 리스트를 생성해서 줄 수도 있으며, range(10)같은 방법으로 넣어줄 수도 있습니다. range에 대한 자세한 사용법은 이후에 설명합니다.

그 다음 콜론(:)과 들여쓰기로 새로운 블록이 시작되었다는 것을 알 수 있습니다. 이 블록 내부에서는 우리가 for 직후에 넣어주었던 변수명을 사용할 수 있습니다. for가 리스트의 모든 항목을 순회한다고 했습니다. 순회할 때마다 각 항목은 변수명으로 접근할 수 있습니다. 또한 이 블록은 리스트의 항목 개수만큼 반복한다는 것을 알 수 있습니다.

for st in students:
    scoreAll += st

위 코드에서 ststudents의 각 항목으로 차례로 대변되고, scoreAll += st 명령은 students 리스트의 항목 개수만큼 반복됩니다. 좀 더 일반적인 상황에서 그 흐름을 이야기해보면 아래 순서도와 같습니다.

graph TB a1["for st in students: 를 만난다."] a1 --> a2{"students에<br/>항목이 하나라도<br/>존재하는가?"} a2 -->|yes| a3["리스트의 첫번째 항목을<br/>st에 대입시킨다."] a2 -->|no| a4["for 블록을 실행시키지 않고<br/>다음으로 넘어간다."] a3 --> a5["블록을 실행시킨다."] a5 --> a6{"리스트에<br/>다음 항목이<br/>존재하는가?"} a6 --> |yes|a7["다음 항목을<br/>변수명에 대입시킨다."] a7 --> a5 a6 --> |no|a8["for 문을 끝내고 다음으로 넘어간다."]

for의 작동 순서

while에 비해서 정말 편리해졌지 않나요? 루프를 제어하기 위한 변수를 일일히 초기화할 필요도, 증감을 시켜줄 필요도 없어지게 됩니다. 또한 리스트를 직접 접근하게 되었을 때 (예: students[10]) 그 범위가 벗어나면 에러를 일으키는데, 그럴 걱정도 할 필요가 없게 되겠죠.


for i in range(10):
    students.append(int(input())) 

for의 주된 목적은 리스트를 순회하기 위함이지만, 위 예제에서 보시듯 range만을 이용해서 단순한 횟수만큼 블록을 실행시키는 용법으로도 쓸 수 있습니다. 문법적으로 반드시 변수명이 주어져야 하기 때문에 i라고 써넣기는 했지만 블록 내에서는 i가 사용되지 않았습니다.


range

range는 3가지 방식으로 사용할 수 있습니다. range는 소괄호 안에 넣을 변수의 개수에 따라서 작동이 살짝살짝 달라집니다.

range(stop)

변수를 하나만 넣는다면 0 이상 stop 미만의 리스트를 생성합니다.

for i in range(10):
    print(i)    
0
1
2
3
4
5
6
7
8
9

range(start, stop)

range에 두 개의 변수를 넣는다면 start 이상 stop 미만의 정수가 나열되어 있는 리스트를 만듭니다. startstop보다 작아야 합니다.

for i in range(10, 20):
    print(i)    
10
11
12
13
14
15
16
17
18
19

range(start, stop, step)

range에 세 개의 변수를 넣는다면 start 이상 stop 미만의 정수들을 step 만큼 건너뛰는 리스트를 만듭니다.

for i in range(10, 20, 2):
    print(i)
10
12
14
16
18

start보다 stop을 낮게 하고 step을 음수로 둔다면 어떻게 될까요? 바로 숫자가 낮아지는 리스트를 만들 수 있습니다! 즉 start 이하 stop 초과 의 숫자가 나열된 리스트가 만들어진다는 뜻입니다

for i in range(20, 10, -2):
    print(i)
20
18
16
14
12

여전히 stop 그 자체는 리스트에 포함되지 않는다는 점을 유념해주세요. stop미만 또는 초과 입니다.


정리

  • 리스트의 항목을 순회하려면 for 변수 in 리스트: 구문을 이용합니다.
  • for는 리스트의 길이만큼 반복하며, 변수를 리스트의 각 항목에 대응시킵니다.
  • range(a)0 이상 a 미만의 정수가 담겨있는 리스트를 만듭니다.
  • range(a, b)a 이상 b 미만의 정수가 담겨있는 리스트를 만듭니다.
  • range(a, b, c)a 이상 b 미만이되 c만큼 건너뛰는 정수의 리스트를 만듭니다.

break

for문 안에서도 break를 사용할 수 있습니다. 동작은 while 때와 동일하게 작동합니다. break를 만나는 순간 해당 for 블록을 즉시 빠져나옵니다.

for num in range(101, 200):
    if (num ** 0.5) % 1 == 0: # num의 제곱근이 정수라면
        print(num)
        break
121

연습 문제

(추가 예정)

프로그래밍 문제

일부 문제에 사용할 변수 하나를 먼저 정의하도록 하겠습니다. 아래를 사용하고 있는 텍스트 에디터에 복사 붙여넣기 해주세요.


biglist = [66, 67, 0, 34, 32, 79, 75, 51, 73, 50, 29, 90, 5, 36, 85, 40, 31, 67, 96, 92, 74, 28, 14, 29, 61, 52, 17, 14, 75, 41, 73, 88, 36, 96, 9, 92, 73, 80, 88, 1, 79, 90, 46, 53, 43, 8, 31, 56, 48, 48, 35, 55, 2, 15, 15, 34, 83, 48, 37, 78, 35, 89, 85, 59, 25, 0, 55, 
34, 82, 72, 92, 54, 54, 99, 87, 76, 30, 91, 71, 95, 17, 76, 49, 57, 31, 64, 19, 100, 94, 2, 7, 47, 67, 3, 38, 80, 75, 81, 0, 98]
  1. 두 수를 입력받고 두 수 사이의 모든 5의 배수를 출력하는 프로그램을 작성하세요. 단, forrange를 이용하여 문제를 해결해보세요. (힌트: 두 수 중 어느 것이 크고 작은지 체크해야 합니다.)

  2. 다음과 같이 모든 시간과 분을 추력하는 파이썬 프로그램을 작성하세요.

0 0
0 1
0 2
0 ...
0 59
1 0
1 1
1 2
.. 
23 59

프로그래밍 문제 정답

  1. 코드입니다.

    start = int(input('수1을 입력하세요 >> '))
    finish = int(input('수2을 입력하세요 >> '))
    if start > finish:
        start, finish = finish, start
    
    for i in range(start + 1, finish):
        if i % 5 == 0:
            print(i)
    
  2. 코드입니다.

    for hour in range(24):
        for minute in range(60):
            print(hour, minute)
    

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

Scroll to top