Python 함수, 사용자 입력 처리 및 리스트 활용

Python 함수, 사용자 입력 처리 및 리스트 활용

이 문서는 Python 프로그래밍의 핵심 요소인 함수 정의 및 호출, 사용자로부터 데이터를 입력받아 처리하는 방법, 그리고 여러 데이터를 효율적으로 관리하는 리스트 자료구조의 기본 활용법을 다룹니다. 이 지식들을 바탕으로 간단한 계산기와 실용적인 온도 변환 프로그램을 구현하는 방법을 살펴보겠습니다.

1. Python 함수의 이해와 활용

함수는 특정 작업을 수행하는 코드 블록으로, 코드의 재사용성을 높이고 프로그램을 모듈화하여 가독성을 향상시키는 데 필수적입니다. 함수는 한 번 정의되면 여러 곳에서 반복적으로 호출될 수 있습니다.

함수 정의와 호출 기본

Python에서 함수는 def 키워드를 사용하여 정의합니다. 함수는 하나 이상의 매개변수를 받을 수 있으며, return 키워드를 사용하여 호출자에게 결과를 반환합니다. 다음은 원의 면적을 계산하는 함수의 예시입니다.

import math # 파이(pi) 값을 사용하기 위해 math 모듈 임포트

# 원의 면적을 계산하는 함수 정의
# 'radius'는 함수가 호출될 때 전달받을 매개변수입니다.
def calculate_circle_area(radius):
    # 계산된 면적 값을 호출한 곳으로 반환합니다.
    return math.pi * radius * radius

# 함수를 정의하는 단계에서는 코드가 실행되지 않습니다.

# 함수의 호출 예시
# 함수 호출 시 실제 전달하는 값을 '인자(argument)'라고 합니다.
first_area = calculate_circle_area(4) # 반지름 4를 인자로 전달하여 함수 호출
print(f"반지름이 4인 원의 면적: {first_area:.2f}")

# 함수 호출 결과를 바로 출력할 수도 있습니다.
print(f"반지름이 6인 원의 면적: {calculate_circle_area(6):.2f}")
print(f"반지름이 8인 원의 면적: {calculate_circle_area(8):.2f}")

핵심 사항:

  • 정의와 호출의 구분: 함수는 정의만으로는 실행되지 않으며, 명시적으로 호출해야 합니다.
  • 함수명: 함수의 목적을 명확히 나타내는 이름을 사용하는 것이 좋습니다 (예: calculate_circle_area).
  • 매개변수와 인자: 함수는 작업을 수행하는 데 필요한 데이터를 매개변수를 통해 전달받고, 호출 시 인자를 통해 데이터를 제공합니다.

2. 사용자 입력 처리: input(), eval(), int(), float()

사용자와의 상호작용은 대부분 input() 함수를 통해 이루어집니다. input()으로 받은 데이터는 항상 문자열 형태이므로, 필요한 경우 숫자로 변환하는 과정이 필요합니다.

문자열과 숫자 데이터 타입의 연산 차이

Python에서 문자열과 숫자는 서로 다른 연산 방식을 가집니다. 이를 이해하는 것이 중요합니다.

# 숫자와 문자열의 기본 연산 비교
numeric_val = 7      # 정수 타입
string_val = '7'     # 문자열 타입

print(f"숫자 * 4: {numeric_val * 4}")    # 결과: 28 (숫자 곱셈)
print(f"문자열 * 4: {string_val * 4}")    # 결과: '7777' (문자열 반복)

input() 함수로 사용자 입력 받기

input() 함수는 사용자로부터 한 줄의 텍스트를 입력받으며, 이 입력값은 항상 문자열(str) 타입으로 반환됩니다.

# input() 함수 사용 예시
user_text = input("좋아하는 색깔을 입력하세요: ")
print(f"입력된 값의 타입: {type(user_text)}") # 항상 <class 'str'> 출력
print(f"입력된 내용: {user_text}")

