사용자정의함수

2023. 3. 6. 09:02Python/실전 예제로 배우는 파이썬 프로그래밍

사용자가 직접 함수 내에 필요한 코드를 작성해 놓고, 외부의 값을 인수로 받아서 처리한 후 처리 결과를 반환하는 파이썬의 사용자정의함수의 형식은 다음과 같습니다.

 

형식

def 함수명(매개변수) :
         실행문
         실행문
         return 값

사용자정의함수는 일련의 실행문이 반복될 경우 이를 함수로 정의해 놓고, 필요시 함수 호출을 통해서 실행이 가능합니다.

 

실습 사용자정의함수 예시

# (1) 인수가 없는 함수
def userFunc1() :
	print('인수가 없는 함수')
    print('userFunc1')

userFunc1()	# 함수 호출

인수가 없는 함수
userFunc1

# (2) 인수가 있는 함수
def userFunc2(x, y) :
	print('userFunc2')
    z = x + y
    print('z=', z)

userFunc2(10, 20)	# 함수 호출

userFunc2
z= 30

# (3) return 있는 함수
def userFunc3(x, y) :
	print('userFunc3')
    tot = x + y
    sub = x - y
    mul = x * y
    div = x / y
    
    return tot, sub, mul, div

# 실인수 : 키보드 입력
x = int(input('x 입력 : '))
y = int(input('y 입력 : '))

x 입력 : 10
y 입력 : 20

t, s, m, d = userFunc3(x, y)
print('tot =', t)
print('sub =', s)
print('mul =', m)
print('div =', d)

userFunc3
tot = 30
sub = -10
mul = 200
div = 0.5

# (1) 인수가 없는 함수

userFunc1() 함수는 괄호 안에 매개변수가 없기에 함수를 호출할 경우 인수 없이 빈괄호 'userFunc1()' 형식으로 호출합니다.

 

# (2) 인수가 있는 함수

userFunc2(x, y) 함수는 괄호 안에 매개변수가 2개 있기에 함수를 호출할 경우 2개의 실인수를 이용하여 'userFunc2(10, 20)' 형식으로 호출합니다.

 

# (3) return 있는 함수

외부에서 두 개의 인수를 받아서 4개의 실행문으로 사칙연산을 수행하고, 계산결과를 return 명령문으로 반환하는 함수입니다.

 

산포도 구하기

산포도란 평균으로부터 얼마나 값이 분산되어 있는지의 정도를 나타내는 척도로 분산과 표준편차를 사용합니다. 자료 분석(Data Analysis)을 위한 기술통계량에서 자료의 특성을 파악하는데 중요한 역할을 합니다.

 

실습 분산과 표준편차 함수 예시

from statistics import mean, variance
from math import sqrt

dataset = [2, 4, 5, 6, 1, 8]

# (1) 산술평균
def Avg(data) :
    avg = mean(data)
    return avg

print('산술평균 =', Avg(dataset))

산술평균 = 4.333333333333333

# (2) 분산/표준편차
def var_sd(data) :
    avg = Avg(data) # 함수 호출

    # list 내포
    diff = [ (d - avg)**2 for d in data]

    var = sum(diff) / (len(data) - 1)
    sd = sqrt(var)

    return var, sd

# (3) 함수 호출
v, s = var_sd(dataset)
print('분산 =', v)
print('표준편차=', s)

분산 = 6.666666666666666
표준편차= 2.581988897471611

# (1) 산술평균

Avg() 함수는 6개의 원소를 갖는 dataset 변수의 평균을 계산하는 함수입니다. 함수의 반환 값은 표본의 분산식에서 산술평균으로 사용됩니다. mean() 함수는 statistics 모듈에서 제공되는 함수입니다.

 

# (2) 분산/표준편차

var_sd() 함수는 Avg() 함수를 호출하여 산술평균을 반환받고, 리스트 내포 명령문에 의해서 각 변량과 산술평균을 1:1로 차를 계산하여 diff 변수에 할당합니다.

 

# (3) 함수 호출

dataset 변수를 인수로 함수를 호출하면 분산(var)과 표준편차(sd)가 반환됩니다.

 

피타고라스 정리

