1. 이중 루프
루프 안에 들어가는 명령의 종류에는 제약이 없어 또 다른 루프가 들어갈 수도 있다. 루프끼리 중첩된 것을 이중 루프라 하며 간단한 예제를 들자면 구구단 출력 프로그램이 있다.
ex) 구구단
for x in range(2,10):
print(x,"단")
for y in range(1,10):
print(x," X ",y," = ",x*y)
.............
위와 같은 예제를 while문으로 작성할 수 있다.
x = 2
while x <= 9:
print(x, "단")
y = 1
while y <= 9:
print(x," X ",y," = ",x*y)
y += 1
x += 1
ex) 삼각형 별 그리기 (높이가 10인 삼각형 별을 만들어보자.)
for x in range(1,11):
for y in range(x):
print('*', end='')
print()
ex) 뒤집어서 그려보기
for x in range(1,11):
for y in range(10-x):
print(' ', end='')
for y in range(x):
print('*', end='')
print()
첫 줄엔 별이 하나이므로 10-1을 해서 나머지 9칸은 공백을 출력하여 완성하였다. 마지막 줄도 별이 10개 이므로 10-10을 하여 공백은 0이 된다.
ex) 높이가 10인 피라미드 그리기
for x in range(1,21,2):
for y in range(int((20-x)/2)):
print(' ', end='')
for y in range(x):
print('*', end='')
print()
x의 값은 1부터 20까지 2만큼 증가하게 하면 1, 3, 5, 7, 9, .... , 19이고
두 번째 줄의 int( (20 - x) / 2 )의 값은 9, 8, 7, 6, ... , 0 이 된다.
따라서 첫째 줄에 왼쪽 공백이 9개, 둘째 줄에는 왼쪽 공백이 8개, .... 마지막 10번째 줄에는 공백이 0개로 피라미드가 완성된다.
이 예제들의 핵심은 안쪽 루프에서 바깥쪽 루프의 제어변수를 참조한다는 것이다. 루프 내부에서 제어 변수는 언제든지 참조할 수 있다. y 루프의 반복 횟수를 바깥쪽의 x 제어 변숫값으로 결정하므로 각 행에 출력되는 * 문자의 개수가 점점 늘어난다.
위 예제들 중 삼각형 그리기의 경우 이중루프를 사용하지 않고 문자열에 정수를 곱하면 그 수만큼 반복된 문자열이 생성된다는 점을 이용하면 간단한 방법으로 문제를 해결할 수 있다.
ex) 삼각형 그리기 (문자열 곱 이용)
for x in range(1,11):
print("*"*x)
코드는 훨씬 짧지만 실행 결과는 같다. 사실은 문자열에 정수를 곱하는 코드 자체가 내부적으로 루프이다.
2. 무한 루프
무한 루프는 반복 횟수를 정하지 않고 무한히 반복하는 루프이다. 루프를 시작할 때 반복 횟수를 미리 알 수 없다면 무한히 반복하도록 해 놓고 루프 중간에 조건을 첨가하여 탈출하는 형식이다. while문으로 작성하며 for문으로는 만들 수 없다.
while True:
명령1
if 탈출 조건:
break
ex) 무한루프 탈출하기
while True:
ans = input("제 고향을 맞혀보세요 : ")
if ans == '대구':
print("정답!")
break
print("아닙니다.")
이 예제는 작성자의 고향을 맞히는 문제를 출제하고 사용자로부터 정답을 입력받아 답을 체크한다. 사용자가 정답을 맞힐 때까지 반복하며 정답을 맞히는 순간 break으로 루프를 탈출한다.
게임 개발에서도 루프가 필수적으로 사용되는데 예를 들어 2D 게임에서 캐릭터가 이동할 때 장애물이 앞에 있으면 더 이상 앞으로 가지 않는 상황을 생각해보자
while True:
if 가는 방향에 장애물 감지:
break
키를 입력받고 이동
화면에 출력
물론 실제 게임을 개발한다면 좀 더 복잡한 형태가 되겠지만 대부분 저런 식으로 활용을 할 수 있다는 점이 중요하다.
- 범위의 원칙 -
일상생활에서는 당연한 상식이 컴퓨터의 세계에서는 완전히 달라지는 경우가 있다. 아날로그와 디지털 세계의 차이라고 할 수 있는데 프로그래밍은 컴퓨터의 세계에서 일어나는 일이므로 이런 차이점에 유의해야 한다. range(1,10)의 경우는 1부터 9까지의 수를 만들어 내고 range(10)의 경우는 0부터 9까지의 범위를 나타낸다. 배열도 마찬가지로 배열을 생성하면 가장 첫 번째의 배열은 arr[1] 이 아닌 0번째 배열 arr[0]이다. 기준점(base)에서의 상대적인 거리를 오프셋이라고 하는데 첫 요소의 오프셋이 0부터 시작해야 계산이 빠르고 자연스럽기 때문에 컴퓨터는 숫자를 항상 0부터 시작한다.
감사합니다.
'🐍PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 List(리스트) 정렬 - sort(), reverse() (0) | 2020.02.27 |
---|---|
[PYTHON] 파이썬 함수, 인수(키워드 인수), 변수(지역, 전역 변수) (0) | 2020.02.16 |
[PYTHON] 파이썬 조건문 (if 조건문, 논리연산자, 비교연산자, 블록구조, else문, elif문, 중첩문) (0) | 2020.02.16 |
[PYTHON] 파이썬 연산자(대입 연산자, 산술 연산자, 타입변환, 우선순위, 결합순서) (0) | 2020.02.16 |
[PYTHON] 파이썬 타입(수치형, 문자열, 그 외의 타입) (0) | 2020.02.16 |