본문 바로가기
Python 과 머신러닝/I. 기초 문법

Python 기초 5장. 함수 (1)

by JoyfulS 2019. 9. 30.

< 공부한 내용 >

1. 내장함수와 사용자 정의 함수

2. 함수의 가변인수

3. 람다 함수와 Scope

 

1. 내장함수와 사용자 정의 함수

'''
함수(function) 특징
- 기능을 정의하는 용도
- 유형 : 내장함수, 사용자 정의 함수

1. 내장함수 : built-in, import
- built-in 함수 : 바로 사용 가능 함수
- import 함수 : 해당 module import 해야한다.

2. 사용자 정의 함수
def 함수명(인수) :
실행문
실행문
return
'''

# 1. 내장함수

# (1) built-in 함수
dataset = list(range(1,6))
print(dataset) # [1, 2, 3, 4, 5]

print(len(dataset)) # 5
print(sum(dataset)) # 15
print(max(dataset)) # 5
print(min(dataset)) # 1

# print(mean(dataset)) # NameError

# (2) import 함수
import statistics # 방법1) 수학/통계 관련 함수 제공 모듈
from statistics import mean, variance, stdev # 방법2)

# 모듈의 멤버 확인
print(dir(statistics))
# Ctrl 키 누르고 모듈명 누르면 어떤 함수 가지고 있는지 설명 나옴

print(statistics.mean(dataset)) # 방법1) 3
print(mean(dataset)) # 방법2) 3
print(variance(dataset)) # 2.5
print(stdev(dataset)) # 1.5811388300841898


# 2. 사용자 정의 함수

# 1) 인수(매개변수)가 없는 함수
def userFun1() :
     print("userFun1")

userFun1()

# 2) 인수가 있는 함수
def userFun2(name) :
     print("hello, ", name)

userFun2("홍길동") # hello, 홍길동

# 3) return 있는 함수
def userFun3(x, y) :
     add = x + y
     return add    # 반환 값

userFun3(10, 20) # 30
userFun3("대한민국", "우리나라") # '대한민국우리나라'

# example
def calc(x, y) :
     add = x + y
     sub = x - y
     mul = x * y
     div = x / y
     return add, sub, mul, div  # 파이썬은 여러 개의 return 값 가질 수 있음(R은 하나만)
x = int(input())    # 100
y = int(input())    # 50
a, s, m, d = calc(x, y)    # return 갑 순서대로 받을 수 있음
print('add=',a) 
print('sub=',s)
print('mul=',m)
print('div=',d)
'''
add= 150
sub= 50
mul= 5000
div= 2.0
'''

# ) 키보드로 start(1), stop(10)을 입력받아서 start~stop까지 합을 구하는 함수 만들기
def data_sum(start, stop):
     sum = 0
     for i in range(start, stop+1) :
          sum += i    # start ~ stop 까지 누적
     return sum

# 키보드 입력
start = int(input("start > "))
stop = int(input("stop > "))

# 함수 호출
print(data_sum(start, stop))

'''
사용자 함수 활용하기
- 산포도 계산 함수
- 산포도 : 대표값(평균)을 중심으로 흩어진 정도
분산(variance), 표준편차(std)
분산 = sum((x-평균)**2) / n-1 (sample에 대한 분산)
표준편차 = sqrt(분산)
'''

from statistics import variance, stdev, mean    # 분산, 표준편차, 평균
from math import sqrt    # 제곱근

dataset = [5, 9, 1, 7, 4, 6]

var = variance(dataset)
std = stdev(dataset)
print('분산=', var)
print('표준편차=', std)
'''
분산= 7.466666666666667
표준편차= 2.7325202042558927
'''

# 분산 = sum((x-평균)**2) / n-1 (sample에 대한 분산)

def var_std(dataset) :
     avg = mean(dataset) # 평균
     diff = [(i-avg)**2 for i in dataset]
     var = sum(diff) / (len(dataset)-1)
     std = sqrt(var)
     return var, std

