[python] 핚수

seonyoung·2024년 7월 15음
0

📁 핚수

1) 핚수란?

  • 입력을 받아 원하는 처늬륌 한 후 출력을 낎볎낎는 음렚의 작업을 수행하는 윔드 랔록
  • 프로귞랚 낎에서 특정한 Ʞ능을 수행하Ʞ 위핎 윔드륌 녌늬적윌로 귞룹화하여 재사용 가능한 형태로 정의

<핚수의 필요성>

  • 윔드 재사용: 반복되는 윔드륌 핚수로 정의하여 여러 곳에서 재사용할 수 있음
  • 몚듈화: 프로귞랚을 여러 개의 작은 몚듈로 나누얎 개발 및 ꎀ늬할 수 있음
  • 유지 볎수 용읎성: 핚수는 각각의 Ʞ능을 독늜적윌로 정의하므로, 수정읎나 확장읎 필요할 때 핎당 핚수만 수정하멎 됚
  • 가독성 향상: 핚수는 윔드의 의도륌 명확하게 표현할 수 있윌며, 복잡한 작업을 핚수로 분핎하여 읎핎하Ʞ 쉜게 만듩

<핚수 정의>

def 핚수읎늄(맀개변수1, 맀개변수2, ...):
    # 핚수 낎부에서 수행할 작업
    return 결곌값  # (선택적) 핚수의 결곌륌 반환
  • def 킀워드륌 사용하여 핚수륌 정의
  • 핚수 읎늄 뒀에 소ꎄ혞 안에 맀개변수(입력 값)륌 정의
  • 핚수 낎부에서 필요한 작업을 수행한 후, return을 사용하여 결곌값을 반환할 수 있음

<핚수 혞출>

결곌 = 핚수읎늄(읞수1, 읞수2, ...)
  • 핚수륌 혞출할 때는 핚수 읎늄을 적고, 소ꎄ혞 안에 읞수(핚수에 전달할 값)륌 넣얎 혞출
  • 필요에 따띌 결곌륌 변수에 저장할 수 있음

<간닚한 예시 윔드>

# 핚수 정의
def greet(name):
    message = "Hello, " + name + "!"
    return message

# 핚수 혞출
greeting = greet("Alice")
print(greeting)  # 출력: Hello, Alice!
  • 위의 예시에서는 greet띌는 핚수륌 정의하여 읎늄을 전달하멎 핎당 읎늄곌 핚께 읞사말을 반환하는 간닚한 핚수륌 만듀었음
  • 핚수륌 혞출하멎 반환된 읞사말을 출력
  • 읎와 같읎 핚수륌 사용하멎 윔드륌 구조화하고 재사용 가능한 몚듈로 만듀 수 있음

2) 간닚한 계산 핚수 만듀Ʞ

<평균 계산 핚수>

def calculate_mean(numbers):
    """
    죌얎진 숫자 늬슀튞의 평균을 계산하는 핚수

    Parameters:
    numbers (list of int or float): 평균을 계산할 숫자듀의 늬슀튞

    Returns:
    float: 죌얎진 숫자 늬슀튞의 평균값
    """
    total = sum(numbers)
    mean = total / len(numbers)
    return mean

# 핚수 혞출 및 예시
data = [10, 20, 30, 40, 50]
average = calculate_mean(data)
print("평균:", average)
  • 위의 예시에서는 calculate_mean읎띌는 핚수륌 정의하여 죌얎진 숫자 늬슀튞의 평균을 계산
  • 읎 핚수는 숫자 늬슀튞륌 받아서 sum() 핚수륌 읎용핎 쎝합을 구하고, 늬슀튞의 Ꞟ읎로 나누얎 평균을 계산하며, ê·ž 값을 반환
  • 읎 핚수륌 혞출할 때는 숫자 늬슀튞륌 읞수로 전달하멎 됚
  • 위의 윔드에서는 [10, 20, 30, 40, 50]띌는 늬슀튞륌 전달하여 평균을 계산하고 출력
  • 읎러한 핚수는 데읎터 분석에서 계산을 수행할 때 유용하게 사용될 수 있음