user_number_str = input("숫자를 입력하세요: ")
print(f"입력된 값의 타입: {type(user_number_str)}")
# 이 상태에서 숫자로 연산하면 오류가 발생할 수 있습니다 (예: user_number_str + 5)
# 문자열 반복은 가능합니다.
print(f"입력된 숫자(문자열) * 2: {user_number_str * 2}") # '5' 입력 시 '55' 출력

int()float() 함수로 타입 변환

문자열 형태의 숫자를 실제 숫자(정수 또는 실수)로 변환하기 위해 int()float() 함수를 사용합니다.

# int() 함수로 문자열을 정수로 변환
integer_input = int(input("정수를 입력하세요: "))
print(f"변환된 값의 타입: {type(integer_input)}")
print(f"변환된 정수 * 5: {integer_input * 5}") # 이제 숫자 연산이 가능합니다.

# float() 함수로 문자열을 실수로 변환
float_input = float(input("소수점 있는 숫자를 입력하세요: "))
print(f"변환된 값의 타입: {type(float_input)}")
print(f"변환된 실수 * 5: {float_input * 5}") # 실수 연산이 가능합니다.

eval() 함수로 표현식 계산

eval() 함수는 문자열로 주어진 파이썬 표현식을 파싱하고 실행하여 그 결과를 반환합니다. 이를 통해 사용자로부터 복잡한 수식을 입력받아 계산할 수 있습니다.

# eval() 함수 사용 예시
expression_from_user = input("계산할 수식을 입력하세요 (예: 10 + 2 * 3): ") # 사용자 입력: '10 + 2 * 3'
result_from_eval = eval(expression_from_user)
print(f"'{expression_from_user}'의 계산 결과: {result_from_eval}") # 16 출력

# 변수를 포함한 표현식도 eval()로 계산할 수 있습니다.
my_variable = 20
print(f"eval('my_variable + 5') 결과: {eval('my_variable + 5')}") # 25 출력

# 정의되지 않은 변수를 eval()에서 사용하면 'NameError'가 발생합니다.
# print(eval('undefined_var * 2')) # 이 줄의 주석을 해제하면 오류 발생

3. 리스트(List)의 사용

변수는 일반적으로 하나의 값만 저장할 수 있습니다. 하지만 리스트는 순서가 있는 여러 값들을 하나의 변수에 모아 관리할 수 있게 해주는 유연한 자료구조입니다.

# 빈 리스트 생성
my_list = []

# 리스트에 요소 추가 (append() 메서드)
my_list.append("항목 A")
my_list.append(123)
my_list.append(True)
print(f"현재 리스트: {my_list}")

# 리스트의 길이 (요소의 개수) 확인 (len() 함수)
print(f"리스트의 길이: {len(my_list)}")

# 리스트의 모든 요소를 반복하여 접근 (for 루프)
print("리스트의 각 요소:")
for element in my_list:
    print(element)

사용자 입력과 함수를 활용한 원 면적 계산 리스트

앞서 배운 input(), eval(), 함수, 그리고 리스트를 결합하여 여러 원의 반지름을 입력받고, 각 원의 면적을 계산하는 프로그램을 만들 수 있습니다.

import math

# 원의 면적을 계산하는 함수 (이전에 정의된 것을 사용하거나 여기에 다시 정의)
def calculate_area_of_circle(radius_val):
    return math.pi * radius_val * radius_val

# 여러 원의 반지름을 저장할 빈 리스트
circle_radii = []
number_of_circles = 3 # 3개의 원 반지름을 입력받을 예정

