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

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

학습 목표

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

  • for
  • range

forrange의 등장

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

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의 반복을 제어하기 위해 사용됩니다. 하지만 for와 range를 쓰게 된다면 코드가 더 간단해집니다. 다음 예제는 위 예제와 동일하게 작동합니다. 한번 실행시켜 보세요.

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))
pl1
5
2
6
3
7
5
8
6
9
점수출력: [1, 5, 2, 6, 3, 7, 5, 8, 6, 9]
평균: 5.2
최대: 9
최소: 1

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


a_1(1.) for, range의 등장

for i in range(10):

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

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

a_2(2.) 반복문

for st in students:

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

a_3(3.) 누적

    scoreAll += st

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


for의 사용법

리스트 순회하기

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

for 변수명 in 리스트:
    내용

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

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

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

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

for st in students:
    scoreAll += st

위 코드에서 st는 students의 각 항목으로 차례로 대변되고, 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-in 에서는 자동으로 범위를 인식하여 처음부터 끝까지 읽어올 수 있으니 걱정할 필요가 없지요.


지정된 횟수만큼 반복하기

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 미만의 정수가 나열되어 있는 리스트를 만듭니다. start는 stop보다 작아야 합니다.

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 그 자체는 리스트에 포함되지 않는다는 점을 유념해주세요. 위 예제에서는 stop10을 두었지만 10이 포함되지 않았습니다. step이 양수라 점점 커지는 리스트라면 stop미만의 의미를 갖고, step이 음수라서 리스트가 점점 작아지는 흐름이라면 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

continue

for에서는 while과 마찬가지로 continue를 사용할 수 있습니다. continue의 역할은, continue를 만나자마자 즉시 다음 루프로 이동한다는 것입니다.

for i in range(100):
    if i % 3 == 0:
        print(i, "는 3의 배수입니다.")
        continue
    print(i, "는 3의 배수가 아니랍니다!!")
(중략)
89 는 3의 배수가 아니랍니다!!
90 는 3의 배수입니다.
91 는 3의 배수가 아니랍니다!!
92 는 3의 배수가 아니랍니다!!
93 는 3의 배수입니다.
94 는 3의 배수가 아니랍니다!!
95 는 3의 배수가 아니랍니다!!
96 는 3의 배수입니다.
97 는 3의 배수가 아니랍니다!!
98 는 3의 배수가 아니랍니다!!
99 는 3의 배수입니다.

위 코드에서는 i가 3의 배수인 경우 메시지를 출력하고 그대로 continue를 하고 있습니다. 그래서 아래 쪽 printifelse에 둘러싸여져 있지 않아도 실행되지 않고 다음 루프로 넘어간다는 것을 확인하실 수 있습니다. 만약 continue가 없다면 i가 3의 배수라도 3의 배수가 아니라는 메시지가 중복되어 출력되겠지요.


연습 문제

  • for의 사용법은 무엇인가?
  • range의 사용법은 무엇인가?

프로그래밍 문제

  1. for과 range를 이용하여 1부터 100까지 3의 배수를 출력하는 프로그램을 작성하세요.
  2. 두 수를 입력받고 두 수 사이의 모든 5의 배수를 출력하는 프로그램을 작성하세요. 단, for과 range를 이용하여 문제를 해결해보세요. (주의: 두 수 중 어느 것이 크고 작은지 체크해야 합니다.)
  3. 다음은 학생들의 점수입니다. 평균과의 편차가 가장 큰 점수 (평균으로부터 가장 멀리 떨어진 점수)를 구하여 출력하세요.
    slist = [48, 55, 51, 47, 37, 48, 47, 45, 49, 47, 54, 51, 44, 50, 47, 46, 50, 55, 50, 45]
  4. 다음과 같이 모든 시간과 분을 출력하는 파이썬 프로그램을 작성하세요. (힌트 : for문 2개를 중첩해봅시다.)0 0 0 1 0 2 0 ... 0 59 1 0 1 1 1 2 .. 23 59 복사하기
  5. 완전수 문제 : 숫자 N에 대하여 자기 자신을 제외한 약수를 모두 더한 값이 N이 된다면, 이 N은 완전수라고 합니다. 예를 들어 6의 약수는 1, 2, 3, 6인데, 여기서 자기 자신을 제외한 1, 2, 3을 모두 더하면 6이 되므로 6은 완전수입니다. 2이상 1000이하의 수 중 완전수를 모두 찾아 출력하세요. (range 사용)
  6. 로프 문제 : n 개의 로프가 있고, 각 로프에는 견딜수 있는 중량 w가 각각 있습니다. 만약 n 개의 로프를 사용하여 물건을 메단다면, 각 로프에 물건의 무게 / n 만큼 무게가 분산됩니다. 로프를 한 개 혹은 여러 개를 사용하여 견딜 수 있는 최대한의 무게를 계산하고자 합니다. 첫 번째 입력으로 로프의 개수 n 을 입력받고, 각 로프의 w 를 입력받은 뒤, 매달 수 있는 최대 무게를 출력하세요.
    • 요점: n 개의 로프 중 가장 약한 로프가 버틸 수 있는 중량이 min_w 일 때, 버틸 수 있는 최대 무게는 n * min_w 입니다. 왜냐하면 그 이상의 무게가 된다면 가장 약한 로프가 버틸 수 있는 중량을 초과하여 줄이 끊어질 것이기 때문이죠.
    • 예시 입력: 4 <Enter> 11 <Enter> 7 <Enter> 4 <Enter> 15 <Enter>
    • 예시 입력의 뜻: 4개의 로프를 사용할 것이고 각 로프의 견딜수 있는 중량이 117415이다.
    • 정답 : 22
    • 근거 – 사용할 로프 개수에 따른 최대 무게
      • 1개: 사용 로프 – 15, 최대 무게 – 15 * 1 → 15
      • 2개: 사용 로프 – 11, 15, 최대 무게 – 11 * 2 → 22
      • 3개: 사용 로프 – 11, 7, 15, 최대 무게 – 7 * 3 → 21
      • 4개: 사용 로프 – 11, 7, 4, 15, 최대 무게 – 4 * 4 → 16

프로그래밍 문제 정답

1. 코드입니다.

for i in range(3, 100, 3):
    print(i)

2. 코드입니다.

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)

3. 코드입니다.

slist = [48, 55, 51, 47, 37, 48, 47, 45, 49, 47, 54, 51, 44, 50, 47, 46, 50, 55, 50, 45]

avg = sum(slist) / len(slist)
bestnum = 0
bestdiff = 0

for num in slist:
    diff = avg - num
    if diff < 0:
        diff *= -1
    
    if bestdiff < diff:
        bestdiff = diff
        bestnum = num

print(bestnum)

4. 코드입니다.

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

5. 코드입니다.

perfect = []
for num in range(2, 1001):
    div_sum = 0
    for sub in range(1, num):
        if num % sub == 0:
            div_sum += sub
    if div_sum == num:
        perfect.append(num)
print(perfect)

6. 코드입니다.

count = int(input())
weights = []
for i in range(count):
    weights.append(int(input()))

weights.sort()
weights.reverse()
nowCount = 0
maxWeight = 0
for i in weights:
    nowCount += 1
    if maxWeight < i * nowCount :
        maxWeight = i * nowCount

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

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

  1. 안 풀리는 부분이 생겨서 질문 댓글을 남기려다가 다시 개념부분을 보고 풀어냈습니다 핳 -.-
    그치만 쓰려던 댓글에 글쓴님 덕분에 파이썬공부를 잘 하고 있단 내용을 포함하려했기에 이 참에 댓글을 남깁니다
    감사합니다

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to top