파이썬/기본

[파이썬] 반복문

caramel-bottle 2023. 9. 11.

반복문

같은 코드를 여러번 반복하고 싶을 때가 있다. 반복문이 있기 때문에 하나하나 코드를 적을 필요가 없다.

반복문은 동일한 작업을 여러번 실행하기 위해 사용하는 제어 구조이다.


while

while 조건:
  # 조건이 참인 동안 실행될 코드

while 반복문은 조건이 참인 동안은 계속 반복하는 구조이다. 조건이 거짓이 되면 반복을 멈춘다.

반복 출력

i = 1 # 적절하게 초기화

while i <= 5: # 여기서 조건이 거짓임을 판별하는 순간 빠져나옴
  print("Hello Python")
  i += 1 # i = i + 1

while 조건문에 사용되는 변수는 while 이전에 초기화가 되어야 한다. 

조건은 "i가 5보다 작거나 같다"이다. 조건이 참인 동안에는 반복하지만 원하는 만큼 반복한 후 조건을 거짓으로 만들어서 반복문을 멈춰야 한다. 이때 대입 연산자 i += 1 를 적절하게 사용해야 한다.

 

# 1부터 10까지의 총합
i = 1
sum = 0

while i <= 10:
  sum += i
  # 0   += 1 -> 1
  # 1   += 2 -> 3
  # 3   += 3 -> 6
  # 6   += 4 -> 10
  # 10  += 5 -> 15
  # 15  += 6 -> 21
  # 21  += 7 -> 28
  # 28  += 8 -> 36
  # 36  += 9 -> 45
  # 45  += 10 -> 55
  # i가 11, sum이 55
  i += 1
print(f'1부터 10까지의 합: {sum}')

while의 동작 설명이다. 이해가 되길 바란다.


무한루프

i = 1

while i <= 5:
	print('Hello Python') # 무한루프

위 코드를 실행하면 Hello Python을 무한하게 출력한다.

조건이 거짓이 되어야 반복을 멈추는데 위 코드에선 i = 1로 변하지 않는다.

i를 1씩 증가시켜 주거나 5보다 커지는 순간을 만들면 무한루프는 멈출 것이다.

 

while True:
	print('Hello python')

위 코드와 같은 결과를 가진다. 무한루프는 에러가 아니다. 적절하게 아니 어쩌면 프로그램을 만드는데 꼭 필요한 기법이라고 할 수 있다.


구구단

# 원하는 구구단을 입력받아 해당 단의 구구단을 출력
dan = int(input('원하는 단을 입력하세요 '))
print(f'{dan} 단')
i = 1
while i <= 9:
  print(f'{dan} * {i} = {dan * i}')
  i += 1

반복문을 배운다면 구구단을 피할 수 없다.

반복문을 공부할 땐 인내가 필요하다. 한 번의 반복마다 코드가 어떻게 흐르는지 꼼꼼하게 생각해보면 금방 익숙해질 것이다.


for

for 요소 in 시퀀스:
  # 요소에 대한 작업 수행

for는 while과 다르게 시퀀스와 함께 사용한다. 시퀀스란 리스트, 튜플, 문자열 등을 말한다.

for는 보통 지정된 범위가 있거나 반복할 요소들이 정해져 있는 경우 사용한다. 

 

list와 for

list1 = [10, 20, 30, 40]
for li in list1:
  print(li)

list를 for와 함께 사용할 수 있다.

l1에는 list1의 0번 인덱스부터 마지막 인덱스까지 순서대로 반복하며 저장된다. li 출력을 통해 어떤 반복이 되는지 알 수 있다.


range() 함수

range([start], stop, [step])
# []는 생략가능

range() 함수는 순차적인 정수 시퀀스를 생성하는 데 사용되는 파이썬 내장 함수이다. 주로 for문과 함께 사용되며, 일정한 범위 내에서 반복 작업을 수행할 때 사용된다. range() 함수의 결과로 생성되는 순차적인 정수 시퀀스는 실제로 메모리에 저장되지 않고 필요할 때마다 생성되므로, 큰 범위의 반복문에도 효율적으로 사용할 수 있다.

range()

num = range(0, 10, 1)
print(num)

range() 함수의 반환값은 range 객체이다. 실제로 정수 시퀀스를 저장하는 것이 아니고 범위 정보만 가지고 있는다. 이 정수 범위에 대한 정보를 가진 객체를 통해 여러 결과를 만들 수 있다.

for i in num: # 메모리에 남는다.
  print(i, end=' ')
  
for i in range(0, 10, 1): # 메모리에 남지 않는다.
  print(i, end=' ')

range() 함수를 직접 사용하지 않고 변수를 거쳐 사용하게 되면 메모리에 남게 된다.