print(f"{number_of_circles}개의 원 반지름을 입력하세요.")
for i in range(number_of_circles):
    radius_str = input(f"[{i+1}/{number_of_circles}] 원의 반지름 (숫자 또는 수식): ")
    try:
        # eval()을 사용하여 사용자 입력(숫자 또는 표현식)을 숫자로 변환
        radius_numeric = eval(radius_str)
        # 반지름은 양수여야 합니다.
        if not isinstance(radius_numeric, (int, float)) or radius_numeric <= 0:
            raise ValueError("반지름은 양의 숫자여야 합니다.")
        circle_radii.append(radius_numeric)
    except (NameError, TypeError, SyntaxError, ValueError) as e:
        print(f"오류: 유효하지 않은 입력입니다 ('{radius_str}'). 이 값은 무시됩니다. ({e})")

print(f"\n입력된 반지름 값들: {circle_radii}")

print("\n각 원의 면적을 계산합니다:")
for r_val in circle_radii:
    area_calculated = calculate_area_of_circle(r_val)
    print(f"반지름 {r_val:.2f}인 원의 면적: {area_calculated:.2f}")

4. 함수를 이용한 온도 변환 프로그램

사용자로부터 온도 값을 입력받아 섭씨(Celsius)를 화씨(Fahrenheit)로, 또는 화씨를 섭씨로 변환하는 프로그램을 작성합니다. 이 과정에서 함수의 모듈화와 단일 책임 원칙을 적용하여 코드의 효율성과 유지보수성을 높이는 방법을 살펴봅니다.

온도 변환 IPO 분석 및 알고리즘

  • 입력 (Input): 온도 단위(C 또는 F)를 포함하는 문자열 형태의 온도 값 (예: "25C", "77F").
  • 처리 (Process):
    • 입력 문자열에서 온도 값과 단위를 분리합니다.
    • 단위에 따라 다음 변환 공식을 적용합니다:
      • 섭씨(C) → 화씨(F): F = C * 1.8 + 32
      • 화씨(F) → 섭씨(C): C = (F - 32) / 1.8
  • 출력 (Output): 변환된 온도 값과 새로운 단위가 포함된 문자열 (예: "77.00F", "25.00C").

기본 온도 변환기 구현

먼저, 함수를 사용하지 않고 기본적인 온도 변환 로직을 구현합니다.

# 사용자로부터 온도 값과 단위를 입력받습니다.
user_temp_input = input("온도 값과 단위를 입력하세요 (예: 25C, 77F): ")

# 입력 문자열에서 단위와 숫자 부분을 분리합니다.
# 마지막 문자는 단위, 그 앞의 모든 문자는 값입니다.
temperature_unit = user_temp_input[-1].upper() # 단위를 대문자로 변환하여 일관성 유지
temperature_value_str = user_temp_input[:-1] # 마지막 문자를 제외한 부분

try:
    # eval()을 사용하여 온도 값을 숫자(정수 또는 실수)로 변환합니다.
    # 이를 통해 "20+5C"와 같은 수식도 처리할 수 있습니다.
    actual_temperature_value = eval(temperature_value_str)

    if temperature_unit == 'F': # 화씨(Fahrenheit)를 섭씨(Celsius)로 변환
        celsius_converted = (actual_temperature_value - 32) / 1.8
        print(f"변환된 온도: {celsius_converted:.2f}C")
    elif temperature_unit == 'C': # 섭씨(Celsius)를 화씨(Fahrenheit)로 변환
        fahrenheit_converted = actual_temperature_value * 1.8 + 32
        print(f"변환된 온도: {fahrenheit_converted:.2f}F")
    else:
        print("오류: 유효하지 않은 온도 단위입니다. (C 또는 F를 사용해주세요)")

except (NameError, TypeError, SyntaxError, ValueError):
    print("오류: 유효하지 않은 온도 값 형식입니다.")

코드 설명:

  • user_temp_input[-1].upper(): 입력 문자열의 마지막 글자(단위)를 추출하고 대문자로 변환합니다. 이는 사용자가 'c'나 'f'와 같은 소문자를 입력해도 올바르게 처리하기 위함입니다.
  • user_temp_input[:-1]: 입력 문자열의 첫 문자부터 마지막 문자 바로 앞까지를 잘라내어 온도 값을 나타내는 문자열로 사용합니다.
  • eval(temperature_value_str): 추출된 온도 값 문자열을 실제 파이썬 수식으로 평가하여 숫자 값을 얻습니다.

