for = 정해진 횟수만큼 반복 / 횟수 완료시 끝
while = 주어진 조건을 유지 / 조건 만족시 끝
1. for 기본구조
for <반복자> in <반복가능개체>:
<block>
for i in range(5): for i in range(1, 5):
print (i) print (i, end="")
--------------- -------------------------
0 1234
1
2
3
4
반복가능 개체에서 자주쓰이는 것은 리스트list( a = [x, y, z ...] 형태) 그리고 range가 있다.
range의 경우 for과 함께 자주쓰이는 영혼의 단짝이라고 할 수 있다.
range(a, b, c) = (시작하는 수, 끝나는 수, 간격)
이외에 주의해야할 점은 range에서 끝나는 수(b)는 b-1까지만 반복된다.
이유는...... 잘 모르겠지만 5 미만까지 반복해라, 이런 의미여서가 아닐까?
2. for else
If - else에서 If에 걸리지 않은 반대 조건을 출력하는 것이 else였다면
for에서도 의미가 동일하다. for이 실행된 후, for 조건에 걸리지 않은 부분을 출력하는 것이 else다.
lists = [1, 4, 17, 23] #lists라는 리스트 변수를 만들었고
for i in lists: #i 안에 lists가 들어가게 되어
if i < 10: #i가 10보다 작으면
print(i) #i를 출력한다
else: #i가 10보다 크게되면
print('\n10보다 크기에 반복문이 끝납니다') #출력
----------------------------------
1
4
10보다 크기에 반복문이 끝납니다
앞에 나왔던 list까지 단박에 설명하는 스크립트다.
lists안에 10보다 작은 1, 4까지 출력되었다가
다음 수인 17은 10보다 크기에 다음 else로 넘어간 것이다.
lists = [1, 4, 17, 23]
for i in lists:
if i < 10:
print(i)
break
else:
print('\n10보다 크기에 반복문이 끝납니다')
------------------------------------------------
1
여기서 break를 사용해주면 if문에 있는 반복문이 1번 시행되고 끝난다.
당연히 else도 실행되지 않는다.
3. for 중첩 반복문(nested loop)
if처럼 for안에 또 for 넣는 것을 말한다.
for 중첩문의 구조와 외부, 내부 조건문의 순서는 구구단 쓰기 예제로 알아보자.
for i in range(2,10):
for j in range(1,10):
print(f'{i} * {j} = {i * j}')
-------------------------------------
2 * 1 = 2 / 2 * 2 = 4 / 2 * 3 = 6 / 2 * 4 = 8 / 2 * 5 = 10 / #이하생략
3 * 1 = 3 / 3 * 2 = 6 / 3 * 3 = 9 / 3 * 4 = 12 / 3 * 5 = 15 / #이하생략
4 * 1 = 4 / 4 * 2 = 8 / 4 * 3 = 12 / 4 * 4 = 16 / 4 * 5 = 20 / #이하생략
# 5, 6, 7, 8단 생략
9 * 1 = 9 / 9 * 2 = 18 / 9 * 3 = 27 / 9 * 4 = 36 / 9 * 5 = 45 / 9 * 6 = 54 / 9 * 7 = 63 / 9 * 8 = 72 / 9 * 9 = 81 /
다 쓰기엔 많아서 생략했다. 코드를 돌려보면 구구단이 정상적으로 다 나온다.
외부 for i in range(2, 10)은 구구단의 2단, 3단, 4단 등 앞의 숫자가 된다.
내부 for j in range(1, 10)은 구구단의 *1, *2 등 뒤에 곱하는 숫자가 된다.
j가 1부터 9까지 다 돌아가고 나서야(2단이 끝나야)
그다음 3단이 시작되며 i가 돌아가는 것을 볼 수 있다.
i가 1번 -> j가 전체 범위를 쭉 돌고 -> j가 다 끝나면 다시 i 2번째 반복 -> j는 또 다시 전체 범위 돈다.
이런 구조다.
4. pass, continue, break
반복문에서 자주 사용하는 명령어를 알아보자.
for i in range(10):
if i % 2 == 0: #i를 2로 나눈 나머지가 0일때(짝수일때)
pass #넘어감
print(i, end=' ')
print('반복 끝')
------------------
0 2 4 6 8 반복 끝
pass = 넘어간다 = 바로 다음줄로 넘어간다
1. 넣어줄 조건이 딱히 없을 경우
2. class 선언할 때, 초기에 넣어줄 값이 없을 경우
3. 코드 작성후 동작 확인을 위해 실행할때, 오류가 발생하지 않도록 하기 위해
사실 위에 짠 코드의 경우 pass를 넣어줄 필요 없지만 continue와의 비교를 위해 넣었다.
for i in range(10):
if i % 2 == 0:
continue
print(i, end=' ')
print('반복 끝')
--------------------
반복 끝
continue = 하위코딩 무시하고 다음 상위 코딩으로 넘어간다
pass와 continue 차이를 잘 모르겠어서 끙끙대다가 얻은 결론이다.
continue는 하위코딩을 무시하기에 4번째 줄인 print(i, end = ' ')을 무시하고 상위(하단)에 있는 '반복 끝' 만 찍혔다.
5. while
while = 주어진 조건을 유지 / 조건 만족시 끝. 사용 방법도 for보다는 간단한 것 같다. 지금은.
while <조건>:
i = 0
while i < 10:
i += 1
print(i)
----------------
1 2 3 4 5 6 7 8 9 10
간단하다. 10보다 작을때까지 i를 1씩 더해서 출력한 것이다.
for과 다른 점은 for i in <반복가능개체>에서 i가 임의의 반복자 역할을 하는 것과 달리
while에서는 i를 따로 선언해줘야 한다(첫째줄 i = 0)
5-1. while안에서 입력받을 때, 특정 조건 만족시 입력 끝내는 법(보초값, sentinel)
sum = 0 #성적 합계
score = 0 #성적을 받을 변수
avg = 0 #성적 평균
n = 1 #입력한 사람 수
print("종료하려면 음수를 입력하세요")
while score >= 0:
score = int(input("%d번째 과목 성적을 입력하세요: " %n))
if score > 0:
sum = score + sum
n = n+1
if n > 0:
avg = sum / (n-1) #처음에 n=1부터 시작했기 때문에 1을 빼줌
print("성적 평균은: %f점 입니다" %avg)
-------------------------------------------
종료하려면 음수를 입력하세요
1번째 과목 성적을 입력하세요: 30
2번째 과목 성적을 입력하세요: 35
3번째 과목 성적을 입력하세요: 25
4번째 과목 성적을 입력하세요: -1
성적 평균은: 30.000000점 입니다
갑자기 코드가 길어졌다고 당황하지 말자. 과목 성적 n개를 입력하여 그것의 평균을 구하는 코드다.
while안에서 반복문을 입력받을 때, 몇 개를 받을지 알 수 없을 경우 반복을 끝내는 것을 배우기 위해서 짜봤다.
성적을 받는 score가 0, 양수일때 반복문이 돌아가도록 설정했으니 음수를 입력하면 반복문이 종료된다.
이때 Sentinel = 음수값, 즉 데이터의 끝을 알리며 정상적인 입력이 아닌 값을 의미한다. (용어가 중요하진 않은듯)
while문 밖에 있는 if n > 0: 구문은 while 안쪽으로 넣든 저것처럼 바깥으로 빼든 상관없다.
어차피 score가 0 이상일때 if문이 돌아가기 때문이다.
6. 응용
6-1. Turtle 모듈에서 for과 원
import turtle as t
t1 = t.turtle()
for i in range(0, 360, 360//12): #0도부터 360도까지, 30도 간격으로
t1.circle(-300, 360//12) #-300이 반지름인 원을, 30도까지만
t1.right(90)
t1.forward(5)
t1.back(5)
t1.left(90)
Turtle 모듈은 파이썬 안에 있는 모듈로, import 명령어를 통해 불러올 수 있다.
교수님이 자꾸 재밌으라고 turtle 모듈로 뭐 그려오는 과제를 내주시는데, 저런걸 재밌어 해야 교수 하나보다.
결과 화면이다. turtle 모듈에 대한 자세한 설명 (임포트나 펜 설정)은 일단 제쳐두고 for 문장만 주목하길 바란다.
for i in range(시작, 끝, 간격)인데, circle을 그린다고 한다면 괄호 안의 숫자는 원의 각도가 된다.
0도부터 360도까지, 간격은 360을 12로 나눴을때의 //(몫)인데... 안되는 줄 알았으나 그냥 30이라고 해도 작동된다;;
6-2. while True: 무한반복!
import time
import datetime
while True: #무한반복
sec = dt.datetime.now().second
min = dt.datetime.now().minute
hr = dt.datetime.now().hour
print(" %d시 %d분 %d초" %(hr, min, sec))
---------------------------------------------------------------
18시 27분 32초
18시 27분 33초
18시 27분 34초
이상한 것들은 신경쓰지 말고 while True에 주목하자.
while True: 는 현재 상황을 무한반복 한다.
여기서 사용한 datetime은 현재 시간을 받아오는 모듈이다.
이 코드를 실행하지는 말자. 1초마다 실행하라는 명령어를 안넣어줘서, 실행하면 당신의 콘솔창이 엉망이 될 것이다...
'게임 제작 관련 > 개발환경(프로그램)' 카테고리의 다른 글
Python def 함수정의, return 반환문 (1) | 2022.10.13 |
---|---|
R subset, which함수 & 패키지 다루기(엑셀 등) (0) | 2022.10.11 |
R 시작하기3 - list, Factor, 데이터 타입 바꾸기(casting) (0) | 2022.10.05 |
R 시작하기2 - Matrix(행렬), Dataframe만들기 (0) | 2022.10.04 |
Python if문(조건문) 예제 한 개로 한방정리 (1) | 2022.09.30 |
댓글