예를 들어 구구단을 출력하는 경우 반복문 안에서 반복문을 사용하여 실행하면 원하는 결과를 얻을 수 있습니다. 반복문 안에서 반복문을 사용하는 경우를 살펴보도록 하겠습니다.
반복문 안에서 반복문 사용하기
반복문 안에서도 반복문을 사용할 수 있습니다.
# i과 j가 어떻게 변하는지 디버거로 추적해봅시다.
for j in range(3): #outer loop
print(f"Line {j} :", end=" ")
for i in range(5): # inner loop
print(i, end=" ")
print()
Line 0 : 0 1 2 3 4
Line 1 : 0 1 2 3 4
Line 2 : 0 1 2 3 4
[예시] 주어진 중첩 리스트의 모든 정수의 합을 구해봅시다.
my_list = [[1, 2, 3], [4, 5], [6]]
list_sum = 0
for j in my_list:
for i in j:
list_sum += i
print(f"중첩리스트의 모든 정수의 합은: {list_sum} 입니다.")
중첩리스트의 모든 정수의 합은: 21 입니다.
my_list = [{1, 2, 3}, (4, 5, 6)]
s_1 = 0
s_2 = 0
for j in my_list:
if j == my_list[0]:
for i in j:
s_1 += i
print(j, s_1)
else :
for i in j:
s_2 += i
print(j, s_2)
{1, 2, 3} 6
(4, 5, 6) 15
# 뒤에 리스트가 아닌 원소가 추가가 됐다면?
# 오류 발생하는 경우
my_list = [[1, 2, 3], [4, 5], [6], 7]
list_sum = 0
for j in my_list:
for i in j:
list_sum += i
print(f"중첩리스트의 모든 정수의 합은: {list_sum} 입니다.")
# 'int' object is not iterable은 정수 객체는 반복문에서 사용 불가능한 객체라는 뜻입니다.
# 따라서 어떤 조치가 필요할까?
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [4], in <cell line: 5>()
4 list_sum = 0
5 for j in my_list:
----> 6 for i in j:
7 list_sum += i
8 print(f"중첩리스트의 모든 정수의 합은: {list_sum} 입니다.")
TypeError: 'int' object is not iterable
# 뒤에 리스트가 아닌 원소가 추가가 됐다면?
# isinstance 아이템이 리스트인지 확인해서 해결
my_list = [[1, 2, 3], [4, 5], [6], 7]
my_sum = 0
for sub_list in my_list:
if isinstance(sub_list, Iterable) == True:
for i in sub_list:
my_sum += i
else:
my_sum += sub_list
print(f"중첩리스트의 모든 정수의 합은: {my_sum} 입니다.")
my_list = [[1, 2, 3], [4, 5], [6], 7]
my_sum = 0
for sub_list in my_list:
if isinstance(sub_list, Iterable):
for i in sub_list:
my_sum += i
else:
my_sum += sub_list
print(f"중첩리스트의 모든 정수의 합은: {my_sum} 입니다.")
열거(Enumerate) 함수 사용법
for
문에서 아이템과 아이템의 인덱스가 함께 필요한 경우에 사용할 수 있습니다.
# 직접 세는 방법
my_list = ["사과", "바나나", "포도"]
index = 0
for i in my_list:
print(f"인덱스{index}: 과일은 {i}")
index += 1
# range() 사용
my_list = ["사과", "바나나", "포도"]
for index in range(len(my_list)):
print(f"인덱스{index}: 과일은 {my_list[index]}")
# enumerate 사용 인텍스와 아이템을 동시에 받아올 수 있다.
my_list = ["사과", "바나나", "포도"]
for index, items in enumerate(my_list):
print(f"인덱스{index}: 과일은 {items}")
my_list = [1, 2, 3]
for i, j in enumerate(my_list):
my_list[i] = j * 2
my_list
my_list = [1, 2, 3]
for i, _ in enumerate(my_list):
my_list[i] *= 2
my_list
[예시] 다음 리스트에서 정수 값들을 두 배로 만들어보세요. 루프 변수 대신 리스트의 인덱싱을 사용해야 값을 바꿀 수 있습니다.
my_list = [1, 2, 3]
for i in range(len(my_list)):
my_list[i] *= 2
my_list
반복문 while
while
문의 일반적인 형태
while
문의 일반적인 형태를 살펴보겠습니다.
while 조건:
조건이 True일 때 실행될 명령문들
else:
반복이 (break없이) 끝났을 때 실행될 명령문들
while
과 :
사이에 반복을 계속할 조건
이 명시되어야한다는 점에서 for
문과 다릅니다. 조건
자리에는 True
나 False
로 계산될 수 있는 표현식(expression)이 들어올 수 있으며 True
라면 반복을 계속하고 False
라면 종료합니다. 조건
이 항상 True
라면 사용자가 강제로 종료할 때까지 무한히 반복됩니다.
- 무한 루프
while True:
print("나는 멈추지 않는 무한루프")
for
문에서 사용하는 이터러블(iterable) 객체들은 내부적으로 종료 조건을 가지고 있습니다. 예를 들어서 리스트 객체라면 가지고 있는 아이템 개수만큼 반복을 하면 끝납니다. while
문을 사용할 때는 우리가 구체적으로 조건
을 정확하게 표현해줘야 합니다.
while
문에서 반복 횟수를 조절하는 기본적인 방법은 우리가 직접 횟수를 세는 것입니다.
# 디버거로 추적하면서 확인하면 좀 더 명확히 이해가 됩니다.
repeat = 3
counters = 0 # 카운터를 초기화합니다.
while repeat > counters :
print(str(counters) + "번째입니다.")
counters += 1
else:
print(str(counters) + "회만에 반복을 종료하였습니다.")
카운터를 감소시켜나가면서 셀 수도 있습니다.
# 디버거로 추적하면서 해 보시면 좀 더 명확히 이해가 됩니다.
repeat = 3
counters = repeat # 카운터를 초기화합니다.
while counters > 0 :
print(str(repeat - counters) + "번째입니다.")
counters -= 1
else:
print(str(repeat - counters) + "회만에 반복을 종료하였습니다.")
while문으로 리스트의 합 구하기
주어진 정수 리스트의 합을 구해봅시다.
my_list = [3, 6, 1, 2, 6, 9, 5]
my_sum = 0
counters = 0
while counters < len(my_list) :
my_sum += my_list[counters]
counters += 1
else:
print(f"합은{my_sum} 입니다.")
my_list = [3, 6, 1, 2, 6, 9, 5]
my_sum = 0
counter = 0
while counter < len(my_list) :
if my_list[counter] % 2 == 1:
my_sum += my_list[counter]
counter += 1
else:
counter += 1
print(f"홀수의 합은 {my_sum}입니다.")
홀수들만의 곱을 구해봅시다.
my_list = [3, 6, 1, 2, 6, 9, 5]
my_prod = 1
counter = 0
while counter < len(my_list):
if my_list[counter] % 2 == 1:
my_prod *= my_list[counter]
counter += 1
else:
counter += 1
print(f"곱은 {my_prod} 입니다.")
사실 횟수를 세면서 종료 조건을 결정하는 경우에는 for
문과 range
를 사용하는 것이 더 편합니다. 그러나 while
문이 더 편한 경우도 많이 있습니다. 예를 들면 '시간'이 얼마나 지났는 지를 조건으로 사용하거나 어떤 값이 나올지 미리 알 수 없는 난수를 사용하는 경우 등이 있는데 나중에 실습 문제로 풀어보도록 하겠습니다.
기타 흐름제어 도구들
break
문 사용법
반복 루프 안에서 break
문을 만나면 즉시 반복을 종료합니다. 반복 루프를 깨고 나오는 것입니다. break
다음에는 :
이 필요 없습니다.
for i in range(1000):
print(i)
break
print("종료하였습니다.")
# break는 자신을 감싸고 있는 블럭안에서만 유효합니다.
for j in range(0, 3):
print("Outer", j)
for i in range(10, 1000):
print("Inner:", i)
break
break
는 대부분 if
와 함께 사용되는데 if
문을 깨고 나오는 것이 아니라 그 if
문을 가지고 있는 반복문을 깨고 나오는 것입니다.
for i in range(1000):
print(i)
if i == 3:
break
print("종료하였습니다.")
while
문에서는 조건을 True로 두고 루프를 깨고 나오는 탈출 조건을 별도로 설정해두는 용법도 많이 사용합니다.
while True:
user_input = input()
if user_input == "종료":
break
print(user_input)
break
문은 for
문과도 함께 사용될 수 있습니다. 그러나 for
문에서는 가급적 루프를 억지로 깨고 나올 일이 없도록 사전에 범위를 잘 설정해주는 것이 더 좋습니다. 아주 단순한 예를 들자면 5까지만 출력한다고 하면 6에서 break
로 깨고 나오기 보다는 미리 범위를 5까지 잡아주는 게 좋겠지요.
for i in range(1000):
if i > 5 :
break
print(i)
# 범위를 미리 잘 설정해 주는 것이 break를 쓰는 것보다는 더 좋습니다.
for i in range(6):
print(i)
반복 루프가 break
로 종료될 경우에는 else:
가 무시됩니다. 예를 들어서 리스트 안에서 3을 만나면 종료되는 프로그램을 생각해보겠습니다.
my_list = [0, 5, 2, 8, 3, 9, 11, 5, 2]
for i in my_list :
print(i, end=" ")
if i == 3 :
print(" 앗!, 3을 찾았습니다!")
break
else:
print("3을 찾지 못했습니다.")
# 리스트 안에 3이 없어서 루프가 break를 만나지 못하고 자연스럽게 종료되는 경우
my_list = [0, 5, 2, 8, 9, 11, 5, 2]
for i in my_list :
print(i, end=" ")
if i == 3 :
print("! 3을 찾았습니다!")
break
else:
print("3을 찾지 못했습니다.")
continue
문 사용법
continue
를 만나면 다시 루프의 시작으로 돌아갑니다. for
와 while
모두 사용할 수 있습니다.
# 디버그를 실행하여 확인해 보세요.
for i in range(3):
print("첫 번째 줄입니다.")
continue
print("실행이 되나요?")
예를 들어서 리스트 안에서 "딸기"를 만날 때마다 "딸기가 좋아~"를 출력해보겠습니다. continue
도 break
와 마찬가지로 대부분 if
와 함께 사용됩니다.
my_list = ["사과", "바나나", "딸기", "수박", "오렌지", "딸기"]
for i in my_list:
if i != "딸기":
continue
print("딸기가 좋아")
my_list = ["사과", "바나나", "딸기", "수박", "오렌지", "딸기"]
# 당연히 이렇게 구현하는게 더 간결하지요.
for i in my_list:
if i == "딸기":
print("딸기가 좋아")
pass
사용법
pass
는 말 그대로 아무것도 안하고 그냥 지나가는 것입니다. 주로 나중에 뭔가 구현할 계획이 있거나 주석을 달아야 할 필요가 있을 때 사용합니다. 반복문이나 조건문 외에도 함수나 클래스 등 어디든 사용 가능합니다.
for i in range(10):
if i % 2 == 0:
print(f"짝수: {i}")
else: # pass가 없다면 else도 삭제해야 함.
pass # 홀수인 경우는 아무것도 출력하지 말 것
바다코끼리 연산자 (Walrus Operator)
바다코끼리 연산자는 파이썬 3.8에 새로 추가되었습니다. 변수에 값을 대입함과 동시에 표현식으로도 사용될 수가 있다는 특징을 가지고 있습니다. 그래서 대입 표현식(assignment expression) 연산자라고 부릅니다. :=
연산자가 바다코끼리(Walrus)를 닮았다고 합니다.
# 대입만 하고 표현식으로 사용할 수가 없습니다.
# 즉, 이 문장 자체로는 '값'이 없습니다.
word = "헬로우"
# 대입과 동시에 그 자체를 '값'으로 사용할 수 있습니다.
(word := "Hello")
먼저 바다코끼리 연산자를 사용하지 않는 경우부터 생각해봅시다.
while True:
word = input()
if word == "종료":
break
print(word)
이때 바다코끼리 연산자를 사용하면 훨씬 간결하게 만들 수 있습니다. for
문의 대상
(target)과 비슷하게 입력받은 단어를 변수에 담을 수 있기 때문입니다. 이때 :=
연산자의 우선순위가 낮기 때문에 괄호가 필요합니다.
while (word := input()) != "종료":
print(word)
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
'수학과 코딩' 카테고리의 다른 글
파이썬(python) 반복문(for, whole), eval, isnumeric, if 등 사용에 관한 문제 풀이 (0) | 2022.08.01 |
---|---|
파이썬(python) 소수(prime number)판별, BMI계산 등 여러 기본 문제 (0) | 2022.07.31 |
파이썬 python 프로그램 흐름 제어(flow control) 반복문(for) (0) | 2022.07.29 |
파이썬(python) 조건문(if.elif, else) 사용 방법 정리 (0) | 2022.07.29 |
파이썬(python) 표현식과 문장의 뜻 불리언(boolean) 자료형 (0) | 2022.07.28 |
댓글