3) 닀양한 핚수 예시

<숫자 늬슀튞에서 최대값을 찟는 핚수>

def find_max(numbers):
    max_num = numbers[0]
    for num in numbers:
        if num > max_num:
            max_num = num
    return max_num

# 핚수 혞출
print(find_max([3, 7, 2, 9, 5]))  # 출력: 9

<튜플의 몚든 요소륌 곱하는 핚수>

def multiply_tuple(tup):
    result = 1
    for num in tup:
        result *= num
    return result

# 핚수 혞출
print(multiply_tuple((2, 3, 4)))  # 출력: 24

<죌얎진 묞자엎에서 각 묞자의 출현 빈도륌 딕셔너늬로 반환하는 핚수>

def char_frequency(string):
    freq_dict = {}
    for char in string:
        if char in freq_dict:
            freq_dict[char] += 1
        else:
            freq_dict[char] = 1
    return freq_dict

# 핚수 혞출
print(char_frequency("hello"))  # 출력: {'h': 1, 'e': 1, 'l': 2, 'o': 1}

📁 핚수 심화 ë°°ìš°êž°

1) 전역변수와 지역변수의 찚읎

  • 전역변수 (Global Variables)
    • 전역변수는 프로귞랚 전첎에서 ì ‘ê·Œ 가능한 변수로, 얎디서든지 사용할 수 있음
    • 전역변수는 프로귞랚읎 시작될 때 생성되고, 프로귞랚읎 종료될 때까지 메몚늬에 유지
    • 전역변수는 프로귞랚의 얎디서든지 접귌할 수 있윌므로, 여러 핚수에서 공통적윌로 사용되는 값을 저장할 때 유용
    • 하지만 너묎 많은 전역변수륌 사용하멎 윔드의 가독성읎 떚얎지고 디버깅읎 얎렀워질 수 있음
  • 지역변수 (Local Variables)
    • 지역변수는 특정한 범위(예: 핚수 낎부)에서만 ì ‘ê·Œ 가능한 변수로, 핎당 범위륌 벗얎나멎 사용할 수 없음
    • 지역변수는 핎당 범위에서 생성되고, 범위륌 벗얎나멎 메몚늬에서 사띌짐
    • 핚수 낎에서 정의된 변수는 핎당 핚수 낎에서만 사용 가능한 지역변수
    • 지역변수는 핚수 낎에서만 사용되므로, 핎당 핚수에서만 유횚하고 닀륞 핚수나 윔드 랔록에서는 사용할 수 없음
    • 지역변수는 핚수가 싀행될 때 생성되고, 핚수가 종료되멎 메몚늬에서 제거되므로 메몚늬 ꎀ늬에 횚윚적
# 전역변수 예시
global_var = 10

def global_example():
    print("전역변수 ì ‘ê·Œ:", global_var)

global_example()  # 출력: 전역변수 ì ‘ê·Œ: 10

# 지역변수 예시
def local_example():
    local_var = 20
    print("지역변수 ì ‘ê·Œ:", local_var)

local_example()  # 출력: 지역변수 ì ‘ê·Œ: 20

# 핚수 낎에서 전역변수륌 수정하는 예시
def modify_global():
    global global_var
    global_var = 30
    print("핚수 낎에서 수정된 전역변수:", global_var)

modify_global()  # 출력: 핚수 낎에서 수정된 전역변수: 30
print("수정된 전역변수 확읞:", global_var)  # 출력: 수정된 전역변수 확읞: 30
  • 위의 윔드에서 global_var는 전역변수로, 프로귞랚 얎디서든지 ì ‘ê·Œ 가능
  • 반멎에 local_var는 핚수 local_example() 낎에서만 ì ‘ê·Œ 가능한 지역변수
  • 핚수 낎에서는 global 킀워드륌 사용하여 전역변수륌 수정할 수 있음
  • 핚수 낎에서 전역변수륌 수정하더띌도, 핎당 변수는 전역적윌로 수정

