IT

[코딩온] 신재생에너지 IoT 개발자 입문_ 파이썬8

혈중당부족 2025. 12. 5. 17:25

 

10. for 

 

이터너블(순회 가능한) 요소를 하나씩 꺼내서 실행 블록에 전달하는 반복문

동일한 작업의 반복 실행시켜 가독성과 유지보수를 올리고 자동화, 대량처리에 사용된다. 

이렇게 써먹기 위함이다.

 

리스트로 생성, 반복
fruits = ['apple','banana','cherry']
for fruit in fruits: #fruit = 리스트 안에 있는 개체 명칭 의미
    print(f"I like {fruit}")
리스트 요소대로 출력

문자열 반복
my_str = "apple"

for char in my_str:
    print(char)

쪼개서 내준다.

문자열은 문자 하나하나가 반복대상인데, 문자열은 순서있는 시퀸스이니 인덱스 접근, 반복문 순회 둘 다 가능하다.

 

#튜플 반복+ 변수 값 분해
coords = [(1, 2),(10, 15),(-6, 10)]
#언패킹 (X,Y)구조 (구조 분해 가능)
for x,y in coords:
    print(f"x 좌표 {x} y 좌표 {y}")

튜플의 경우 구조 분해를 활용해 동시에 여러 값을 unpack 가능

 

 

#딕셔너리 반복 -key 순회 : dict 파일에서 한번 복습, 이해하기.
person = {
    "name": "kim",
    "age": 15,
    "address": "seoul"
}

# 기본
for key in person:
    print(f"key: {key}, value: {person[key]}")

# value 만 가져오기
for value in person.values():
    print(f"value: {value}")

# items 가져오기
for key, value in person.items():
    print(f"key: {key}, value: {value}")
 

딕셔너리 정보를 입력하고, for문으로 나눠서 지정 가능하다. key만 하면 key로 저장된 것만.

딕셔너리{key}는 자료 인덱스 지정처럼 key가 인덱스 좌표로 인지되어 value 값으로 출력되는 거다.

 

#set 반복
my_set = {1,2,3,4}

for key in my_set:
    print(key)

 

set은 순서 없고, 중복도 없는 자료형이나 반복문이 된다. 단 출력할 때 순서는 예측할 수 없다. 

 

#리스트 값을 두 배로 변환
numbers = [3, 6, 1, 8, 4]

for number in numbers:
    print(number * 2)

#모범 답안
이건, 리스트의 2배 결과물을 새 리스트에 저장한다 문제여서 이런 코드를 작성하는 게 모범이라고 써둔 듯 하다.
numbers = [3, 6, 1, 8, 4]
doubled = [] #새 리스트 생성

for number in numbers:
    doubled.append(number * 2) #새 리스트에 바뀐 변수값을 넣겠다는 뜻
print(doubled) #[6, 12, 2, 16, 8] 출력
 
위에 쓴 코드와, 모범답안 코드도 확연히 다르다...

 

예전에 요소는 하나하나 입력해야 알아듣는다고 했는데 그럴 필요 없다!

 

 

#문자열 길이 구해서 새 리스트 만들기
words = ["apple", "banana", "kiwi", "grape"]

for word in words:
    length = len(word) #새로운 리스트를 생성해서 저건 word(변수)의 길이값이다 함.
    print(length)

문자열의 개수를 각각 세주고 있다.

# 좌표 튜플에서 x, y 좌표나누기

#이 문제 읽고 만들었던 코드는 이랬고.
coordinates = [(1, 2), (3, 4), (5, 6), (7, 8)]
for x_values,y_values in coordinates:
    print(f"x 좌표 {x_values} y 좌표 {y_values}")


#모범답안은 달랐는데 해당 리스트 만들어서 추가해 출력으로 봐야 하나보다.
coordinates = [(1, 2), (3, 4), (5, 6), (7, 8)]
x_values = []
y_values = []
for x, y in coordinates:
    x_values.append(x)
    y_values.append(y)
print(x_values, y_values)
리스트에 저장된 것만 출력하면 되니 요소만 나왔다.

 