함수화를 통한 코드 개선

위의 변환 로직을 함수로 캡슐화하면 코드의 재사용성을 높이고 메인 로직을 간결하게 만들 수 있습니다. 초기 버전의 함수는 변환된 값과 함께 사용자에게 보여줄 메시지를 직접 생성하여 반환하도록 구현할 수 있습니다.

def get_formatted_temperature_conversion(temp_string):
    unit = temp_string[-1].upper()
    value_part = temp_string[:-1]

    try:
        temp_num_value = eval(value_part)
        
        if unit == 'F':
            converted_celsius = (temp_num_value - 32) / 1.8
            return f"변환된 온도는 {converted_celsius:.2f}C 입니다."
        elif unit == 'C':
            converted_fahrenheit = temp_num_value * 1.8 + 32
            return f"변환된 온도는 {converted_fahrenheit:.2f}F 입니다."
        else:
            return "오류: 지원하지 않는 온도 단위입니다."
    except (NameError, TypeError, SyntaxError, ValueError):
        return "오류: 온도 값의 형식이 올바르지 않습니다."

# 함수를 호출하여 온도 변환 수행
print(get_formatted_temperature_conversion("68F"))
print(get_formatted_temperature_conversion("20C"))
print(get_formatted_temperature_conversion("50K")) # 잘못된 단위 입력
print(get_formatted_temperature_conversion("helloF")) # 잘못된 값 입력

함수 모듈화: 단일 책임 원칙 적용

좋은 함수는 하나의 명확한 기능만 수행해야 합니다 (단일 책임 원칙). 위의 get_formatted_temperature_conversion 함수는 "온도 변환"과 "출력 메시지 포맷팅"이라는 두 가지 책임을 동시에 가집니다. 이를 분리하여 함수가 순수한 변환 결과만을 반환하도록 개선할 수 있습니다. 이렇게 하면 변환된 온도를 다른 계산에 활용하거나 다양한 방식으로 출력할 때 더 유연하게 대응할 수 있습니다.

def convert_temp_value(raw_temp_input_string):
    unit_char = raw_temp_input_string[-1].upper()
    value_segment = raw_temp_input_string[:-1]

    try:
        numeric_val = eval(value_segment)
        
        if unit_char == 'F':
            # 화씨를 섭씨로 변환하고 (값, 단위) 튜플 반환
            return (round((numeric_val - 32) / 1.8, 2), 'C')
        elif unit_char == 'C':
            # 섭씨를 화씨로 변환하고 (값, 단위) 튜플 반환
            return (round(numeric_val * 1.8 + 32, 2), 'F')
        else:
            return "UNIT_ERROR" # 유효하지 않은 단위
    except (NameError, TypeError, SyntaxError, ValueError):
        return "VALUE_ERROR" # 유효하지 않은 값 형식

# 모듈화된 함수를 활용하여 메인 로직 구현
input_temp_data = input("변환할 온도를 입력하세요 (예: 10+5F, -10C): ")
conversion_result = convert_temp_value(input_temp_data)

if conversion_result == "UNIT_ERROR":
    print("입력 오류: C 또는 F 단위만 지원됩니다.")
elif conversion_result == "VALUE_ERROR":
    print("입력 오류: 유효한 숫자 또는 수식 형태로 온도를 입력해주세요.")
else:
    final_value, final_unit = conversion_result
    print(f"변환된 온도: {final_value}{final_unit}")

# 추가 테스트 예시
print(f"온도 변환 결과 (32F): {convert_temp_value('32F')}")
print(f"온도 변환 결과 (0C): {convert_temp_value('0C')}")
print(f"온도 변환 결과 (100-20F): {convert_temp_value('100-20F')}") # 80F -> 26.67C

태그: python 함수 input eval 리스트

7월 14일 21:42에 게시됨