[혼공파] 띠 계산 프로그램: 세 가지 구현 방식 비교

혼자 공부하는 파이썬 (개정판)

이 게시글은 혼공학습단(혼공파) 13기의 2주차 과제를 포함하고있습니다.

1. if - elif 문을 활용한 구현

str_input = input("태어난 해를 입력해주세요> ")
birth_year = int(str_input)

if birth_year % 12 == 0:
    print('원숭이 띠입니다.')
elif birth_year % 12 == 1:
    print('닭 띠입니다.')
elif birth_year % 12 == 2:
    print('개 띠입니다.')
elif birth_year % 12 == 3:
    print('돼지 띠입니다.')
elif birth_year % 12 == 4:
    print('쥐 띠입니다.')
elif birth_year % 12 == 5:
    print('소 띠입니다.')
elif birth_year % 12 == 6:
    print('호랑이 띠입니다.')
elif birth_year % 12 == 7:
    print('토끼 띠입니다.')
elif birth_year % 12 == 8:
    print('용 띠입니다.')
elif birth_year % 12 == 9:
    print('뱀 띠입니다.')
elif birth_year % 12 == 10:
    print('말 띠입니다.')
elif birth_year % 12 == 11:
    print('양 띠입니다.')

설명
if-elif 구조는 조건을 순차적으로 평가하며, 첫 번째로 True가 되는 조건을 실행합니다. 조건의 흐름이 명확하여 로직을 이해하고 수정하기 쉽습니다.

장점

  • 각 조건이 독립적으로 작성되어 논리적 흐름이 분명합니다.
  • 조건을 추가하거나 수정하기 용이합니다.

단점

  • 조건문이 많아질수록 코드가 길어지고 유지보수가 어려워질 수 있습니다.
  • 조건이 많아지면 성능 면에서 비효율적일 수 있습니다.

2. 리스트를 활용한 구현

str_input = input("태어난 해를 입력해주세요> ")
birth_year = int(str_input)

animals = [
    '원숭이', '닭', '개', '돼지', 
    '쥐', '소', '범', '토끼', 
    '용', '뱀', '말', '양'
]

animal = animals[birth_year % 12]
print(f'{animal} 띠입니다.')

설명
리스트를 사용하면 태어난 해 % 12 값을 인덱스로 활용하여 동물 이름을 바로 조회할 수 있습니다. 조건문을 반복적으로 작성하지 않아도 되므로 코드가 간결하고 효율적입니다.

장점

  • 코드가 간단하며, 조건을 인덱스 기반으로 처리하기 때문에 가독성이 높습니다.
  • 조건과 결과가 고정된 규칙을 따를 경우 효율적으로 사용할 수 있습니다.

단점

  • 연속적이지 않은 조건을 처리하기에는 적합하지 않습니다.
  • 리스트 인덱스 범위를 벗어난 경우 예외가 발생할 수 있으므로 주의가 필요합니다.

3. 딕셔너리를 활용한 구현

str_input = input("태어난 해를 입력해주세요> ")
birth_year = int(str_input)

animal_dict = {
    0: '원숭이',
    1: '닭',
    2: '개',
    3: '돼지',
    4: '쥐',
    5: '소',
    6: '범',
    7: '토끼',
    8: '용',
    9: '뱀',
    10: '말',
    11: '양'
}

animal = animal_dict[birth_year % 12]
print(f'{animal} 띠입니다.')

설명
딕셔너리는 키-값 쌍으로 구성된 자료구조로, 특정 키에 해당하는 값을 빠르게 검색할 수 있습니다. 조건과 결과가 명확히 매핑되어야 하는 경우 딕셔너리를 사용하면 효율적입니다.

장점

  • 조건과 결과를 명확히 매핑할 수 있어 가독성이 뛰어납니다.
  • 특정 키를 빠르게 검색할 수 있어 성능이 우수합니다.

단점

  • 데이터 초기화가 필요하며, 조건이 동적이거나 복잡한 경우에는 적합하지 않을 수 있습니다.

4. 세 가지 방식 비교

