AI 헬스케어 3기 데이터 분석 코스 Python (4)

 함수




제어문, 반복문


로직에 대해 


기능을 묶어놓은 상자다


함수는 특정 작업을 수행하는 코드 블록으로, 재사용 가능하고 코드를 

깔끔하게 정리할 수 있게 해줍니다


재사용성


자주 사용되는 기능


소수점 

웹계발 시 단위 변환

함수로 만들어놓고 사용


정의와 호출하는 부분으로 되어 있음


함수 정의 : def 키워드를 사용하여 함수를 선언함

함수 호출 : 정의된 함수를 실행


함수 정의/선언


def greet_patient():

    print("안녕하세요, 환자님!")

    print("오늘 진료에 오신 것을 환영합니다.")


함수 호출/실행


greet_patient()


안녕하세요, 환자님!

오늘 진료에 오신 것을 환영합니다.


매개변수(Parameter)와 인수(Argument)


매개변수(Parameter) - 함수 정의 시 사용

매개변수는 함수를 정의할 때 입력값을 받기 위해 

설정하는 변수입니다.


# name, age, department가 매개변수(Parameter)

def register_patient(name, age, department):

    """환자를 등록하는 함수 정의"""

    print(f"환자 등록: {name}님 ({age}세)")

    print(f"담당 과: {department}")

    print("등록이 완료되었습니다.")


# height_cm, weight_kg가 매개변수(Parameter)

def calculate_bmi(height_cm, weight_kg):

    """BMI를 계산하는 함수 정의"""

    bmi = weight_kg / (height_cm / 100) ** 2

    return bmi


인수(Argument) - 함수 호출 시 사용

인수는 함수를 호출할 때 매개변수에 

실제로 전달하는 값입니다


# "김환자", 45, "내과"는 인수(Argument)

register_patient("김환자", 45, "내과")



반환값(return)

return은 함수에서 계산된 결과값을 호출한 곳으로 돌려주거나, 

함수의 실행을 중단시키는 역할을 합니다.

return은 반환받은 값을 다른 코드에 사용해야

 할때 사용합니다.


1. 값 반환 - 함수 결과를 돌려주기


def calculate_bmi(height_cm, weight_kg):

    """BMI를 계산하여 반환합니다"""

    bmi = weight_kg / (height_cm / 100) ** 2

    return bmi


def classify_bmi_status(bmi):

    """BMI 값을 받아서 상태를 분류합니다"""

    if bmi < 18.5:

        return "저체중"

    elif bmi < 25:

        return "정상체중"

    elif bmi < 30:

        return "과체중"

    else:

        return "비만"



# return 값을 다른 함수에 활용

patient_bmi = calculate_bmi(170, 70)  # BMI 계산

bmi_status = classify_bmi_status(patient_bmi)  # 계산된 BMI로 상태 분류

print(f"BMI:{patient_bmi},status:{bmi_status}")


2. 함수 종료 - 실행 중단하기


def check_adult_patient(age):

    """환자가 성인인지 확인합니다"""

    if age < 0:

        print("잘못된 나이 정보입니다.")

        return  # 여기서 함수 종료 (값 반환 없음)


    if age < 18:

        print("미성년자입니다. 보호자 동반이 필요합니다.")

        return  # 여기서 함수 종료 (값 반환 없음)


    print("성인 환자입니다.")

    print("진료를 진행하겠습니다.")


check_adult_patient(-1)

잘못된 나이 정보입니다.


check_adult_patient(16)

미성년자입니다. 보호자 동반이 필요합니다.


check_adult_patient(25)

성인 환자입니다.

진료를 진행하겠습니다.


문제 3. 조건별 반환값 - 혈압 등급 분류


환자의 혈압을 입력받아 혈압 등급을 반환하는 함수를 작성하세요.


혈압 분류 기준


정상: 수축기 < 120

고혈압 전단계: 120 ≤ 수축기 < 140

1기 고혈압: 140 ≤ 수축기 < 160

2기 고혈압: 수축기 ≥ 160


여러개의 값 반환

함수에서 여러개의 값을 반환할때는 하나의 튜플로 묶여 반환됩니다.


# 환자 데이터베이스

patient_database = [

    {"id": "P001", "name": "김환자", "temperature": 36.5, "pulse": 72, "systolic_bp": 120},

    {"id": "P002", "name": "이환자", "temperature": 38.2, "pulse": 85, "systolic_bp": 140},

    {"id": "P003", "name": "박환자", "temperature": 37.8, "pulse": 95, "systolic_bp": 160}

]


def get_vital_signs(patient_id):

    """환자 ID로 데이터베이스에서 바이탈 사인을 조회합니다"""

    for patient in patient_database:

        if patient["id"] == patient_id:

            return patient["temperature"], patient["pulse"], patient["systolic_bp"] # 튜플로 반환

    return None, None, None  # 환자를 찾지 못한 경우


# 바이탈 사인 조회

temp, pulse, bp = get_vital_signs("P002")