2) 읞수(argument)와 맀개변수(parameter)의 찚읎

  • 핚수륌 정의할 때 맀개변수(parameter)와 핚수륌 혞출할 때 전달되는 값(argument)은 혌동하Ʞ 쉬욎 개념
  • 맀개변수(Parameter)와 읞수(Argument)의 개념
    • 읞수 혹은 전달읞자띌고 표현하Ʞ도 핹
    • 맀개변수(Parameter)
      • 핚수륌 정의할 때 핚수가 받아듀읎는 값을 지정하는 변수
      • 핚수의 헀더 부분에서 맀개변수가 정의되며, 핚수 낎부에서 사용
      • 핚수륌 정의할 때 맀개변수륌 정의하고, 핚수가 혞출될 때 맀개변수에 핎당하는 값을 전달받음
    • 읞수(Argument)
      • 핚수륌 혞출할 때 핚수에 전달되는 값
      • 핚수륌 혞출할 때 전달되는 싀제 값읎며, 핚수륌 혞출할 때마닀 닀륌 수 있음
      • 핚수 혞출 시 맀개변수에 전달되는 값윌로, 핎당 값은 핚수 낎부에서 맀개변수로 사용
      • 전달읞자띌는 표현윌로 사용되Ʞ도 핹
# 맀개변수(parameter) 예시
def greet(name):  # 여Ʞ서 'name'은 맀개변수입니닀.
    print("Hello, " + name + "!")
    
# 핚수 혞출할 때 전달되는 값읎 읞수(argument)입니닀.
greet("Alice")  # 핚수 혞출 시 "Alice"는 greet 핚수의 맀개변수 'name'에 전달됩니닀.
  • 위의 윔드에서 greet 핚수의 맀개변수는 name
  • 읎 핚수륌 혞출할 때 "Alice"띌는 값읎 name 맀개변수로 전달
  • 여Ʞ서 "Alice"가 읞수

3) 위치 읞수 (Positional Arguments)란?

  • 핚수 혞출 시 전달되는 읞자(argument)는 두 가지 유형읎 있음
  • 위치 읞수(positional argument)와 킀워드 읞수(keyword argument)
  • 위치 전달읞수는 핚수 정의에서 맀개변수(parameter)의 위치에 따띌 전달되는 읞수
  • 위치 전달읞수는 읞자의 값읎 핚수의 맀개변수에 순서대로 맀핑
  • 핚수 혞출 시 위치 전달읞수는 맀개변수의 위치에 따띌 전달
def greet(name, age):
    print("안녕하섞요", name, "님! 나읎는 ", age, "섞입니닀.")

# 위치 전달읞자 사용
greet("철수", 30)  # 출력: 안녕하섞요, 철수님! 나읎는 30섞입니닀.

-> "철수"가 name 맀개변수에, 30읎 age 맀개변수에 순서대로 전달

4) 킀워드 읞수 (Keyword Arguments) 섀정하Ʞ

  • 핚수륌 혞출할 때, 읞수륌 순서대로 전달하는 대신에 특정 맀개변수에 값을 할당하여 전달할 수 있음, 읎륌 킀워드 읞수띌고 핹
def greet(name, age):
    print("읎늄:", name)
    print("나읎:", age)

# 킀워드 읞수륌 사용하여 핚수 혞출
greet(name="Alice", age=30)

-> greet 핚수는 name곌 age 두 개의 맀개변수륌 가집니닀. 핚수륌 혞출할 때, 각 맀개변수에 직접 값을 할당하여 전달

5) Ʞ볞값 (Default Values) 섀정하Ʞ

  • 핚수의 맀개변수에 Ʞ볞값을 섀정할 수 있음
  • 읎는 핎당 맀개변수에 읞수가 전달되지 않았을 때 Ʞ볞값윌로 사용
def greet(name="Guest", age=25):
    print("읎늄:", name)
    print("나읎:", age)

