조건문, 반복문

Suhyeon Lee·2024년 10월 16일
0

목표

  • 조건문을 이해하고 특정 조건에 해당되었을 때 코드가 실행되게 할 수 있다
  • 반복문을 이해하고 코드를 원하는 만큼 반복되게 할 수 있다

파이썬의 근육: 조건문과 반복문

  • 특정 조건에서만 코드가 실행되게 하거나 일정하게 반복하는 코드를 작성할 때 사용되는 문법
  • 파이썬을 훨씬 유동적으로 만듦
  • 개념은 어렵지 않지만 시행착오가 가장 많이 나오는 문법

결과물 미리보기

데이터를 가공할 때 특정 조건에 따라 가공하는 일이 많고 보통 이러한 작업은 반복 수행이 많기 때문에 조건문과 반복문을 함께 쓰는 경우가 많습니다. 뿐만 아니라 대용량의 데이터를 AI 모델에 하나씩 집어 넣을 때, AI 모델을 여러번 반복할습할 때에도 반복문이 사용됩니다.

  • 설명

    • 데이터 분석시 특정 데이터의 조건을 부여
    • 머신러닝의 반복되는 학습
    • 큰 용량의 데이터를 한번에 메모리에 넣지 않고 여러 번 나누어서 넣을 때
  • 목적

    • 데이터 가공, AI모델 사용
  • 기대 효과

    1. 본격적인 데이터 분석을 시도할 수 있는 수준을 갖추게 됨
    2. 왠만한 파이썬 프로그래밍 수행 가능

조건문

  • 특정 조건에서만 실행되게 함

1) 조건문이란?

  • 프로그램의 흐름을 제어하는 중요한 요소 중 하나
  • 특정 조건이 참(True)인 경우에만 특정 코드 블록을 실행하도록 함
  • if, elif(else if의 줄임말), else 키워드를 사용하여 구성
if 조건:
    # 조건이 참일 때 실행될 코드
elif 다른조건:
    # 다른 조건이 참일 때 실행될 코드
else:
    # 위의 조건이 모두 거짓일 때 실행될 코드

예시

  • 변수 x의 값이 양수인지, 음수인지, 아니면 0인지를 판별하여 각각에 맞는 메시지를 출력
x = 10
if x > 0:
	  print("양수입니다.")
elif x < 0:
    print("음수입니다.")
else:
    print("0입니다.")

2) 들여쓰기 및 띄어쓰기의 중요성

  • 조건문에서는 들여쓰기(indent) 및 띄어쓰기가 매우 중요
    • 들여쓰기 안 하면 에러 뜸
    • 칸 수를 정해서 일관성 있게 쓰면 됨
      • Tab도 되고 Space bar도 됨
      • 파이썬 공식에서는 Space bar를 추천한다고 함
  1. 올바른 들여쓰기
x = 10

if x > 5:
    print("x는 5보다 큽니다.")
else:
    print("x는 5보다 작거나 같습니다.")

🡆 if문과 else문이 서로 다른 인덴트 수준에 위치: 각각의 블록이 어디서 시작하고 끝나는지 명확하게 보여줌

  1. 잘못된 들여쓰기
x = 10

if x > 5:
print("x는 5보다 큽니다.")
else:
print("x는 5보다 작거나 같습니다.")

🡆 파이썬은 들여쓰기를 통해 블록을 식별하기 때문에 들여쓰기가 제대로 이루어지지 않으면 오류가 발생함(IndentationError)

  1. 들여쓰기의 중요성 ★
x = 10

if x > 5:
    print("첫 번째 블록 시작")
    if x < 15:
        print("두 번째 블록 시작")
else:
    print("첫 번째 블록 끝")
    
'''
출력:
첫 번째 블록 시작
두 번째 블록 시작
'''
 
# case 1 → 출력: 두 번째 블록 시작
x = 10

if x < 0:
    print("첫 번째 블록 시작")
if x > 5:
    print("두 번째 블록 시작")
else:
    print("첫 번째 블록 끝")
    
# case 2 → 출력: 첫 번째 블록 끝
x = 10