enumerate

enumerate() 함수는 반복문을 사용할 때 인덱스와 값을 함께 가져오기 위해 사용되는 내장 함수이다.

주로 for 문과 함께 사용된다.

(인덱스, 값)의 튜플을 반환하는 이터레이터(Iterator)를 생성한다.

enumerate()

li1 = [10, 20, 30, 40, 50]

for e in enumerate(li1):
  print(e)


언패킹

li1 = [10, 20, 30, 40, 50]

for i, v in enumerate(li1):
  print(f'index: {i}, value: {v}')

인덱스와 값을 튜플 형태로 받을수도 있고 언패킹을 통해 변수에 각각 저장할 수 있다.


zip() 함수

zip() 함수는 여러 개의 반복 가능한 객체를 병렬적으로 묶어주는 내장 함수이다.

각 객체로부터 요소를 순서대로 하나씩 가져와 튜플로 묶어주는 이터레이터를 반환한다.

여러 개의 리스트나 튜플을 병렬적으로 처리할 때 사용한다.

 

zip()
li1 = [10, 20, 30]
li2 = ['apple', 'banana', 'orange']

for i in range(len(li1)): # 인덱스를 얻을 수 있다.
  print(li1[i], li2[i]) # 크기가 다르면 인덱스 에러가 날 수 있다.

# 좋은 코드가 아니다.
# zip() 함수를 사용해보자.

두 컬렉션 객체를 하나의 객체로 묶는 방법은 여러가지이다. 위는 객체화가 아닌 병렬로 출력하는 코드이다.

len() 함수를 사용하여 인덱스를 얻을 수 있다.

 

li1 = [10, 20, 30, 40]
li2 = ['apple', 'banana', 'orange']
# 크기가 작은 쪽에 맞춰서 동작함.

for l1, l2 in zip(li1, li2):
  print(l1, l2)
  # print((1i, l2)) # 튜플로 묶어줌


for l in zip(li1, li2): # 알아서 튜플로 묶어줌
  print(l)

range() 함수를 통해 직접 크기만큼 반복하는 대신 zip() 함수를 사용하면,

각각의 객체의 같은 인덱스 끼리 순서대로 묶을 수 있다.(튜플로)

위의 두가지는 튜플을 언패킹 하는 것과 튜플 그대로 출력하는 경우이다.

 

각각의 리스트 크기가 다르다면 가장 크기가 작은 쪽에 맞춰서 동작한다. 초과되는 인덱스 값들은 버려진다.


문자열 & zip()

for n, A, a in zip('12345', 'ABCDE', 'abcde'):
  print((n, A, a))

문자열도 가능하다. 


중첩 반복문

말 그대로 두 개 이상의 반복문이 중첩된 경우이다. 

for 외부_변수 in 외부_시퀀스:
    for 내부_변수 in 내부_시퀀스:
        # 내부 반복문 코드
    # 외부 반복문 코드

파이썬은 들여쓰기를 기준으로 블럭처리가 되기 때문에 주의한다.

 

중첩 for

for i in range(1, 4):
  print(f'i: {i}')
  for j in range(1, 4):
    print(f'    j: {j}')

결과와 같이 다차원의 데이터를 처리하거나 복잡한 작업을 수행하는 데에 사용된다.


5 x 5 정렬된 닭다리

for i in range(5):
  for j in range(5):
    print('🍗', end=' ')
  print()

 

* 중첩 반복문을 공부할 때 꼭 한번쯤은 풀어보는 예제가 있다.

기존 예제는 '*' 일명 별찍기를 하지만 닭다리로 구현해보았다.


닭다리찍기

for i in range(5):
  for j in range(5 - i):
    print('🍗', end=' ')
  print()

for i in range(6):
  for j in range(i):
    print('🍗', end=' ')
  print()


응용예제

구구단 for

for i in range(1, 10):
  for j in range(2, 10):
    print(f'{j} * {i} = {i*j}', end='\t')
  print()


구구단 while

i = 1
while i <= 9:
  j = 2
  while j <= 9:
    print(f'{j} * {i} = {j * i}', end='\t')
    j += 1
  i += 1
  print()


구구단 다른 형태

# for 문
for i in range(2, 10):
  print(f'{i} 단')

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

  print()

...

 

'파이썬 > 기본' 카테고리의 다른 글

[파이썬] 랜덤 모듈  (0) 2023.09.11
[파이썬] 컬렉션과 반복  (0) 2023.09.11
[파이썬][응용]음악 추천 프로그램 - if 제어문 공부  (1) 2023.09.06
[파이썬] 조건문  (0) 2023.09.06
[파이썬] 연산자  (0) 2023.09.05

댓글