방식 장점 단점
if-elif 단순하고 직관적 조건이 많아질수록 코드 길이가 길어지고 유지보수가 어려울 수 있음
리스트 간결하고 규칙적인 조건 처리에 적합 연속적이지 않은 조건을 처리하기에는 부적합, 범위 초과 주의 필요
딕셔너리 조건과 결과를 명확히 매핑할 수 있고 확장성이 높음 초기 데이터 구성 필요, 동적 조건 처리에 적합하지 않음

5. 어떤 방법을 선택할까?

  • if-elif: 조건이 적고 논리적인 흐름을 순차적으로 표현해야 하는 경우.
  • 리스트: 조건이 숫자 인덱스를 기반으로 규칙적이고 간단한 경우.
  • 딕셔너리: 조건과 결과가 명확히 매핑되는 경우. 특히 대량의 데이터 검색이 필요한 경우.

[혼공파] print 함수 톺아보기

혼자 공부하는 파이썬 (개정판)

이 게시글은 혼공학습단(혼공파) 13기의 1주차 과제를 포함하고있습니다.

 

1. print() 함수의 기본 사용법

print() 함수는 값을 출력하기 위해 사용됩니다.

print("안녕하세요, Python!") # 출력: 안녕하세요, Python!
쉼표로 여러 값을 구분하여 출력할 수도 있습니다.
print("이름:", "성호", "나이:", 25) # 출력: 이름: 성호 나이: 25

2. print() 함수의 파라미터

help(print)
Help on built-in function print in module builtins:

print(*args, sep=' ', end='\n', file=None, flush=False)
    Prints the values to a stream, or to sys.stdout by default.

    sep
      string inserted between values, default a space.
    end
      string appended after the last value, default a newline.
    file
      a file-like object (stream); defaults to the current sys.stdout.
    flush
      whether to forcibly flush the stream.

 

 

  • print() 함수는 하나 이상의 값을 출력할 수 있는 Python의 내장 함수입니다.
  • *args: 여러 개의 값을 가변 위치 인수 형태로 받을 수 있습니다. 예를 들어, print(1, 2, 3)처럼 쉼표로 구분된 값들을 전달할 수 있습니다.

 

1) sep (구분자)

  • 설명: 출력할 여러 값 사이에 삽입할 문자열을 지정합니다.
  • 기본값: 공백 (' ')
print("Python", "is", "awesome", sep="-") # 출력: Python-is-awesome

2) end (끝 문자열)

 

  • 설명: 출력이 끝난 후 추가로 삽입할 문자열을 지정합니다.
  • 기본값: 줄바꿈 ('\n')

 

print("Hello", end=" ") print("World") # 출력: Hello World

3) file

 

  • 설명: 출력 대상을 지정합니다. 기본적으로 표준 출력(sys.stdout, 일반적으로 콘솔)에 출력되지만, 파일 객체를 전달하여 출력 내용을 파일에 저장할 수도 있습니다.
  • 기본값: sys.stdout

 

with open("output.txt", "w") as f:
    print("파일에 출력됩니다.", file=f)
# 파일에 "파일에 출력됩니다."라는 텍스트가 저장됩니다.

4) flush

 

  • 설명: 출력 내용을 즉시 스트림에 강제로 내보낼지 여부를 결정합니다.
  • 기본값: False (스트림이 자동으로 관리)

 

import time

for i in range(5):
    print(i, end=" ", flush=True)
    time.sleep(1)
# 출력: 0 1 2 3 4 (1초 간격으로 출력)

3. 여러 줄 출력

print() 함수는 이스케이프 문자를 사용해 여러 줄을 출력할 수 있습니다.

print("안녕하세요,\nPython입니다.")
# 출력:
# 안녕하세요,
# Python입니다.

또는 삼중 따옴표(""")를 활용하여 더 깔끔하게 작성할 수도 있습니다.

print("""
안녕하세요,
Python입니다.
""")
# 출력:
# 
# 안녕하세요,
# Python입니다.
#

삼중따옴표(""")에 '\' 기호를 추가("""\)하면 의도하지 않은 공백을 방지할 수 있습니다

print("""\
안녕하세요,
Python입니다.
""")
# 출력:
# 안녕하세요,
# Python입니다.

 