if x < 0:
    print("첫 번째 블록 시작")
	if x > 5:
    	print("두 번째 블록 시작")
else:
    print("첫 번째 블록 끝")
 

🡆 들여쓰기를 사용하여 블록이 서로 어떻게 연결되어 있는지 명확하게 보여 줌: 첫 번째 if문의 내부에 두 번째 if문이 존재
🡆 똑같은 코드인데도 들여쓰기에 따라서 완전 다르게 해석이 될 수 있다!

3) 연산자

  • 비교 연산자: 조건을 판단하기 위해 사용
    • > : 초과
    • < : 미만
    • >= : 이상
    • <= : 이하
    • == : 같음
    • != : 같지 않음
  • 논리 연산자: 조건을 결합할 때 사용
    • and : 모두 참일 때 참
    • or : 하나 이상이 참일 때 참
    • not : 조건을 부정

예시

  • x가 양수이고 짝수인지를 판별하여 그에 맞는 메시지를 출력
x = 10
if x > 0 and x % 2 == 0:
    print("양의 짝수입니다.")

4) 조건문의 다양한 예시

  • 다중 조건식: 논리 연산자를 사용하여 여러 개의 조건식을 결합
x = 10
y = 5

if x > 5 and y < 10:
    print("x는 5보다 크고, y는 10보다 작습니다.")
elif x <= 5 or y > 10:
    print("x는 5보다 작거나 같거나, y는 10보다 큽니다.")
else:
    print("다른 조건")
  • 조건문은 중첩하여 사용 가능 ★
x = 10
if x > 5:
    print("x는 5보다 큽니다.")
    if x < 15:
        print("x는 15보다 작습니다.")
    else:
        print("x는 15보다 큽니다.")
else:
    print("x는 5보다 작거나 같습니다.")
x = 10
if x > 0:
    if x % 2 == 0:
        print("양의 짝수입니다.")
    else:
        print("양의 홀수입니다.")
else:
    print("음수 또는 0입니다.")

5) 조건문의 짧은 표현

  • 한 줄로 간략하게 표현할 수도 있음

예시

  • 조건식이 참일 경우 "양의 짝수"를, 거짓일 경우 "음수 또는 0"을 출력
x = 10
result = "양의 짝수" if x > 0 and x % 2 == 0 else "음수 또는 0"
print(result)

6) 실전 예시: 분석 결과에 따른 의사 결정

  • 데이터 분석을 통해 도출된 결과를 바탕으로 의사 결정을 내릴 때도 조건문을 사용
    e.g. 특정 제품의 판매량이 일정 기준을 넘는다면 추가 생산이 필요하거나, 고객의 특성에 따라 마케팅 전략을 변경해야 할 경우
# 판매량에 따른 생산량 결정 예시
sales = 1000

if sales > 1000:
    print("추가 생산이 필요합니다.")
elif sales <= 1000:
    print("현재 생산량이 적당합니다.")

반복문: for문

  • 코드를 일정 규칙에 따라 반복시키는 문법

1) for문이란?

  • 데이터 분석 및 다른 프로그래밍 작업에서 매우 유용
for 변수 in 반복할_데이터:
    코드_블록
  • for 반복문의 구조
    • 순회할_데이터: 리스트, 튜플, 문자열 등과 같은 반복 가능한(iterable) 데이터 타입
    • 변수: 각 반복(iteration)마다 현재 값을 가지는 변수

2) for문 기본 사용법

리스트 순회

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)
  • "apple", "banana", "cherry"를 순서대로 출력함

문자열 순회

for letter in "hello":
    print(letter)
  • "h", "e", "l", "l", "o"를 순서대로 출력

range() 함수와 함께 사용

for i in range(5):
    print(i)
'''
출력:
0
1
2
3
4
'''
  • 0부터 4까지의 숫자를 출력
    • 0부터(파이썬은 항상 0부터 시작임) 내가 괄호 안에 적은 숫자의 하나 전까지 출력
  • 좀 더 직관적으로 적고 싶다면 아래처럼 적어도 됨
