이미지 출처: https://wikidocs.net/192339
오늘은 반복문인 for문을 알아보겠습니다. 저번에 배운 조건문과 결합해서 사용하면 간단한 흐름을 제어하는 프로그래밍을 할 수 있다.
For 흐름제어 실습
for문은 반목문을 사용하여 collection(list, tuple, string, dictionary)의 요소를 하나씩 순회하거나 숫자 범위를 반복하는 데 사용됩니다.
for 변수 in <collection>: <loop body>
range(start, stop, step)
for v1 in range(10): # for문 내부에서 사용할 변수 선언, 0~9 까지 나온다. N-1 print('v1 is :', v1) >>> v1 is : 0 v1 is : 1 v1 is : 2 v1 is : 3 v1 is : 4 v1 is : 5 v1 is : 6 v1 is : 7 v1 is : 8 v1 is : 9
for v2 in range(1, 11): # 1~ 10 print('v2 is :', v2) >>> v2 is : 1 v2 is : 2 v2 is : 3 v2 is : 4 v2 is : 5 v2 is : 6 v2 is : 7 v2 is : 8 v2 is : 9 v2 is : 10
for v3 in range(1, 11, 2): # 1 ~ 11까지 2개씩 띄어서 나온다. 10까지이므로 11은 안나온다. print('v3 is :', v3) >>> v3 is : 1 v3 is : 3 v3 is : 5 v3 is : 7 v3 is : 9
for문을 통해 1부터 1000까지 모두 더한 값을 출력해봅시다.
sum1 = 0 # 먼저 값을 담을 변수하나를 설정해줍니다. for v in range(1, 1001): sum1 += v # sum1 = sum1 + v print('1 ~ 100 sum : ', sum1) >>> 1 ~ 100 sum : 500500
조금 더 쉽게 구하는 방법도 있습니다.
# sum(0 함수를 이용하여 범위 내의 모든 정수를 합산합니다. # for문으로 계산한것과 같은 결과이다. print('1 ~ 1000 sum : ', sum(range(1, 1001))) >>> 1 ~ 1000 sum : 500500
이것도 역시 for문으로 구할 수 있습니다. sum()함수를 이용하거나 for문을 이용하면 되겠죠.
# 4부터 1000까지 4의 간격으로 범위를 생성하고, sum함수로 이 범위 내의 숫자를 모두 더한다. print(' 1 ~ 1000 4의 배수의 합: ', sum(range(4, 1001, 4))) >>> 1 ~ 1000 4의 배수의 합: 125500
sum1 = 0 for v in range(4, 1001, 4): sum1 += v print(sum1) >>> 125500
문자열, 리스트, 튜플, 집합, 사전(딕셔너리) 같이 반복 가능한 객체를 for문에서 사용하여 요소를 하나씩 순회할 수 있습니다.
예1
names = ['Kim', 'Park', 'Cho', 'Lee', 'Choi', 'Voo'] # 리스트 가능 확인 for n in names: print('You are: ', n) >>> You are: Kim You are: Park You are: Cho You are: Lee You are: Choi You are: Voo
예2
lotto_numbers = [11, 19, 21, 28, 36, 37] for n in lotto_numbers: print('Current number : ', n) >>> Current number : 11 Current number : 19 Current number : 21 Current number : 28 Current number : 36 Current number : 37
예3
문자열도 시퀀스이기에 반복 가능!
word = 'Beautiful' for s in word: print('word : ', s) >>> word : B word : e word : a word : u word : t word : i word : f word : u word : l
예4
딕셔너리 역시 반복 가능합니다.
my_info = { 'name' :'Lee', 'Age' : 13, 'City': 'Seoul' } for key in my_info: print('key : ', key) >>> key : name key : Age key : City
위에서 딕셔너리를 for문으로 출력할때는 딕셔너리의 키값이 나왔습니다. 값을 가져오기위해서는 어떻게 해야할까요?
my_info = { 'name' :'Lee', 'Age' : 13, 'City': 'Seoul' } # key대신 my_info[key]를 하면 values를 가져온다. my_info[key],my_info.get(key) # 아래 key에는 사저의 key값들이 있다. my_info로 인덱싱해주면 값이 나온다. for key in my_info: print('values : ', my_info[key]) >>> values : Lee values : 13 values : Seoul
# get()으로도 values 값을 가져온다. for key in my_info: print('values : ', my_info.get(key)) >>> values : Lee values : 13 values : Seoul
# values()로도 값을 가져올 수 있습니다. for v in my_info.values(): print('value : ', v) print() >>> value : Lee value : 13 value : Seoul
# 모두 대문자로 출력해보자 name = 'FineAppLE' for n in name: if n.isupper(): print(n) else: print(n.upper()) >>> F I N E A P P L E
break는 파이썬에서 사용되는 제어문의 하나로, 반복문 (예: for 루프 또는 while 루프)을 조기에 종료하는데 사용됩니다. break문을 만나면 가장 가까운 반복문을 즉시 종료하고 루프 밖으로 제어를 이동시킵니다. 특정 조건이 충족되었을때 반복문을 종료하려는 경우에 사용됩니다.
만약 100점인 학생이 1명이고 그학생이 55번째이면 그뒤에 사람은 검색할 필요가 없습니다. 이때 불필요하게 반복하는것을 줄여주기 위해 break로 for문 탈출, 즉 break문을 만나면 뒤에부분은 실행되지 않습니다.
예를 들어 숫자 34를 찾는다고 가정하고 찾을 경우 break로 탈출하는 구문을 만들어봅시다.
34를 찾자
# for문은 계속 순회하며 그안에서 if는 34를 찾을때까지 출력한다. numbers = [14, 3, 4, 7, 10, 24, 17, 2, 33, 15, 34, 36, 38] for num in numbers: if num == 34: print('Found : 34!', num) break # 34이후에는 실행되지 않고 for문을 빠져나간다. 반복의 흐름을 제어한다. else: print('NOT found : ', num) >>> NOT found : 14 NOT found : 3 NOT found : 4 NOT found : 7 NOT found : 10 NOT found : 24 NOT found : 17 NOT found : 2 NOT found : 33 NOT found : 15 Found : 34! 34
lt = ['1', 2, 5, True, 4.3, complex(4)] for v in lt: if type(v) is bool: # 자료형을 대조할 때 is 사용 continue # 위에서 True가 bool인것이 확인되면 밑에것을 skip하고 다시 위에 for문으로 돌아간다. print('current type', v, type(v)) >>> # 자료형인 boolen인 True는 출력되지않고 pass한다. current type 1 <class 'str'> current type 2 <class 'int'> current type 5 <class 'int'> current type 4.3 <class 'float'> current type (4+0j) <class 'complex'>
numbers = [14, 3, 4, 7, 10, 24, 17, 2, 33, 15, 34, 36, 38] for num in numbers: if num == 24: print('Found: 24') break else: # for 문에서 반복하는 모든 원소를 전부 다 반복했을 경우, 즉 break문이없고 모든 원소를 반복했을 경우 마지막으로 else문수행 print('Not Foumd : 24') # break 문이 없으면 실행된다. >>> Found: 24
numbers = [14, 3, 4, 7, 10,17, 2, 33, 15, 34, 36, 38] for num in numbers: if num == 24: print('Found: 24') break else: print('Not Foumd : 24') # 모든원서를 for문에서 반복했찌만 24를 찾을 수 없어 else가 실행되었따. >>> Not Foumd : 24
주어진 코드는 중첩된 for 루프를 사용하여 구구단을 출력하는 코드입니다. 구구단은 2단부터 9단까지를 출력하며, 각 단의 곱셈 결과를 나란히 출력합니다.
바깥쪽 for 루프 (for i in range(2, 10):)는 2부터 9까지의 숫자를 반복합니다. 이 변수 i는 구구단의 단 수를 나타냅니다.
안쪽 for 루프 (for j in range(1, 10):)는 1부터 9까지의 숫자를 반복합니다. 이 변수 j는 각 단에서의 곱하는 수를 나타냅니다.
print('{:4d}'.format(i * j), end='')는 현재 i와 j 값을 곱한 결과를 4자리로 오른쪽 정렬하여 출력하고, end=''를 사용하여 줄 바꿈을 하지 않고 같은 줄에 출력합니다.
안쪽 for 루프가 종료되면, 다음 단으로 넘어가기 위해 바깥쪽 for 루프의 print() 문을 사용하여 빈 줄을 출력합니다.
for i in range(2, 10): for j in range(1, 10): print('{:4d}'. format(i * j), end='') print() >>> 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
reversed() 함수는 문자열을 역순으로 변환한 iterable을 반환합니다.
# id값을 형변환 해주어야 제데로된 값을 알 수 있다. print('Reversed', reversed(name2)) >>> Reversed <reversed object at 0x000001CBBD269240> # reversed가 없어도 형변환 되지만, 반대로 뒤집어서 출력하는 것을 예를 들기위해 쓴것 print('List', list(reversed(name2))) >>> List ['n', 'a', 'm', 'e', 'c', 'A'] print('Tuple', tuple(reversed(name2))) >>> Tuple ('n', 'a', 'm', 'e', 'c', 'A') # 집합은 순서가 없기에 계속실행할때마다 랜덤으로 출력 print('Set', set(reversed(name2))) >>> Set {'m', 'c', 'a', 'e', 'n', 'A'}
다음에는 for문과 같이 반복문이지만 조금 다른 while문을 배워보겠습니다.😉