파이썬 반복문(for)

윤태영·2023년 11월 14일
0
post-thumbnail

이미지 출처: https://wikidocs.net/192339

오늘은 반복문인 for문을 알아보겠습니다. 저번에 배운 조건문과 결합해서 사용하면 간단한 흐름을 제어하는 프로그래밍을 할 수 있다.

For 흐름제어 실습

  • 반복문 중요성
  • 기본 For사용
  • For문 패턴 실습
  • For-Else 구문

기본 형식 📕

for문은 반목문을 사용하여 collection(list, tuple, string, dictionary)의 요소를 하나씩 순회하거나 숫자 범위를 반복하는 데 사용됩니다.

for 변수 in <collection>:
	<loop body>
  • range - 숫자 범위를 생성하는 내장 함수입니다.
    start - 범위 시작 값을 나타낸다.
    stop - 범위의 끝 값을 나타내며 이 값은 범위에 포함되지 않습니다.
    step - 각 숫자 사이의 각격을 나타내며 기본값은 1이다.
    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     

1 ~ 1000 합 📕

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

1 ~ 1000까지의 4의 배수의 합 📕

이것도 역시 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

Iterables(반복할 수 잇는 객체) 자료형 반복 📕

문자열, 리스트, 튜플, 집합, 사전(딕셔너리) 같이 반복 가능한 객체를 for문에서 사용하여 요소를 하나씩 순회할 수 있습니다.

  • iterable 리턴 함수 : range, reversed, enumerate, filter, map, zip (모두 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 리스트 안에있는 요소값들을 한개씩 순회하여 각 요소를 출력한다.
  • for 루프내에서 현재 숫자를 n이라는 변수에 할당하고, 각 숫자를 출력한다.
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

if문 조건문과 for문 함께 사용 📕

  • isupper : 문자열이 모두 대문자인 경우 True를 반환하고, 그렇지 않으면 False를 반환한다.
  • upper : 문자열을 알파벳을 모두 대문자로 출력해주는 함수
  1. name변수에 'FineAppLE'할당
  2. for 루프를 사용하여 문자열 "FineAppLE"의 각 문자를 반복
  3. if n.isupper(): 조건문을 사용하여 현재 문자 n이 대문자인지 확인
    • 대문자인 경우 해당문자를 그대로 출력
    • 소문자인 경우 else로 넘어가 n.upper()를 사용하여 해당문자열을 대문자로 전환한 후 출력합니다.
# 모두 대문자로 출력해보자
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 📕

break는 파이썬에서 사용되는 제어문의 하나로, 반복문 (예: for 루프 또는 while 루프)을 조기에 종료하는데 사용됩니다. break문을 만나면 가장 가까운 반복문을 즉시 종료하고 루프 밖으로 제어를 이동시킵니다. 특정 조건이 충족되었을때 반복문을 종료하려는 경우에 사용됩니다.

  • 문제 : 1000명의 학생중에 성적이 100점인 학생들만 차자.

만약 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

conitnue 📕

  • continue는 어떤 조건 안에서 continue를 만나면 다시 조건을 검사하는 부분으로 이동합니다. 예를 들어 100점인 사람만 출력하고 아닌 사람은 출력하고 싶지 않은 경우에 이런 경우에 continue가 사용될 수 있다.
  • 특정 많은 데이터중에 불필요하게 출력되거나 계산되지 않아야 될 값들이 체크리스트에 있을때 continue를 써서 패스 가능하다.
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'>

for - else - break 📕

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단까지를 출력하며, 각 단의 곱셈 결과를 나란히 출력합니다.

  1. 바깥쪽 for 루프 (for i in range(2, 10):)는 2부터 9까지의 숫자를 반복합니다. 이 변수 i는 구구단의 단 수를 나타냅니다.

  2. 안쪽 for 루프 (for j in range(1, 10):)는 1부터 9까지의 숫자를 반복합니다. 이 변수 j는 각 단에서의 곱하는 수를 나타냅니다.

  3. print('{:4d}'.format(i * j), end='')는 현재 i와 j 값을 곱한 결과를 4자리로 오른쪽 정렬하여 출력하고, end=''를 사용하여 줄 바꿈을 하지 않고 같은 줄에 출력합니다.

  4. 안쪽 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문을 배워보겠습니다.😉

출처 : 인프런

profile
ice blue

0개의 댓글