for i in range(4+1):
    print(i)
'''
출력:
0
1
2
3
4
'''

range 함수 더 알아보기

-range(): 연속된 정수를 생성하는 데 사용되는 내장 함수

  • 시작값(start), 끝값(stop), 그리고 증가값(step)을 인자로 받아 사용
    • start
      • 순차적인 정수 시퀀스의 시작 값
      • 생략 가능
      • 기본값은 0
    • stop
      • 순차적인 정수 시퀀스의 끝 값
      • 필수적으로 지정되어야 하는 값
      • 단, 실제로 생성되는 마지막 숫자는 이 값보다 작음
    • step
      • 각 숫자 사이의 간격
      • 생략 가능
      • 기본값은 1
  • 주로 반복문에서 사용되며, 특히 for 루프와 함께 자주 사용
range(stop)
range(start, stop)
range(start, stop, step)
  • 사례 1: range(stop)
# 0부터 시작하여 5 이전까지의 정수 시퀀스 생성
for i in range(5):
    print(i, end=' ')
# 출력: 0 1 2 3 4
  • 사례 2: range(start, stop)
# 2부터 시작하여 7 이전까지의 정수 시퀀스 생성
for i in range(2, 7):
    print(i, end=' ')
# 출력: 2 3 4 5 6
  • 사례 3: range(start, stop, step)
# 1부터 시작하여 10 이전까지 2씩 증가하는 정수 시퀀스 생성
for i in range(1, 10, 2):
    print(i, end=' ')
# 출력: 1 3 5 7 9

🡆 range() 함수의 인자에 따라 생성되는 정수 시퀀스의 범위와 증가량이 달라짐
🡆 이를 활용하여 다양한 반복 작업을 수행 가능

Q. 리스트 슬라이싱 느낌이 비슷해요
A. 차이점 알려드릴게요

  • 리스트에서 슬라이싱: 리스트 안에 있는 값을 내가 가져올 때 사용
  • range: 값을 내가 "생성"할 때
    • 특히, 반복해서 사용할 때
      개념은 비슷해 보일 수 있지만 전혀 다른 사용법임

딕셔너리 순회

person = {"name": "John", "age": 30, "city": "New York"}
for key, value in person.items():
    print(key, " : ", value)
'''
print(f"{key}:{value}")
"f-string 문자열 포멧팅(advanced-formatting)" 
→ 다른 서식 지정 방법보다 읽기 쉽고 간결하며 오류가 거의 발생하지 않는다고 함
'''
  • 딕셔너리의 키와 값 쌍을 출력
    • 포인트는 키와 값(value)를 모두 받아야 한다는 점 → 변수가 두 개

3) 조건문과 함께 사용하기

짝수만 출력하기

for i in range(1, 11):
    if i % 2 == 0:
        print(i)
  • 1부터 10까지의 숫자 중 짝수만 출력

사실 조건문을 안 써도 할 수 있어요

for i in range(2, 11, 2):
	print(i)

1부터 100까지의 숫자 중 3의 배수 출력하기

# 조건문과 반복문을 복합적으로 활용하여 1부터 100까지의 숫자 중 3의 배수 출력
for i in range(1, 101):
    if i % 3 == 0:
        print(i)

이것도 range에 step을 걸어서 할 수 있어요

for i in range(3, 101, 3):
	print(i)

리스트에서 특정 값 걸러내기

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = []
for num in numbers:
    if num % 2 == 0:
        even_numbers.append(num)
print(even_numbers)
  • 주어진 리스트에서 짝수만 골라내어 새로운 리스트에 저장한 후 출력

홀수만 담고 싶다면

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd_numbers = []
for num in numbers:
    if num % 2 == 1:
        even_numbers.append(num)
print(even_numbers)

구구단 출력하기

# 조건문과 반복문을 복합적으로 활용하여 구구단 출력
for i in range(2, 10):
    print(f"{i}단:")
    for j in range(1, 10):
        print(f"{i} x {j} = {i * j}")
        
 # formatting 없는 버전
 for i in range(2, 10):
    print(i, "단")
    for j in range(1, 10):
        print(i, "x", j, "=", i * j)

