[혼공파] Beautiful Soup & Flask 로 기상청 날씨 정보 훔치기

· 댓글

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

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

Flask와 BeautifulSoup 간단 소개 

Flask는 가벼운 웹 프레임워크로 간단한 웹 애플리케이션을 빠르게 개발할 수 있는 도구입니다.  

BeautifulSoup은 HTML/XML을 파싱하여 웹 크롤링을 쉽게 할 수 있도록 도와주는 라이브러리입니다. 

from flask import Flask
from urllib import request
from bs4 import BeautifulSoup

class WeatherScraper:
  """기상청 날씨 데이터를 가져와 처리하는 클래스"""

  def __init__(self, url: str):
    """생성자: 가져올 URL을 설정"""
    self.url = url
    self.soup = None

  def fetch_weather_data(self):
    """웹에서 데이터를 가져와 BeautifulSoup으로 분석"""
    response = request.urlopen(self.url)
    self.soup = BeautifulSoup(response, "html.parser")

  # 파일로 저장하는 이유는 디버그 용도
  # print()함수로 사용해서 확인하니까 너무 길어서 짤림...
  def save_to_file(self, filename: str = "result.html"):
    """파싱된 데이터를 파일로 저장"""
    if self.soup:
      with open(filename, "w", encoding="utf-8") as file:
        file.write(str(self.soup))

  def parse_weather(self) -> str:
    """HTML 문서 전체를 생성하여 반환"""

    if not self.soup:
      return "<p>날씨 데이터를 불러오지 못했습니다.</p>"

    output = """
    <!DOCTYPE html>
    <html lang="ko">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>[혼공파] - 6주차 과제</title>
      <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        h1 { color: darkblue; }
        h3 { color: darkred; }
        hr { border: 0; height: 1px; background: gray; margin: 10px 0; }
      </style>
    </head>
    <body>
      <h1>[혼공파] 6주차 마지막 과제</h1>
    """

    # header 태그 가져오기 (존재하면 출력)
    header_tag = self.soup.select("header")
    # html이니까 br 태그로 줄 바꿈 해주기
    # select는 return 타입이 array임
    header_text = "<br />".join([tag.get_text(strip=True) for tag in header_tag]) if header_tag else "헤더 정보 없음"

    output += f"<strong>{header_text}</strong><hr/>"

    # 지역별 날씨 정보 추가
    # location 별로 나눠져 있음
    for location in self.soup.select("location"):
      city = location.select_one("city").string
      weather = location.select_one("wf").string
      min_temp = location.select_one("tmn").string
      max_temp = location.select_one("tmx").string

      output += f"<h3>{city}</h3>"
      output += f"<p>날씨: {weather}</p>"
      output += f"<p>최저/최고 기온: {min_temp}/{max_temp}</p>"
      output += "<hr />"

    # HTML 마무으리
    output += """
    </body>
    </html>
    """

    return output

# Flask 웹 서버 생성
app = Flask(__name__)

# 루트 경로로 실행
@app.route("/")
def hello():
  """Flask 라우트에서 WeatherScraper(클래스)를 활용하여 HTML 반환"""
  scraper = WeatherScraper("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")
  scraper.fetch_weather_data()
  scraper.save_to_file()  # result.html 파일 저장
  return scraper.parse_weather()  # HTML 문서 전체 반환

 

기본 숙제 코드 beautiful_flask.py 와 다른 점

  • WeatherScraper 클래스를 사용하여 데이터를 가져오고 파싱하는 기능을 모듈화했습니다.
  • 지역, 날씨, 최저/최고 기온 데이터 외에 HTML <head> 태그 RSS에 있는 <header> 데이터를 포함했습니다.
  • print()를 사용해서 데이터를 확인하려 했지만, 응답 컨텐츠가 너무 길어 파일로 저장하여 디버깅했습니다.

 

export FLASK_APP=<파일명>.py # ./beautiful_soup
flask run
http://127.0.0.1:5000

결과

[혼공파] 파이썬 구문 오류(SyntaxError)와 예외(Exception)의 차이점