for 문과 range()
range 함수 : 지정된 범위의 정수 시퀀스 생성

기본 문법
range(start,end,step)
start: 생략 가능, 기본 0 / end: end -1까지 생성 / step: 생략 가능 기본 값 1

 

for i in range(1,5):
    print(i)

#동일한 맥락이다.
for i in [1,2,3,4]:
    print(i)
 
둘 다 똑같이 작동한다.
#start 생략
for i in range(11):
    print(i)
 
0-10까지 출력
#간격(step) 지정
for i in range(0,11,2):
    print(i)
 
0 2 4 6 8... 출력
 
for i in range(11,0,-2):
    print(i)
 
11 9 7 ... 출력. 음수로 지정하면 역순으로 출력한다. 
 
 
이제 이를 활용한 실습 코드.
실습 1 입력받은 수의 합 구하기

num = int(input("수 입력: ")) #먼저 사용자가 입력할 값 구한다.
num_total = 0
for n in range(num + 1): 
    num_total += n
print(num_total)

1+2+3+4+5 = 15

for i in range(11): 에서 10까지만 출력되는 것처럼 for n in range(6)으로 계산해야 5까지 반복한다.
 

 

#구구단 만들기

이건 전체 구구단 만드는 것 (a와 b 범위 지정 곱하기)
for a in range(0,10):
    for b in range (1,10):
        print(a, '*' , b, '=', a*b)
 

반복문 만들 때 연습하기 좋은 건 구구단인 모양이다. 반복문 중첩시켜서 만들었는데.

 

a = int(input("숫자를 입력하세요: ")) #입력 값 만들기
for b in range (1,10):
    print(f"{a}, '*' , {b}, '=', {a*b}")
 

어차피 b는 1-9까지 반복해야 하니까 a값만 지정해주고 b만 반복문 돌리면 원하는 구구단 숫자가 나온다.

산술식도 금방 적용되니까... 당시에 이 생각 못한 걸 보면 많이 버벅인 모양이다.

 

3의 배수의 합 구하기
total = 0 #현재 총합
for n in range(1,101,3): #1부터 100까지의 3의 배수를 반복
    total += n #n에서 3배수로 할당한 값들을 더했다.
print(f"합 {total}")


#이것도 똑같이 작동된다.
for n in range(1,101):
    if n % 3 ==0: #3을 나눴을 때 0이 된 값만,조건문
        total += n

 

#짝수이면서 5의 배수인 수 출력
 
C = int(input("숫자를 입력하세요: "))
for c in range(0,C+1,5):
    print(c)

#실습 후 보여준 답안
for c in range(0,C+1):
    if c % 2 == 0 and n % 5 == 0: #짝수이면서 5배수란 조건을 빼먹었다...
        print(c)

 

루프 제어문
특정 조건 하에서 작동하도록 구현
 
#break : 반복문 즉시 중단
for i in range(10):
    if i == 5:
        break
    print(i)
print("반복 종료1")
stop-1까지 출력이니 4까지만 나온다.

#continue : 현재 반복을 넘어감, 다음 반복으로 실행한다.
for i in range(5):
    if i == 2:
        print("건너뜀")
        continue

    print(i)
print("반복 종료2")
if가 2되니 건너뜀을 출력하고, 컨티뉴가 다시 반복시켰다.

#pass
for i in range(10):
    pass
일단 할당되지 않았으니 넘어간단 명령어다.

for - else 구문
반복이 정상적으로 모두 수행된 경우 else 블록을 실행한다.
 
for i in range(5): #5면 4까지만 출력한단 뜻
    if i == 2:
        break
    print(i)
else:
    print("반복 종료3")
 
여기서 이렇게 짜면 2에서 브레이크 걸려 멈춘 거기에 else까지 가지 않는다.

 

 

중첩 for 문
하나의 for 문 안에 다른 for 문이 들어있는 구조

#이중 for문
for i in range(5):
    for j in range(5):
        print("i,j", i , j)
    print()

안쪽에서 돌리고, 바깥이 횟수 올라가는 식으로 전개된다.

 

 

 