4. f-string과 함께 사용하기

Python 3.6부터 도입된 f-string을 사용하면 문자열 포매팅이 훨씬 직관적입니다.

 
name = "성호"
age = 25
print(f"이름: {name}, 나이: {age}")
# 출력: 이름: 성호, 나이: 25

f-string은 수식도 지원합니다.

a, b = 5, 3
print(f"{a} + {b} = {a + b}")
# 출력: 5 + 3 = 8

5. print()를 활용한 디버깅

print()는 디버깅에도 자주 사용됩니다. 특히, 변수 값을 확인하거나 실행 흐름을 추적할 때 유용합니다.

def calculate(x, y):
    print(f"x: {x}, y: {y}")  # 디버깅용 출력
    return x + y

result = calculate(5, 10)
print(f"결과: {result}")
# 출력:
# x: 5, y: 10
# 결과: 15

마무리

print() 함수는 단순히 값을 출력하는 데 그치지 않고, 다양한 매개변수를 통해 커스터마이징된 출력이 가능합니다. 또한 디버깅, 파일 출력, 실시간 로깅 등 다양한 상황에서 유용하게 사용됩니다.


여기서부터는 혼공파의 1주차 과제 입니다.

 

1. 프로그램의 실행 결과를 예측해보세요.

print("# 연습문제")
print("\\\\\\\\")
print("-" * 8)
더보기
# 연습문제
\\\\
--------

 

  • print("# 연습문제")는 문자열 # 연습문제를 출력합니다.
  • print("\\\\\\\\"):
    • 백슬래시(\)는 파이썬에서 이스케이프 문자로 사용됩니다.
    • \\는 하나의 백슬래시(\)로 해석됩니다.
    • 따라서 \\\\는 두 개의 백슬래시(\\)로 출력됩니다.
  • print("-" * 8):
    • 문자열 "-"를 8번 반복한 결과를 출력합니다.
    • 결과적으로 --------가 출력됩니다.

 

2. 다음 프로그램을 실행결과를 예측해보세요. 오류가 발생하면 왜 발생하는지 작성해보세요.

print("안녕하세요"[1])
print("안녕하세요"[2])
print("안녕하세요"[3])
print("안녕하세요"[4])
print("안녕하세요"[5])
더보기
녕
하
세
요
IndexError: string index out of range
  •  "안녕하세요"[1]:
    • 문자열 "안녕하세요"에서 인덱스는 0부터 시작합니다.
    • 인덱스 1은 "녕"에 해당합니다.
  • "안녕하세요"[2]와 "안녕하세요"[3]  "안녕하세요"[4]는 각각 "하", "세", "요"에 해당합니다.
  • "안녕하세요"[5]:
    • 문자열 "안녕하세요"의 길이는 5이지만, 유효한 인덱스는 0 ~ 4입니다.
    • 인덱스 5는 문자열 범위를 벗어나므로 IndexError가 발생합니다.

 

3. 다음 프로그램의 실행결과를 예측해보세요

print("안녕하세요"[1:3])
print("안녕하세요"[2:4])
print("안녕하세요"[1:])
print("안녕하세요"[:3])
더보기
녕하
하세요
녕하세요
안녕하

 

  •  "안녕하세요"[1:3]:
    • 슬라이싱은 [시작:끝] 형식으로 동작하며,  인덱스는 포함되지 않습니다.
    • 인덱스 1부터 3 이전(즉, 1과 2)까지의 문자 "녕하"가 출력됩니다.
  • "안녕하세요"[2:4]:
    • 인덱스 2부터 4 이전(즉, 2와 3)까지의 문자 "하세요"가 출력됩니다.
  • "안녕하세요"[1:]:
    • 시작 인덱스가 1이고 끝 인덱스가 생략된 경우, 1부터 문자열 끝까지 슬라이싱합니다.
    • 결과적으로 "녕하세요"가 출력됩니다.
  • "안녕하세요"[:3]:
    • 시작 인덱스가 생략된 경우, 문자열 처음부터 3 이전(즉, 0, 1, 2)까지 슬라이싱합니다.
    • 결과적으로 "안녕하"가 출력됩니다.