직각삼각형에 관한 피타고라스 정리(Pythagorean theorem)는 직각삼각형의 세 변의 길이에서 a**2 + b**2 = c**2 관계가 성립한다는 이론입니다.

피타고라스 정리

실습 피타고라스 정의 함수 예시

# 피타고라스 정리
def pytha(s, t) :
	a = s**2 - t**2
    b = 2 * s * t
    c = s**2 + t**2
    print("3변의 길이 : ", a, b, c)

pytha(2, 1)	# s, t의 인수는 양의 정수를 갖는다.

3변의 길이 :  3 4 5

※ 피타고라스 정의 함수 예시

피타고라스의 식[(빗변)의 제곱 = (밑변)의 제곱 + (높이)의 제곱]에 함수의 결과(a, b, c)를 적용하면 32 + 42 = 52와 같습니다.

 

몬테카를로 시뮬레이션

현실적으로 불가능한 문제의 해답을 얻기 위해서 난수의 확률분포를 이용하여 모의실험으로 근사적 해를 구하는 기법을 의미합니다. 예를 들면 동전을 1,000번 던져서 앞면이 나올 확률이나 뒷면이 나올 확률을 구하기 위해서 실제 동전을 1,000번 던질 수 없습니다. 이 문제를 해결하기 위해 컴퓨터와 같은 도구를 이용한 가상 모의실험을 몬테카를로 시뮬레이션(Monte-carlo simulation)이라고 합니다.

 

실습 몬테카를로 시뮬레이션 함수 예시

# 단계 1 : 동전 앞면과 뒷면의 난수 확률분포 함수 정의
import random
def coin(n) :
    result = []
    for i in range(n) :
        r = random.randint(0, 1)
        if (r == 1) :
            result.append(1)	# 앞면
        else :
            result.append(0)	# 뒷면
    return result

print(coin(10))

[1, 0, 1, 1, 1, 0, 1, 1, 1, 0]

# 단계 2 : 몬테카를로 시뮬레이션 함수 정의
def montaCoin(n) :
    cnt = 0
    for i in range(n) :
        cnt += coin(1)[0]   # coin 함수 호출
    
    result = cnt / n    # 누적 결과를 시행 횟수(n)로 나눈다.
    return result

# 단계 3 : 몬테카를로 시뮬레이션 함수 호출
print(montaCoin(10))
print(montaCoin(30))
print(montaCoin(100))
print(montaCoin(1000))
print(montaCoin(10000))

0.4
0.5333333333333333
0.5
0.495
0.5095

# 단계 1 : 동전 앞면과 뒷면의 난수 확률분포 함수 정의

randint 클래스에 의해서 생성된 난수 정수 0 또는 1을 대상으로 1이면 동전의 앞면, 0이면 동전의 뒷면으로 가정하여 시행 횟수 n만큼 반복하여 난수의 확률분포를 result 변수에 추가합니다.

 

# 단계 2 : 몬테카를로 시뮬레이션 함수 정의

시행횟수 n만큼 coin 함수를 1회 호출하여 반환된 값을 cnt 변수에 누적하고, 누적 결과를 시행 횟수 n으로 나누어서 result 변수에 할당하고, 이를 반환하는 함수입니다.

 

# 단계 3 : 몬테카를로 시뮬레이션 함수 호출

동전을 던진 경우 나올 수 있는 기대 확률은 앞면과 뒷면 각각 0.5(1/2)에 해당됩니다. 시행 횟수(표본 수)가 무한이 클수록 동전의 앞면과 뒷면이 나올 기대확률(0.5)에 근사적 해가 구해지는 것을 몬테카를로 시뮬레이션 함수를 통해서 확인할 수 있습니다.

 

※ 중심극한정리(The Central Limit Theorem)

표본의 크기가 커질 수록 근사적으로 표본의 평균이 모평균과 같고, 분산이 모분산과 같은 정규분포를 취한다는 이론입니다.

'Python > 실전 예제로 배우는 파이썬 프로그래밍' 카테고리의 다른 글

중첩함수  (0) 2023.03.08
특수함수  (0) 2023.03.07
내장함수  (0) 2023.03.05
여러 모양의 자료 만들기 연습문제  (0) 2023.03.04
자료구조 복제 및 알고리즘(algorithm)  (0) 2023.03.03