별표로 직각 삼각형 그리기

# 조건문과 반복문을 복합적으로 활용하여 별표로 직각 삼각형 그리기
size = 10 # 삼각형의 크기를 입력

for i in range(1, size + 1):
    print("*" * i)

문자열에서 특정 문자 제거하기

sentence = "Hello World"
result = ""
for char in sentence:
    if char != "o":
        result += char # result = result + char라는 의미
print(result)
  • 문자열에서 "o"를 제외한 모든 문자를 새로운 문자열에 추가하여 출력

딕셔너리에서 특정 조건에 맞는 항목 출력하기 ★★★

ages = {"John": 30, "Jane": 25, "Doe": 35, "Alice": 20}
for name, age in ages.items():
    if age > 25:
        print(name, " is older than 25")
  • 딕셔너리에서 값이 25보다 큰 경우에 대해 이름과 함께 메시지를 출력

4) 이중 for문 사용

  • 중첩된 데이터 구조를 탐색하거나 이차원 데이터를 처리
  • 데이터를 보다 복잡하게 처리하고 원하는 패턴을 찾을 수 있음

구구단 출력하기

for i in range(2, 10):
    for j in range(1, 10):
        print(i, "x", j, "=", i*j)

별(*)로 삼각형 만들기

size = 5
for i in range(size): # 별을 몇 줄?
    for j in range(i + 1): # 별을 몇 개?
        print("*", end="")
    print()
  • end="" 부분은 띄어쓰기 후 줄바꾸기를 하지 않기 위한 것

별(*)로 역삼각형 만들기

size = 5
for i in range(size, 0, -1):
    for j in range(i):
        print("*", end="")
    print()

추가: 별찍기 - 정삼각형

# 1번
size = 5
for i in range(size):
	print(" "*((size-1)-i), end="")
	print("*"*(2*i+1))

2번