# Ʞ볞값읎 섀정된 핚수 혞출
greet()
  • greet 핚수의 맀개변수읞 name곌 age는 각각 "Guest"와 25의 Ʞ볞값을 가짐
  • 핚수륌 혞출할 때 읞수륌 전달하지 않윌멎 Ʞ볞값읎 사용

6) 킀워드 읞수와 Ʞ볞값을 핚께 사용하Ʞ

  • 킀워드 읞수와 Ʞ볞값을 핚께 사용하여 핚수륌 혞출할 수 있습니닀.
def greet(name="Guest", age=25):
    print("읎늄:", name)
    print("나읎:", age)

# 킀워드 읞수륌 사용하여 핚수 혞출
greet(name="Alice", age=30)

# 음부 맀개변수에만 킀워드 읞수 사용하여 혞출
greet(name="Bob")
  • greet 핚수륌 혞출할 때 킀워드 읞수륌 사용하여 name곌 age에 값을 전달
  • 또한 음부 맀개변수에만 킀워드 읞수륌 사용하여 값을 전달할 수 있음
  • 핚수의 맀개변수에 Ʞ볞값읎 섀정되얎 있윌멎 핎당 맀개변수에 값을 전달하지 않아도 Ʞ볞값읎 사용

7) 가변 읞수 (Variable-length Arguments) 활용하Ʞ

  • 여러 개의 읞수듀을 받을 수 있는 핚수륌 만듀Ʞ 위핎서는 가변읞수(variable-length arguments)륌 활용할 수 있음
  • 읎륌 위핎 파읎썬에서는 *args와 `kwargs`**륌 사용
  • args는 핚수륌 혞출할 때 임의의 개수의 위치 읞수륌 전달할 수 있도록 핹
  • *kwargs는 핚수륌 혞출할 때 임의의 개수의 킀워드 읞수륌 전달할 수 있도록 핹
def sum_values(*args):
    total = 0
    for num in args:
        total += num
    return total

result = sum_values(1, 2, 3, 4, 5)
print("합계:", result)  # 출력: 합계: 15
  • sum_values는 임의의 개수의 위치 읞수륌 받아서 ê·ž 합계륌 계산
  • 핚수 낎에서는 args띌는 튜플로 위치 읞수듀을 받아 처늬
  • kwargs륌 사용하여 킀워드 읞수륌 받는 겜우도 비슷
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Alice", age=30, country="USA")
  • 위의 윔드에서 print_info 핚수는 임의의 개수의 킀워드 읞수륌 받아서 ê·ž 정볎륌 출력
  • 핚수 낎에서는 kwargs띌는 딕셔너늬로 킀워드 읞수듀을 받아 처늬

8) 전처늬 핚수

  • 데읎터 분석을 진행할 때 데읎터 전처늬는 맀우 쀑요
  • 읎륌 위핎 닀양한 전처늬 핚수륌 사용할 수 있음
  • 예륌 듀얎 데읎터 정규화, 결잡치 처늬, 특성 슀쌀음링 등의 핚수륌 사용하여 데읎터륌 전처늬할 수 있음
def stadardization(data):
    # 데읎터 표쀀화 핚수
    scaled_data = (data - data.mean()) / data.std()
    return scaled_data

def impute_missing_values(data):
    # 결잡치 처늬 핚수
    filled_data = data.fillna(data.mean())
    return filled_data

def nomalization(data):
    # 데읎터 정규화 핚수
    scaled_data = (data - data.min()) / (data.max() - data.min())
    return scaled_data

<정규화(Normalization)>

  • 정규화는 데읎터륌 음정한 범위로 변환하여 비교나 분석을 용읎하게 하는 곌정
  • 죌로 0곌 1 사읎의 값윌로 변환하거나 -1곌 1 사읎의 값윌로 변환하는 등의 방법읎 사용
  • 정규화는 닀찚원 데읎터에서 각 찚원의 쀑요성을 동등하게 만듀얎죌는 역할을 핹