· 댓글

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

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

어떤 언어로든 프로그래밍을 하다 보면 구문 오류(SyntaxError)예외(Exception)를 자주 만나게 됩니다. 이 둘은 모두 코드 실행을 멈추게 만들지만, 발생 원인과 처리 방식이 다릅니다. 이번 글에서는 구문 오류예외의 차이를 이해하고, 이를 효과적으로 처리하는 방법을 살펴보겠습니다.

1. 구문 오류(SyntaxError)란?

구문 오류(SyntaxError)는 코드가 문법적으로 올바르지 않을 때 발생하는 오류입니다. 파이썬 인터프리터는 실행 전에 구문 분석(parsing) 과정을 거치는데, 이때 문법에 맞지 않는 코드가 발견되면 SyntaxError가 발생하며 실행이 중단됩니다. 주로 IDE의 코드 빨간줄인 경우 구문 오류 입니다.

주요 구문 오류 종류

  • SyntaxError: 문법 오류
  • IndentationError: 들여쓰기 오류
  • TabError: 탭과 공백 혼용 오류
  • EOL while scanning string literal: 문자열 리터럴이 닫히지 않았을 때 발생
  • Unexpected character after line continuation character: 줄바꿈 문자(\) 이후 잘못된 문자가 올 때 발생
  • Invalid syntax: 잘못된 문법 구조 사용 시 발생

2. 예외(Exception)란?

예외(Exception)는 코드가 문법적으로는 올바르지만, 실행 도중 발생하는 오류입니다. 예를 들어, 0으로 나누거나 존재하지 않는 파일을 열려고 하면 예외가 발생합니다. 하지만 예외는 try-except 문을 사용해 적절히 처리할 수 있습니다.

주요 예외 종류

  • ZeroDivisionError: 0으로 나누기 오류
  • FileNotFoundError: 존재하지 않는 파일을 열려 할 때 발생
  • TypeError: 잘못된 타입의 연산 수행
  • ValueError: 부적절한 값을 함수에 전달했을 때 발생
  • IndexError: 리스트 또는 튜플의 범위를 초과했을 때 발생
  • KeyError: 딕셔너리에 존재하지 않는 키를 참조할 때 발생
  • AttributeError: 존재하지 않는 속성을 접근하려 할 때 발생
  • NameError: 정의되지 않은 변수를 참조했을 때 발생
  • ImportError: 모듈 임포트 실패
  • RuntimeError: 일반적인 실행 중 오류

3. 구문 오류와 예외의 주요 차이점

구분 구문 오류(SyntaxError) 예외(Exception)

