- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기
학습 목표
이번 시간에 배울 내용은 다음과 같습니다.
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
의 반복을 제어하기 위해 사용됩니다. 하지만 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
리스트의 항목 개수만큼 반복됩니다. 좀 더 일반적인 상황에서 그 흐름을 이야기해보면 아래 순서도와 같습니다.
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
그 자체는 리스트에 포함되지 않는다는 점을 유념해주세요. 위 예제에서는 stop
에 10
을 두었지만 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
를 하고 있습니다. 그래서 아래 쪽 print
는 if
나 else
에 둘러싸여져 있지 않아도 실행되지 않고 다음 루프로 넘어간다는 것을 확인하실 수 있습니다. 만약 continue
가 없다면 i
가 3의 배수라도 3의 배수가 아니라는 메시지가 중복되어 출력되겠지요.
연습 문제
for
의 사용법은 무엇인가?range
의 사용법은 무엇인가?
프로그래밍 문제
for
과range
를 이용하여 1부터 100까지 3의 배수를 출력하는 프로그램을 작성하세요.- 두 수를 입력받고 두 수 사이의 모든 5의 배수를 출력하는 프로그램을 작성하세요. 단,
for
과range
를 이용하여 문제를 해결해보세요. (주의: 두 수 중 어느 것이 크고 작은지 체크해야 합니다.) - 다음은 학생들의 점수입니다. 평균과의 편차가 가장 큰 점수 (평균으로부터 가장 멀리 떨어진 점수)를 구하여 출력하세요.
slist = [48, 55, 51, 47, 37, 48, 47, 45, 49, 47, 54, 51, 44, 50, 47, 46, 50, 55, 50, 45]
- 다음과 같이 모든 시간과 분을 출력하는 파이썬 프로그램을 작성하세요. (힌트 :
for
문 2개를 중첩해봅시다.)0 0 0 1 0 2 0 ... 0 59 1 0 1 1 1 2 .. 23 59
복사하기 - 완전수 문제 : 숫자 N에 대하여 자기 자신을 제외한 약수를 모두 더한 값이 N이 된다면, 이 N은 완전수라고 합니다. 예를 들어 6의 약수는 1, 2, 3, 6인데, 여기서 자기 자신을 제외한 1, 2, 3을 모두 더하면 6이 되므로 6은 완전수입니다. 2이상 1000이하의 수 중 완전수를 모두 찾아 출력하세요. (range 사용)
- 로프 문제 :
n
개의 로프가 있고, 각 로프에는 견딜수 있는 중량w
가 각각 있습니다. 만약n
개의 로프를 사용하여 물건을 메단다면, 각 로프에물건의 무게 / n
만큼 무게가 분산됩니다. 로프를 한 개 혹은 여러 개를 사용하여 견딜 수 있는 최대한의 무게를 계산하고자 합니다. 첫 번째 입력으로 로프의 개수n
을 입력받고, 각 로프의w
를 입력받은 뒤, 매달 수 있는 최대 무게를 출력하세요.- 요점:
n
개의 로프 중 가장 약한 로프가 버틸 수 있는 중량이min_w
일 때, 버틸 수 있는 최대 무게는n * min_w
입니다. 왜냐하면 그 이상의 무게가 된다면 가장 약한 로프가 버틸 수 있는 중량을 초과하여 줄이 끊어질 것이기 때문이죠. - 예시 입력:
4 <Enter> 11 <Enter> 7 <Enter> 4 <Enter> 15 <Enter>
- 예시 입력의 뜻: 4개의 로프를 사용할 것이고 각 로프의 견딜수 있는 중량이
11
,7
,4
,15
이다. - 정답 : 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개: 사용 로프 –
- 요점:
프로그래밍 문제 정답
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)
- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기
안 풀리는 부분이 생겨서 질문 댓글을 남기려다가 다시 개념부분을 보고 풀어냈습니다 핳 -.-
그치만 쓰려던 댓글에 글쓴님 덕분에 파이썬공부를 잘 하고 있단 내용을 포함하려했기에 이 참에 댓글을 남깁니다
감사합니다
공부에 도움이 되어서 다행입니다~~!