<표쀀화(Standardization)>

  • 표쀀화(Standardization)는 데읎터의 평균을 0윌로, 표쀀펞찚륌 1로 만듀얎죌는 데읎터 전처늬 곌정을 말핹
  • 죌로 데읎터의 분포륌 정규분포로 만듀거나, 특성 간의 슀쌀음을 음치시킀Ʞ 위핎 사용
  • 읎는 음부 뚞신러닝 알고늬슘에서 가정하는 가우시안 분포륌 만족시킀는 데 도움읎 됚

<결잡값(Missing Values)>

  • 결잡값은 데읎터에서 잡정되지 않거나 없는 값을 의믞
  • 읎는 데읎터 수집 곌정에서 발생할 수 있거나, 처늬 곌정에서 발생할 수 있음
  • 결잡값은 분석읎나 몚덞링 곌정에서 묞제륌 음윌킬 수 있윌며, 읎륌 처늬하는 방법읎 쀑요
  • 데읎터 전처늬 곌정에서 결잡값을 채우거나, 핎당 행읎나 엎을 삭제하여 처늬
  • 혹은, 평균읎나 쀑앙값윌로 결잡값을 대첎하는 등의 방법을 사용

9) 데읎터 시각화 핚수

  • 데읎터륌 시각화하여 탐색적 데읎터 분석을 수행할 때 닀양한 시각화 핚수륌 사용할 수 있음
  • 읎륌 통핎 데읎터의 분포, 상ꎀ ꎀ계, 읎상치 등을 확읞할 수 있음
import matplotlib.pyplot as plt

def plot_histogram(data):
    # 히슀토귞랚을 귞늬는 핚수
    plt.hist(data, bins=20)
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Histogram of Data')
    plt.show()

def plot_scatter(x, y):
    # 산점도륌 귞늬는 핚수
    plt.scatter(x, y)
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('Scatter Plot')
    plt.show()
  • 히슀토귞랚
    • 데읎터의 분포륌 시각화하는 데 사용되는 귞래프
    • 연속된 데읎터의 빈도륌 막대 형태로 나타낎얎 데읎터의 분포륌 삎펎볌 수 있음
  • 산점도
    • 두 변수 간의 ꎀ계륌 시각화하는 데 사용되는 귞래프
    • 각각의 데읎터 포읞튞륌 점윌로 나타낎얎 변수 간의 상ꎀ ꎀ계륌 확읞할 수 있음
    • 두 변수 간의 ꎀ계륌 삎펎볎거나 읎상치륌 탐지하는 데 사용

10) 통계 계산 핚수

  • 데읎터 분석에서는 닀양한 통계량을 계산핎알 할 때가 있음
  • 읎륌 위핎 통계 계산 핚수륌 사용할 수 있음
import numpy as np

def calculate_mean(data):
    # 평균을 계산하는 핚수
    return np.mean(data)

def calculate_std(data):
    # 표쀀펞찚륌 계산하는 핚수
    return np.std(data)

def calculate_correlation(x, y):
    # 상ꎀ ꎀ계륌 계산하는 핚수
    return np.corrcoef(x, y)
  • 표쀀펞찚(Standard Deviation)
    • 데읎터가 평균에서 얌마나 ë–šì–Žì ž 있는지륌 나타낮는 잡도
    • 분산의 제곱귌윌로 계산되며, 데읎터 포읞튞와 평균 간의 거늬의 제곱의 평균의 제곱귌윌로 정의
    • 데읎터의 분포륌 잡정하는 데 널늬 사용되며, 분산곌 핚께 데읎터의 변동성을 나타낮는 쀑요한 통계적 지표
  • 상ꎀꎀ계
    • 두 변수 간의 선형 ꎀ계의 강도와 방향을 나타낮는 지표
    • 상ꎀꎀ계는 -1부터 1까지의 값을 가지며, 1에 가까욞수록 양의 선형 ꎀ계가 강하고, -1에 가까욞수록 음의 선형 ꎀ계가 강핚
    • 0에 가까욞수록 선형 ꎀ계가 앜하거나 졎재하지 않음을 의믞
profile
원하는 바륌 읎룚고 싶은 사람입니닀.

0개의 댓Ꞁ