발생 시점 코드 실행 전(컴파일 단계) 코드 실행 중(runtime)
원인 문법적 오류 실행 중 발생하는 오류(연산 오류, 파일 없음 등)
예제 print("Hello" (괄호 누락) 10 / 0 (0으로 나누기)
처리 가능 여부 try-except로 처리 불가능 try-except로 처리 가능

4. 예시

# SyntaxError 예제
# 문법적으로 잘못된 코드 예시 (괄호 닫기 누락)
# 이 코드는 실행 자체가 되지 않음
# print("Hello"  

# 올바른 예제
print("Hello")  # 정상 실행

# 예외(Exception) 예제
# 실행 중 발생하는 오류는 try-except로 처리 가능
try:
    result = 10 / 0  # ZeroDivisionError 발생
except ZeroDivisionError as e:
    print(f"예외 발생: {e}")

try:
    numbers = [1, 2, 3]
    print(numbers[5])  # IndexError 발생 (범위를 초과한 인덱스 접근)
except IndexError as e:
    print(f"예외 발생: {e}")

try:
    value = int("hello")  # ValueError 발생 (문자열을 숫자로 변환 실패)
except ValueError as e:
    print(f"예외 발생: {e}")
    
try:
    x = int("hello")  # ValueError 발생
except Exception as e:  # 모든 예외를 처리하는 기본 예외 클래스
    print(f"예외 발생: {e}")

 

예외 처리는 크게 두 가지 방식으로 접근할 수 있습니다.

  1. 구체적인 예외를 명시적으로 처리하는 방법
    • 특정 예외를 따로 처리하여 원인을 명확하게 파악할 수 있음.
    • 예외별로 다른 대응이 가능함.
  2. Exception을 사용해 한 번에 처리하는 방법
    • 다양한 예외를 일괄적으로 잡아 코드가 간결해짐.
    • 예상치 못한 예외도 처리할 수 있음.

이러한 구조는 if, elif, else 문법과 비슷하게 이해할 수 있습니다.
즉, 명시적으로 예외를 처리하고 (if, elif) 마지막에 Exception을 설정해 두면 (else) 예상치 못한 예외 상황을 대비할 수 있습니다.

5. 결론

파이썬에서 구문 오류(SyntaxError)는 코드 실행 전에 문법적으로 잘못되었을 때 발생하며, try-except로 처리할 수 없습니다. 반면, 예외(Exception)는 실행 중 발생하는 오류이며, try-except를 사용해 적절히 처리할 수 있습니다.

[혼공파] Python의 매개변수와 기본 매개변수, 가변 매개변수 이해하기

· 댓글

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

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

 

Python에서는 함수를 정의할 때 매개변수를 활용하여 다양한 방식으로 값을 전달할 수 있습니다. 본 글에서는 일반 매개변수, 기본 매개변수, 가변 매개변수에 대해 알아보고 각각의 예제와 함께 설명하겠습니다.


1. 매개변수 (Parameters)란?

매개변수는 함수를 정의할 때 함수가 외부에서 값을 받을 수 있도록 설정하는 변수입니다. 함수를 호출할 때 매개변수에 값을 전달하면 함수 내부에서 해당 값을 활용할 수 있습니다.

# 두 수를 더하는 함수 정의
def add(a, b):
    return a + b

# 함수 호출
result = add(3, 5)
print(result)  # 출력: 8

위 코드에서 ab는 매개변수이며, 함수가 호출될 때 35가 각각 a, b에 전달됩니다.


2. 기본 매개변수 (Default Parameters)

기본 매개변수란 특정 인자를 전달하지 않았을 때 기본값을 사용할 수 있도록 설정된 매개변수입니다.

# 기본값을 가지는 함수 정의
def greet(name="Minions"):
    print(f"Hello, {name}!")

# 매개변수 값을 전달하는 경우
greet("Bob")  # 출력: Hello, Bob!

# 매개변수를 전달하지 않는 경우
greet()  # 출력: Hello, Minions!

위 코드에서 name 매개변수의 기본값을 "Minions"로 설정하여 인자를 전달하지 않아도 기본적으로 "Minions"가 출력됩니다.


3. 가변 매개변수 (*args, **kwargs)

3.1 가변 위치 매개변수 (*args)

*args는 여러 개의 위치 인자를 받을 수 있도록 하는 매개변수입니다.

# 여러 개의 숫자를 더하는 함수
def add_all(*args):
    return sum(args)

print(add_all(1, 2, 3))  # 출력: 6
print(add_all(4, 5, 6, 7, 8))  # 출력: 30

*args는 튜플 형태로 여러 개의 인자를 받아 처리할 수 있습니다.

3.2 가변 키워드 매개변수 (**kwargs)

**kwargs는 여러 개의 키워드 인자를 받을 수 있도록 하는 매개변수입니다.

# 사용자 정보를 출력하는 함수
def user_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

user_info(name="Minions", eat="Banana", color="Yellow")

# 결과
# name: Minions
# eat: Banana
# color: Yellow

 

**kwargs는 딕셔너리 형태로 여러 개의 키워드 인자를 받아 처리할 수 있습니다.


4. 매개변수 조합하기

Python에서는 일반 매개변수, 기본 매개변수, 가변 매개변수를 조합하여 사용할 수 있습니다. 하지만 올바른 순서로 정의해야 합니다.

# 다양한 매개변수를 조합한 함수
def custom_function(a, b=10, *args, **kwargs):
    print(f"a: {a}")
    print(f"b: {b}")
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")

custom_function(5, 20, 1, 2, 3, name="Minions", age=28)

# 결과
# a: 5
# b: 20
# args: (1, 2, 3)
# kwargs: {'name': 'Minions', 'age': 28}

위 코드에서는 위치 인자, 기본 인자, 가변 위치 인자, 가변 키워드 인자를 모두 사용할 수 있도록 설정했습니다.


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

 

p. 287 [직접 해보는 손코딩: 범위 내부의 정수를 모두 더하는 함수] 실행 후 코드가 입력된 화면 및 실행 결과 화면 캡처하기

# 함수를 선언합니다.
def sum_all(start, end):
    # 변수를 선언합니다.
    output = 0
    # 반복문을 돌려 숫자를 더합니다.
    for i in range(start, end + 1):
        output += i
    # 리턴합니다.
    return output
    

# 함수를 호출합니다.
print("0 to 100:", sum_all(0, 100))
print("0 to 1000", sum_all(0, 1000))
print("50 to 100:", sum_all(50, 100))
print("500 to 1000:", sum_all(500, 1000))

[혼공파] Python 자료형: 리스트, 딕셔너리, 범위형 자료형

· 댓글

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

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

Python은 다양한 데이터를 다루기 위한 강력한 자료형을 제공합니다. 이 글에서는 리스트(List), 딕셔너리(Dictionary), 그리고 범위형(Range) 자료형의 특징과 사용법을 알아보겠습니다.


1. 리스트 (List)

리스트는 순서가 있는 값들의 모음으로, 대괄호([])로 정의됩니다. Python의 리스트는 변경 가능(mutable)하며, 다양한 자료형의 값을 함께 담을 수 있습니다.

주요 특징

  • 순서가 있음: 리스트는 순서를 유지하며, 인덱스를 통해 값에 접근할 수 있습니다.
  • 가변성: 값을 추가, 삭제, 수정할 수 있습니다.
  • 다양한 자료형 혼합 가능: 정수, 문자열, 리스트 등 다양한 자료형을 한 리스트에 담을 수 있습니다.

리스트 생성

리스트를 생성하는 방법은 간단하며, 빈 리스트부터 초기값이 있는 리스트까지 다양하게 가능합니다.

# 빈 리스트 생성
minions = []

# 초기 값이 있는 리스트 생성
minions_names = ["Kevin", "Stuart", "Bob"]
mixed = ["Banana", 42, ["Gru", "Dr.Nefario"]]

주요 메서드와 예시

리스트의 조작 방법은 다양하며, 데이터를 효율적으로 처리할 수 있도록 도와줍니다.

# 값 추가
minions_names.append("Dave")  # ["Kevin", "Stuart", "Bob", "Dave"]

# 값 삽입
minions_names.insert(1, "Jerry")  # ["Kevin", "Jerry", "Stuart", "Bob", "Dave"]

# 값 삭제
minions_names.remove("Jerry")  # ["Kevin", "Stuart", "Bob", "Dave"]

# 정렬
minions_names.sort()  # 오름차순 정렬
minions_names.sort(reverse=True)  # 내림차순 정렬

# 리스트 컴프리헨션
uppercase_names = [name.upper() for name in minions_names]  # ["KEVIN", "STUART", "BOB", "DAVE"]

리스트 컴프리헨션은 반복문과 조건문을 활용해 간결하게 리스트를 생성할 수 있는 강력한 도구입니다. 예를 들어, 리스트의 모든 값을 대문자로 변환하는 작업을 한 줄로 처리할 수 있습니다.


2. 딕셔너리 (Dictionary)

딕셔너리는 키-값(key-value) 쌍의 모음으로, 중괄호({})를 사용하여 정의됩니다. 키를 통해 값을 빠르게 조회할 수 있는 자료형입니다.

주요 특징

  • 키(Key)는 고유해야 함: 중복된 키는 허용되지 않습니다.
  • 값(Value)는 중복 가능: 값에는 어떤 자료형이든 올 수 있습니다.
  • 순서 유지: Python 3.7부터 삽입 순서가 유지됩니다.

딕셔너리 생성

딕셔너리는 구조화된 데이터를 저장하는 데 유용합니다. 키를 사용하여 데이터를 효율적으로 관리할 수 있습니다.

# 빈 딕셔너리 생성
minion_profile = {}

# 초기 값이 있는 딕셔너리 생성
minion_profile = {
    "name": "Kevin",
    "age": 7,
    "hobbies": ["dancing", "eating bananas"]
}

주요 메서드와 예시

딕셔너리는 키-값 쌍을 조작할 수 있는 다양한 메서드를 제공합니다.

# 값 추가 및 수정
minion_profile["city"] = "Minionville"
minion_profile["age"] = 8

# 값 삭제
minion_profile.pop("city")  # {"name": "Kevin", "age": 8, "hobbies": ["dancing", "eating bananas"]}

# 키와 값 조회
keys = minion_profile.keys()  # dict_keys(['name', 'age', 'hobbies'])
values = minion_profile.values()  # dict_values(['Kevin', 8, ['dancing', 'eating bananas']])
items = minion_profile.items()  # dict_items([('name', 'Kevin'), ('age', 8), ('hobbies', ['dancing', 'eating bananas'])])

# 딕셔너리 컴프리헨션
hobby_lengths = {key: len(value) if isinstance(value, list) else len(str(value)) for key, value in minion_profile.items()}  # {'name': 5, 'age': 1, 'hobbies': 2}

딕셔너리 컴프리헨션을 사용하면 조건에 따라 값을 동적으로 변환하거나 필터링할 수 있습니다. 위 예제에서는 각 키의 값의 길이를 계산해 새로운 딕셔너리를 생성합니다.


3. 범위형 (Range)

range는 주로 반복문에서 사용되는 자료형으로, 특정 범위의 숫자 시퀀스를 생성합니다.

주요 특징

  • 순차적인 정수 생성: 시작 값부터 종료 값 직전까지 정수를 생성합니다.
  • 메모리 효율성: 실제로 값을 저장하지 않고, 필요할 때 값을 생성합니다.
  • 불변성: 생성된 range 객체는 변경할 수 없습니다.

범위형 생성

범위형은 반복 작업이나 간격 계산에 유용합니다.

# 기본 사용법
minion_ids = range(5)  # 0부터 4까지

# 시작과 종료값 지정
special_minion_ids = range(1, 6)  # 1부터 5까지

# 간격 지정
even_minion_ids = range(0, 10, 2)  # 0, 2, 4, 6, 8

범위형 활용

반복문과 결합하거나 특정 조건을 기반으로 범위형을 조작할 수 있습니다.

# 리스트로 변환
list_minion_ids = list(minion_ids)  # [0, 1, 2, 3, 4]

# 반복문에서 사용
for id in special_minion_ids:
    print(f"Minion ID: {id}")  # Minion ID: 1, 2, 3, 4, 5

# 필터링과 결합
filtered_ids = [id for id in even_minion_ids if id % 4 == 0]  # [0, 4, 8]

메모리 효율적인 range 객체는 리스트 변환 없이도 반복문에서 사용할 수 있습니다. 필요에 따라 리스트로 변환하거나 조건을 적용해 특정 값을 필터링할 수도 있습니다.


4. 리스트, 딕셔너리, 범위형 비교

자료형주요 특징사용 예시

리스트 순서 있음, 가변적 값 목록 저장 및 조작
딕셔너리 키-값 쌍, 순서 있음 구조화된 데이터 저장
범위형 정수 시퀀스 생성, 불변적 반복문 및 간격 계산

결론

Python의 리스트, 딕셔너리, 그리고 범위형 자료형은 데이터를 저장하고 조작하는 데 매우 유용한 도구입니다. 각각의 자료형은 고유한 장점과 특징을 가지며, 적재적소에 활용할 수 있습니다.

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

· 댓글

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

이 게시글은 혼공학습단(혼공파) 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)까지 슬라이싱합니다.
    • 결과적으로 "안녕하"가 출력됩니다.