v, s = var_std(dataset)
print('분산=', v)
print('표준편차=', s)
'''
분산= 7.466666666666666
표준편차= 2.7325202042558927
'''

2. 함수의 가변인수

'''
함수의 가변인수(매개변수)
형식1) def 함수명(*가변인수)
- 여러 개의 실인수를 받을 수 있는 인수
- type : tuple
형식2) def 함수명(**가변인수)
- 여러 개의 실인수를 받을 수 있는 인수
- type : dict
'''

# 1. 가변인수 형식1
def Func1(name, *names) :
     print(name)              # 홍길동
     print(names)            # ('유관순', '이순신')
     print(type(names))    # <class 'tuple'>

Func1("홍길동", "유관순", "이순신")

# 통계량을 구하는 함수
def statis(func, *data) :
     from statistics import mean, stdev   # 함수 안에  import 해놔야 실행할때마다 문제 없음

     if func == "SUM" :
          print(sum(data))
     elif func == "AVG" :
          print(mean(data))
     elif func == "STD" :
          print(stdev(data))
     else :
          print("처리 불가!!")

statis("SUM",1,2,3,4,5) # 15
statis("AVG",1,2,3,4,5) # 3
statis("STD",1,2,3,4,5) # 1.5811388300841898
statis("VAR",1,2,3,4,5) # 처리 불가!!

# 2. 가변인수 형식2
def person(w, h, **other) :
     print('몸무게 :', w)
     print(' :', h)
     print('기타 :', other) # dict
     print(type(other)) # <class 'dict'>

person(65, 175, name="홍길동", addr ="서울시")
'''
몸무게 : 65
: 175
기타 : {'name': '홍길동', 'addr': '서울시'}
'''
config = {
'user' : 'scott',
'password' : 'tiger',
'host' : 'localhost',
'port' : '8080'
}
def connect() :
     pass
conn = connect(**config)

 

 

3. 람다 함수와 Scope

'''
1. 람다(Lambda)
- 인라인 함수
- 한 줄 함수를 의미
- 정의와 호출 동시에 가능
형식) lambda 인수 : 실행문(반환값)(실인수)

2. scope : 변수 사용 범위
전역변수(global), 지역변수(local) : 함수
'''

# 1. 람다(Lambda)

# 1) 일반 함수
def Adder(x, y) :
     return x + y

print(Adder(10, 20)) # 30

# 2) 람다 함수
(lambda x, y : x + y)(10, 20)    # 정의와 호출 동시

# 정의와 호출 별도
Adder = lambda x, y : x + y
print(Adder(10, 20)) # 30

# 매개변수에 초기화 가능
Calc = lambda dan, su=5 : dan * su
print(Calc(5000)) # 25000

print(Calc(5000, 10)) # 50000

# 2. scope
# 전역변수(global), 지역변수(local) : 함수

x = 50 # 전역변수

def local_func(x) :
     x += 50 # x = 100 -> 지역변수
     # end -> 지역변수 소멸

local_func(x) # x = 50
print('x=', x) # x= 50

# 함수 내에서 전역변수 사용
def global_func() :
     global x # 전역변수
     x += 50

global_func()
print('x=', x) # x= 100

# 전역변수
data = [1,3,5,7,9]
tot = 0

# for 블럭에서 전역변수 사용 가능
for d in data :
     tot += d

def tot_calc(data) :
     for d in data :
          global tot  # 전역변수 선언
          tot += d    # tot = tot(0) + d(1)
     return tot

print(tot_calc(data))
print('tot=', tot)   # tot= 25

-------------------------------------------------- example --------------------------------------------------


exam01_1.py
0.00MB
exam01_2.py
0.00MB
exam02_1.py
0.00MB
exam02_2.py
0.00MB
exam02_3.py
0.00MB

댓글