#실습
구구단만들기 for문 중첩 활용해서.

for a in range(2,10):
    print(f"{a}단")
    for b in range (1,10):
        print(a, 'x' , b, '=', a*b)
        #또는 print(f"{a} x {b} = {a*b}")
 

# 중첩 for 문 별 찍기
a = int(input("몇 줄?: "))

#for n in range(0,a):
#    print("*" * (n+1)) #별표를 n+1값 만큼 곱한 걸 출력한다.

for i in range(1,a+1):
    for j in range(i):
        print("*", end ="")

#중앙 정렬
a = int(input("몇 줄?: "))

for n in range(a):
    print(" " * ((a - 1) - n), end = "") #공백의 수를 ((10-1)-1(시작 수)) 만큼 만든다.
    print('*' * (2 * n + 1)) #*을 (a의 시작수+1의 2배) 만큼 곱한다


#역삼각형은?
a = int(input("몇 줄?: "))

for n in range(a):
    print(" " * (a - (n+1)), end="")
    print('*' * (n+1))
#a값을 지정하고, a=10 - (n+1)=a의 시작점+1 만큼의 여백을 만든다.
#공백을 줄바꿈으로 정리


for i in range(1,a+1):
    #공백 출력
    for j in range(a-i):
        print(" ", end="")
    for j in range(i):
        print("*",end="")
    print()
 
 
#받은 답안 비교용 원본
# 오른쪽 정렬
n = int(input("몇 줄?:"))
for i in range(1, n+1):
  for j in range(n - i):
    print(" ", end="")
  for j in range(i):
    print("*", end="")
  print()
 
 
 
리스트 컴프리헨션
for 문을 리스트에 한 줄로 축약하여 새 리스트를 생성하는 문법
[표현식(리스트의 원소) for 변수 in 반복대상 if 조건문] <= if 조건문 없어도 괜찮다.
표현식 : 값을 유도하는 식(표현)

 

for문 이용
squares = []
for x in range(1,6):
    squares.append(x ** 2)
print(squares)

 

출력 값

리스트컴프리헨션 사용 시

squares2 = [x ** 2 for x in range(1,6)]
print(squares2)

리스트 명 = 컴프리헨션 문법 적용. 구조다. 

 

 

아직 미숙한 내게 컴프리헨션은 쓰일 일이 적을 듯 하다. 

 

 

# 실습
1부터1 0까지의숫자에 대해, 각 수의 제곱값을 요소로 갖는 리스트를 리스트 컴프리헨션
cphs = [n ** 2 for n in range (1,11)]
print("답",cphs)

n을 **(제곱)할때 n의 값 1-10까지 반복해서 출력 느낌이다. 산술 기호를 정확히 기억하고 있어야 헷갈리지 않는 문제다.

 

3의 배수만 출력하는 컴프리헨션은
 
cphs2 = [x for x in range(0,51) if x % 3 == 0]
#앞의 표현식은 변수값(x)만 두고 없어도 딘다.
# x % 3 == 0 < 3으로 나눴을때 0이 된다 = 3의 배수다.
print(cphs2)
 

출력 값

 

문자열 리스트에서 길이가 5이상인 값만 출력하는 컴프리헨션

fruits = ["apple", "fig", "banana", "plum", "cherry", "pear", "orange"]
cphs3 = [f for f in fruits if len(f) >= 5]
#변수 f만 나오게, fruits 중의 f(변수)가 글자수(len) 5보다 같거나 크게란 뜻
print(cphs3)

 

반복 실행할 때 글자수가 5이상인 (if len(f)>=5) 것을 기준으로 f변수만 나오게 해라. 그런 축약인데 헤맸다. 

 

for문은 함수에서 자주 사용되고 여러 조건문을 반복 처리하기 위해 쓰이기도 하니 꽤 눈에 보이는데, 이때는 for 문을 이해했지만 문제 읽고 어캐 써야 할지 모르겠어의 연속이었다. 그래서 질문하고, 코드가 이리 진행된다고 자판 두드렸던 기억이 났다. 이제 반복문을 백업 했으니 이만 마무리 하겠다.