size = 5
for i in range(size):
for j in range((size-1)-i):
print(" ", end="")
for j in range(2i-1):
print("
", end="")


## 5) 실전 예시
- 데이터 분석에서는 반복문을 데이터의 각 요소를 처리하거나 데이터 구조를 탐색하는 데 사용

### 데이터 정제 및 전처리
- 데이터에서 결측치를 처리하거나 이상치를 탐지하기 위해 각 행이나 열을 반복적으로 검사
- 문자열 데이터를 숫자로 변환하거나 특수문자를 제거하는 등의 전처리 작업에서 반복문을 사용
```python
# 결측치 처리 예시
data = [10, 20, None, 30, 40, None, 50]
cleaned_data = []
for d in data:
    if d is not None:
        cleaned_data.append(d)
print(cleaned_data)

통계 계산

  • 데이터의 요약 통계(평균, 중앙값, 표준편차 등)를 계산할 때 각 요소를 반복하여 처리
  • 히스토그램이나 분포를 만들 때 데이터를 반복하여 처리하고 카운트
# 평균 계산 예시
data = [10, 20, 30, 40, 50]
total = 0
for d in data:
    total += d
mean = total / len(data)
print("Mean:", mean)

리스트 평균 sum과 len으로 구했던 거 기억나죠?

data = [10, 20, 30, 40, 50]
mean = sum(data) / len(data)
print("Mean:", mean)

데이터 탐색

  • 데이터의 특정 패턴이나 특징을 찾기 위해 데이터를 반복적으로 탐색
    • 예를 들어, 특정 조건을 만족하는 데이터를 찾거나 특정 값의 분포를 조사할 때 사용
  • 다차원 데이터 구조를 탐색하고 관련 정보를 추출하기 위해 반복문 사용
# 특정 조건을 만족하는 데이터 찾기 예시
data = [10, 20, 30, 40, 50]
threshold = 25
for d in data:
    if d > threshold:
        print("Value greater than", threshold, "found:", d)

모델 평가

  • 모델의 성능을 평가할 때 예측값과 실제값을 비교하기 위해 데이터를 반복하여 처리
  • 교차 검증(cross-validation)을 수행할 때 각 폴드에 대해 반복문을 사용하여 모델을 훈련하고 평가
# 모델 성능 평가 예시
true_values = [1, 0, 1, 0, 1] # 실제 정답
predicted_values = [0, 0, 1, 0, 1] # AI가 예측한 정답
correct_predictions = 0
for true, pred in zip(true_values, predicted_values):
    if true == pred:
        correct_predictions += 1
accuracy = correct_predictions / len(true_values) # 얼마만큼 정확하게 예측했는지 계산
print("Accuracy:", accuracy)

반복적인 작업 자동화

  • 여러 데이터 파일이나 시계열 데이터의 각 시간 단계를 반복적으로 처리하여 일괄적으로 분석하거나 처리
  • 반복적인 분석 작업을 자동화하기 위해 반복문을 사용

반복문: while문

1) while이란?

  • 파이썬의 반복문 중 하나
  • 조건을 만족하는 동안 코드 블록을 반복적으로 실행
  • 특정 조건이 참(True)일 때에만 실행되며, 조건이 거짓(False)이 될 때까지 반복
    ※무한 반복이 되지 않도록 조심!※

구조

while 조건:
    코드_블록
  • "조건": 불리언(boolean) 값(True 또는 False)을 반환하는 표현식
  • 조건이 True로 평가될 때까지 코드 블록이 반복적으로 실행

2) while문의 기본 사용법

1부터 5까지 출력하기

i = 1
while i <= 5:
    print(i)
    i += 1
  • 1부터 5까지의 숫자를 출력
  • while문을 사용하여 변수 i가 5 이하일 때까지 반복하여 숫자를 출력하고, 반복마다 i를 1씩 증가시킴

사용자 입력 받기

user_input = ''
while user_input != 'quit':
    user_input = input("Type 'quit' to exit: ")
    print("You typed:", user_input)
  • 사용자로부터 'quit'을 입력할 때까지 사용자 입력을 받음
  • 사용자가 'quit'을 입력하면 while문 종료

무한 루프와 break문

※ 무한 루프를 짤 때는 반드시 ‘break’와 같은 반복을 끝내는 장치를 잘 만들어 둬야 함 ※

while True:
    user_input = input("Type 'quit' to exit: ")
    if user_input == 'quit':
        break
    print("You typed:", user_input)

: 무한 루프를 생성하고 사용자가 'quit'을 입력하면 루프를 종료 → break문 사용

제어문

  • 반복문에는 break, pass, continue와 같이 특정 조건에 따라 반복 동작을 제어할 제어문을 함께 자주 사용
    • break, pass, continue는 각 반복문의 동작을 중단하거나 다음 반복으로 이동하거나 아무 동작을 하지 않고 다음으로 넘어가는 데 사용

break 예시

# 사용자가 'quit'을 입력할 때까지 반복하여 숫자를 입력받고 합을 출력
total = 0
while True:
    num = input("숫자를 입력하세요 (종료하려면 'quit' 입력): ")
    if num == 'quit':
        break
    total += int(num)

print("합:", total)
  • 위 예시에서 break 문은 사용자가 'quit'을 입력할 때 반복문을 종료시킴

pass 예시

# 홀수를 출력하는 코드에서 짝수일 경우에는 아무 작업도 수행하지 않고 넘어감
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num % 2 == 0:
        pass
    else:
        print(num, "은 홀수입니다.")
  • 위 예시에서 pass 문은 아무런 동작을 하지 않고 다음 반복을 계속함
    (홀수를 출력하는 반복문에서 짝수일 경우 아무 작업도 하지 않고 다음 반복을 진행)

continue 예시

# 1부터 10까지의 숫자 중 짝수를 출력
num = 0
while num < 10:
    num += 1
    if num % 2 == 1:
        continue
    print(num)
  • 위 예시에서 continue 문은 짝수일 경우에만 출력을 수행하고, 홀수일 경우 다음 반복을 진행

pass와 continue 비교

# continue
num = 0
while num < 10:
    num += 1
    if num % 2 == 1:
        continue
    print(num) 
'''
출력:
2
4
6
8
10
'''
# pass
num = 0
while num < 10:
    num += 1
    if num % 2 == 1:
        pass
    print(num) 
'''
출력:
1
2
3
4
5
6
7
8
9
10
'''

조건에 따른 특정 동작 반복 (1)

count = 0
while count < 3:
    print("Hello")
    count += 1
  • "Hello"를 세 번 출력
  • count 변수를 사용하여 while문이 세 번 반복되도록 설정

조건에 따른 특정 동작 반복 (2)

num = 5
factorial = 1
while num > 0:
    factorial *= num
    num -= 1
print("Factorial of 5 is:", factorial)
  • while문을 사용하여 5의 팩토리얼을 계산

※ 대부분은 for문으로 해결 가능
※ 특정한 상황에서만 while문 쓰게 되는데 그 때 무한 루프에 빠지지 않도록 조심 또 조심!

Quiz

1) 조건문

  1. 다음 중 파이썬에서 사용되는 비교 연산자가 아닌 것은?
    a) ==
    b) !=
    c) <=
    d) ><

🡆 d

  1. 임의의 수를 변수에 넣고 그 변수에 입력된 수가 양수인지 음수인지 판별하여 결과를 출력하는 파이썬 코드를 작성해보세요. (0은 양수로 간주합니다)

🡆

num = input("임의의 수를 입력하세요. (0은 양수로 간주합니다)")
if num >= 0:
	print("입력된 수는 양수입니다.")
else:
	print("입력된 수는 음수입니다.")

2) for문

  1. 다음 코드의 출력 결과는 무엇인가요? (코드를 치지 않고도 한번 맞춰 보세요!)
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num % 2 == 0:
        print(num)

a) 1
b) 2
c) 3
d) 4
e) 5

🡆 b, d

  1. 1부터 10까지의 정수 중에서 홀수만을 포함하는 리스트를 생성하는 파이썬 코드를 작성해보세요.

🡆

odd_num = []
for i in range(1, 11):
	if i % 2 == 1:
    	odd_num.append(i)

※ 추가: 다른 풀이

# 1
odd_numbers = []
for i in range(1, 11):
    if i % 2 != 0:
        odd_numbers.append(i)
        
# 2
odd_numbers = []
for i in range(1, 11):
    if not i % 2 == 0:
        odd_numbers.append(i)

3) while문

  1. 다음 중 무한 루프를 탈출하는 방법이 아닌 것은?
    a) break문 사용
    b) continue문 사용
    c) 조건문에서 False가 되도록 설정
    d) return문 사용

🡆 d

4) 종합 퀴즈: 조건문과 반복문 모두 이용

    1. 1부터 100까지의 정수 중에서 3의 배수일 때 "Fizz", 5의 배수일 때 "Buzz"를 출력하세요. (나머지 경우에는 그냥 숫자를 출력합니다)
for i in range(1, 101):
	if i % 3 == 0:
    	print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
    	print(i)

※ 추가: 3의 배수이면서 5의 배수인 경우 "Fizz"와 "Buzz"를 모두 출력하도록 만들고 싶은데 어떻게 접근해야 할까? elif를 추가하면 if에서 걸려서 적용이 안 될 것 같은데?
🡆 튜터님께 여쭤보니 if에서 한 번 더 if를 쓰면 된다고 하셨음! 그래서 아래처럼 작성해서 실행해보니 잘 나왔다.

for i in range(1, 101):
  if i % 3 == 0:
    if i % 5 == 0:
      print("Fizz & Buzz")
    else:
      print("Fizz")
  elif i % 5 == 0:
    print("Buzz")
  else:
    print(i)

아니면 그냥 if절 시작을 i % 15로 하는 건? → 이것도 됨

for i in range(1, 101):
  if i % 15 == 0:
    print("Fizz & Buzz")
  elif i % 3 == 0:
    print("Fizz")
  elif i % 5 == 0:
    print("Buzz")
  else:
    print(i)
profile
2 B R 0 2 B

0개의 댓글