For in range 파이썬 - For in range paisseon

For in range 파이썬 - For in range paisseon
파이썬 for 반복문, range 함수 - 코드잇

for반복문

파이썬의 for반복문은 리스트에 있는 원소들을 차례로 지정한 변수에 넣어준다.

for 변수 in 리스트: 

위의 형태로 작성하는데 for 뒤에 지정한 변수에 리스트의 값을 하나씩 넣어주며 반복한다.

twice = ["나연", "다현", "정연", "쯔위", "모모"]

for member in twice:
    print(member)

member 변수에 나연, 다현, 정연, 쯔위, 모모가 순서대로 들어가면서 print(member)를 실행한다. 
결국 print("나연"), print("다현"), print("정연"), print("쯔위"), print("모모")를 실행하게 되는 것이다.

For in range 파이썬 - For in range paisseon
for문 실행결과

range 함수

파이썬의 range 함수는 숫자의 범위를 정해주면 그에 맞는 리스트를 만들어 준다. (실제로 리스트를 만드는 것은 아니고 값을 쓰고 버리긴 하지만 for문에서 쓸 때 리스트와 똑같이 쓸 수 있다.)

range(a, b)

위의 형태로 쓰면 a부터 b-1까지의 수를 뜻한다.

for i in range(1, 11):
    print(i)

이렇게 쓰게 되면 1부터 10까지 순서대로 i에 들어가며 print를 실행한다.

For in range 파이썬 - For in range paisseon
range 실행결과1

range함수는 파라미터를 1개만 가질 수도 있다.

range(b)

위의 형태로 쓰면 0부터 b-1까지의 수를 뜻한다.

for i in range(11):
    print(i)

이렇게 쓰게 되면 0부터 10까지 순서대로 i에 들어가며 print를 실행한다.

For in range 파이썬 - For in range paisseon
range 실행결과2

마지막으로 range함수는 파라미터를 3개까지 가질 수 있다.

range(a, b, c)

위의 형태로 쓰면 a부터 b-1까지 c만큼 건너뛰는 수를 뜻한다.
예를들면 range(0, 50, 5) 라고 했을 때 0, 5, 10, 15....45 를 뜻한다고 생각하면 된다.

for i in range(0,50,5):
    print(i)

이 코드에서 위의 예시처럼 변수 i에 0, 5, 10, 15... 가 순서대로 들어가며 print를 실행한다.

For in range 파이썬 - For in range paisseon
range 실행결과3

구구단 출력하기

for문과 range함수를 사용하면 아주 쉽게 구구단을 출력할 수 있는데 for문 안에 for문이 들어가야 한다.

for i in range(1,10):
    for x in range(1,10):
        print(f'{i} * {x} = {i*x}')

첫 번째 for문의 변수 i는 구구단의 단을 뜻하는 변수이고,
첫 번째 for문 안에 들어가 있는 두 번째 for문의 변수 x는 곱할 수를 뜻한다.

For in range 파이썬 - For in range paisseon
구구단 실행결과

실행해보면 9단까지 잘 나오는걸 확인할 수 있을 것이다. 실행결과가 너무 길어 스크린샷은 중간에서 잘랐다.

학습 목표

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

  • 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의 반복을 제어하기 위해 사용됩니다. 하지만 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)

CONTENTS