print(f"체온: {temp}°C, 맥박: {pulse}bpm, 혈압: {bp}mmHg")


체온: 38.2°C, 맥박: 85bpm, 혈압: 140mmHg


 Default Parameter - 기본값 설정

함수 호출 시 인수를 생략했을 때 

자동으로 사용될 값을 미리 설정하는 방식입니다.

이는 함수 사용의 편의성을 높이고 

코드 유연성을 향상시킵니다.


def schedule_appointment(patient_name, doctor="담당의 미정", time="시간 미정", room="진료실 미정"):

    """환자의 진료 예약을 등록하고 정보를 출력합니다 (기본값 제공)"""

    print(f"{patient_name} 환자")

    print(f"담당의: {doctor}")

    print(f"진료 시간: {time}")

    print(f"진료실: {room}")


# 다양한 호출 방법 가능

schedule_appointment("김환자")


김환자 환자

담당의: 담당의 미정

진료 시간: 시간 미정

진료실: 진료실 미정



schedule_appointment("최환자", "정외과", "15:30", "205호")


최환자 환자

담당의: 정외과

진료 시간: 15:30

진료실: 205호


 Keyword Arguments - 이름(키워드)으로 전달

키워드 인수는 매개변수 이름을 지정하여 순서에 상관없이 인수를 전달하는 방법입니다.

함수 호출의 가독성을 높이고 매개변수가 많은 함수를 안전하게 사용할 수 있게 합니다.



def create_prescription(patient_name, medicine, dosage, frequency):

    """환자의 처방전을 생성하고 정보를 출력합니다"""

    print(f"처방전 - 환자: {patient_name}")

    print(f"약물: {medicine}")

    print(f"용량: {dosage}")

    print(f"복용 횟수: {frequency}")


# 순서 상관없이 호출 가능

create_prescription(

    frequency="1일 3회",

    patient_name="김환자",

    dosage="500mg",

    medicine="아스피린"

)


처방전 - 환자: 김환자

약물: 아스피린

용량: 500mg

복용 횟수: 1일 3회


# 일부는 위치, 일부는 키워드로

# 주의: 키워드 인수 사용 시작 후부터는 모든 인수를 키워드로 명시해야 함

create_prescription("이환자", "타이레놀", dosage="250mg", frequency="1일 2회")


처방전 - 환자: 이환자

약물: 타이레놀

용량: 250mg

복용 횟수: 1일 2회


def create_prescription(patient_name, medicine, dosage="적정량", frequency="1일 3회", duration="7일"):

# 여기에 함수를 작성하세요

    # 코드 작성

    prescription = f"""


처방전

================

환자명: {patient_name}

약물명: {medicine}

용량: {dosage}

복용법: {frequency}

처방 기간: {duration}

================

    """

    return prescription.strip()


# 테스트 함수 실행 (다양한 방식으로 호출)

result1 = create_prescription("김환자", "아스피린")

print(result1)


print("\n" + "="*30 + "\n")


result2 = create_prescription("이환자", "타이레놀", dosage="500mg", duration="5일")

print(result2)


처방전

================

환자명: 김환자

약물명: 아스피린

용량: 적정량

복용법: 1일 3회

처방 기간: 7일

================


==============================


처방전

================

환자명: 이환자

약물명: 타이레놀

용량: 500mg

복용법: 1일 3회

처방 기간: 5일

================



단일 책임 원칙 (하나의 기능만)

하나의 함수는 하나의 일만 해야 합니다.


의미 있는 함수명

함수명만 봐도 무엇을 하는지 알 수 있어야 합니다.


 타입 힌팅 (Type Hints)

함수의 입력과 출력 타입을 명시하여 코드의 가독성과 안정성을 높이는 방법입니다.


복합 타입 힌팅

# 리스트 타입

def calculate_average_temperature(temperatures: list[float]) -> float:

    """체온 리스트의 평균을 계산합니다"""

    return sum(temperatures) / len(temperatures)


# 딕셔너리 타입

def create_patient_record(name: str, age: int) -> dict[str, any]:

    """환자 기록을 생성합니다"""

    return {

        "name": name,

        "age": age,

        "registration_date": "2024-01-01"

    }


# 튜플 타입 (여러 값 반환)

def get_vital_signs(patient_id: str) -> tuple[float, int, float]:

    """환자의 바이탈 사인을 조회합니다 (체온, 맥박, 혈압)"""

    return 36.5, 72, 120.0


# Union 타입 (None일 수도 있는 값) - Python 3.10+

def find_patient_by_id(patient_id: str) -> dict[str, any] | None:

    """환자 ID로 환자를 검색합니다 (없으면 None 반환)"""

    # 검색 로직

    if patient_id == "P001":

        return {"name": "김환자", "age": 45}

    return None  # 환자를 찾지 못한 경우



댓글

이 블로그의 인기 게시물

베이스 캠프에서 (1)

베이스 캠프에서 (2)

Database 분석 (4)