■ 7장. 함수
- 7장. 목차
- 1.함수생성하는 방법
- 2.기본값 매개변수와 키워드 매개변수 (mit 코드 이해)
- 3.가변 매개변수 (mit 코드 이해)
- 4.매개 변수로 함수를 사용하는 경우
- 5.함수 밖의 변수, 함수 안의 변수
- 6.재귀함수 (mit 코드 이해)
- 7.중첩함수
■ 7.1. 함수 생성하는 방법
def 함수일므 (매개변수):
실행문
return 결과
예제: def my_abs(arg):
if (arg < 0 ) :
result = arg * -1
else:
result = arg
return result
print ( my_abs(-5) )
문제146. 아래와 같이 이름을 입력하새 함수를 실행하면
해당 사원의 부서위치가 출력되게하시오!
print( find_loc('SMITH') )
def find_loc(name)
for e in emp:
for d in dept:
if e['deptno'] == d['deptno'] :
if e['ename'] == name :
print( e['ename'].ljust(7),d['loc'])
find_loc('SMITH')
import pandas as pd
def find_loc(val):
emp= pd.read_csv("D:\data\emp.csv")
dept= pd.read_csv("D:\data\dept.csv")
result = pd.merge(emp,dept,on='deptno')
result2 = result[['loc']][result['ename']== val]
return result2
문제147. 미분계수를 구하는 함수를 생성하는데
함수 f(x) = 2x^2 +1 일때
def mibun_fun(n):
return 'x가 '+ str(n) +'에서의 기울기는 '+ str(round((2*(n + 0.00000001)
*(n + 0.00000001)+1 - (2* n*n+1) ) / 0.00000001)) + ' 입니다.'
print(mibun_fun(-2))
■ 매개변수로 함수를 받는 경우
def numerical_diff(f,x):
delta = 0.0001 # 1e-4로 해도된다
return ( f(x+delta) - f(x-delta) ) / (2*delta)
함수 f(x) 2x^2 + 1 생성
def function_1 (x) :
return 2*pow(x,2) +1
print( numerical_diff(function_1,-2) )
문제148. 함수 f(x) = x^2 -x +5 함수의 x가 -2일때 미분계수를 구하시오
■ 지난 주에 배웠던 내용 복습
- 함수
- 머신 러닝을 이해하기위한 Mit TTT 코드 구현
- 웹 스크롤링 ----> 빅데이터 수집
-
6장함수
for
while
continue
break
5장. 파이썬 자료형 3가지
- 리스트 []
- 튜플 ()
- 딕셔너리 {} (키와 값으로 구성된 자
- 어순 번역기
- nested loop join 구현
↓ data 양이 많아지면 느려진다.
- hash join 으로 구현 (해쉬 알고리즘) 오라클이 이걸로 다른rdb회사 눌러버림
- Pandas 모듈을 이용해서 데이터 검색
판다스 데이터 프레임 [ 열 ] [ 행 ]
↓ <---- 그룹함수 구현
판다스 데이터 프레임 [ 열 ] [ 행 ] .max()
.sum()
.min()
.mean()
↓
판다스 데이터 프레임.groupby([열])['기준컬럼(sal)'].max()
요번주 : 7장 함수, 8장. 모듈과 패키지 , 9장 .클래스 , 10장. 예외처리
11장. 파일에서 데이터 읽고 쓰기 ------> Tic Tac Toe 게임
1세대 인공지능: 1954년 캠브리지 대학에서 Tic Tac Toe 를 사람과 게임할 수 잇또록 구현
↓
체스가 구현
↓ ----> 신경망(딥러닝)
오목, 바둑 (2016년)
인공지능에서 무언가 혁신적인게 나온다면 그것은 바로 구글에서 나올것이다.
- 에릭 슈미스 (구글 사장 ㅋ)
■ 7장. 함수
- 7장. 목차
- 1.함수생성하는 방법
- 2.기본값 매개변수와 키워드 매개변수 (mit 코드 이해)
- 3.가변 매개변수 (mit 코드 이해)
- 4.매개 변수로 함수를 사용하는 경우
- 5.함수 밖의 변수, 함수 안의 변수
- 6.재귀함수 (mit 코드 이해)
- 7.중첩함수
■ 7.2. 기본값 매개변수와 키워드 매개변수 (p 145)
기본값 매개변수? 입력하지 않으면 기본으로 할당되는 매개변수
예 : log(4 , 2) , log(10)
↑ ↑ ↑
지수 밑수 지수 밑수는 자연상수e 가된다.
예제 :
def print_string(text,count = 1): # count = 1 디폴드 값을 지정
for i in range(count):
print(text)
print(print_string("안녕하세요") )
print(print_string("안녕하세요"),3 )
문제149. 아래와 같이 이름만 넣으면 소속팀과 직위가 출력되는 함수를 생성하시오
def print_string(name='장경원',team='머신러닝팀',position='팀장'):
print(name)
print(team)
print(position)
def print_string(name,team='머신러닝팀',position='팀장'):
print('이름 = {0}'.format(name) )
print('소속팀 = {0}'.format(team ) )
print('직위 = {0}'.format(position ) )
설명 : 문자열.format()
■ Mit TTT코드에서 기본값 매개변수 사용하는 부분
class Agent(object):
def __init__(self, player, verbose = False, lossval = 0, learning = True):
self.values = {}
self.player = player
self.verbose = verbose
self.lossval = lossval
self.learning = learning
self.epsilon = 0.1
self.alpha = 0.99
self.prevstate = None
self.prevscore = 0
self.count = 0
enumstates(emptystate(), 0, self)
■ 가변 매개변수 (p147)
문자열.format() 함수 처럼 매개변수의 수가 유동적인 함수를 만들고 싶을 때 사용하는 변수
함수 실행할때 매개변수를 10개 , 20개를 입력해도 제대로 동작을 한다.
예 :
def 함수이름(*매개변수):
코드 블럭
예제:
def merge_string(*text_list):
result = ''
for s in text_list:
result = result + s + ' '
return result
merge_string('아버지가','방에','들어가신다')
파이썬에서 * 가 쓰이는 경우
1.가변 매개 변수
2.리스트 변수내의 요소들을 뽑아낼ㄸ ㅐ--> mit 코드
문제150. mit TTT코드에서 보드판을 출력하는 printboard 함수를 분석하시오
(리스트 변수내의 요소를 ㅃ보아내는 문법이 나온다.
# States as integer : manual coding
EMPTY = 0
PLAYER_X = 1
PLAYER_O = 2
DRAW = 3 BOARD_FORMAT = """----------------------------
| {0} | {1} | {2} |
|--------------------------|
| {3} | {4} | {5} |
|--------------------------|
| {6} | {7} | {8} |
----------------------------"""
NAMES = [' ', 'X', 'O'] def printboard(state):
""" Print the board from the internal state."""
cells = []
for i in range(3):
for j in range(3):
cells.append(NAMES[state[i][j]].center(6))
print(BOARD_FORMAT.format(*cells))
printboard([[1,2,0],[0,0,0],[0,0,0]]) print(BOARD_FORMAT.format('a','b','c','d','e','f','g','h','g')) print(BOARD_FORMAT.format('x','o','x','o','x',' ',' ',' ',' ')) print(BOARD_FORMAT.format('x'.center(6),'o','x','o','x',' ',' ',' ',' '))
|
7.4.매개 변수로 함수를 사용하는 경우
- 함수의 종료의 의미로 return 을 사용하는 경우
예제:
def stop_fun(num) :
for i in range(1, num + 1) :
print ('숫자 {0} 울 출력합니다'.format(i))
if i =0 5:
return
stop_fun(10)
def enumstates(state, idx, agent):
if idx > 8:
player = last_to_act(state)
if player == agent.player:
agent.add(state)
else:
winner = gameover(state)
if winner != EMPTY:
return
i = int(idx / 3)
j = idx % 3
for val in range(3):
state[i][j] = val
enumstates(state, idx+1, agent)
문제151. (점심시간 문제) 아래와 같이 숫자를 입력하고 함수를 실행하면 숫자가 세로로 출력되게 하시오
def print_something(*num):
for s in num :
print(s)
- 함수 밖의 변수, 함수 안의 변수
로컬 변수? 함수 내에서만 사용하는 변수
글로벌 변수? 함수 내,외 둘다 사용 가능한 변수
특정함수에서 출력된 결과를 다른 함수에서 사용할 때
사용합니다.
함수안의 변수와 함수 밖의 변수가 서로 이름이 같다해도 전혀 다른 변수이다.
만약 같은 변수로 취급하려면 global 변수로 선언해야한다.
예제:
def scope_test():
a = 1 # 함수 내에서 사용하는 변수 (로컬변수)
print ('a : {0}'.format(a) )
scope_test()
문제152. 마지막 위의 스크립트에서 마지막 scope_test()를 실행했을때 a가 1 이 아니라 0이 출력이 되려면
scope_test() 함수를 생성할 때 어떻게 생성해야 했을가요?
a = 0
def scope_test():
a = 1 # 함수 내에서 사용하는 변수 (로컬변수)
print ('a : {0}'.format(a) )
scope_test()
- 재귀함수
- 스택구조
- 큐구조 : 선입선출( 먼저 들어온게 먼저 처리)
sql에서 큐를 경험해봤다
Enqueuue 락
서로 업데이트 하려면 락이걸린다.
a b c
a: lock holder
b,c : lock waiter
scott A
update emp
set sal = 0
where ename = 'KING';
* 스택 구조 : 먼저들어간 데이터가 가장 마지마겡 나오는 구조 LIFO
후입 선출
스택 루프 반복문
반복문 (LOOP) + 스택 구조 ===> 재귀 알고리즘
예 :
def some_func(count) :
if count > 0 :
some_func(count -1)
print (count)
some_func(100)
10 ---> call하고 기다림 ---> 기다림이 끝나면 print 10
9 ---> call하고 기다림 ---> 기다림이 끝나면 print 9
8 ---> call하고 기다림 ---> 기다림이 끝나면 print 8
7 ---> call하고 기다림 ---> 기다림이 끝나면 print 7
:
:
print 0
0 ---> 함수 호출 끝
문제153. 10! 을 재귀함수로 구현해서 출력하시오 !
def factorial2(count) :
if count > 0 :
return count * factorial2 (count -1)
elif count == 0:
return 1
문제154. 16과 28의 최대공약수를 출력하는데 재귀함수를 이용해서
구현하시오 !
find_gcd(20,16)
최대 공약수는 4
find_gcd(108,72)
최대 공약수는36
def find_gcd(num1, num2):
if num1%num2 != 0: return find_gcd(num2, num1%num2)
else : return num2
li=[]
def find(*num):
if a%b != 0: return find_gcd(b, a%b)
elif a%b == 0 : return find_gcd(c, b%c)
return c
li=[]
def print_something(*num):
문제155. 오늘 오전에 배운 가변 매개변수와 재귀 알고리즘을 이용해서 최대
공약수를 출력하는 함수를 생성하시오
def find_gcd(a,b,c):
if a%b != 0: return find_gcd(b, a%b,c)
elif b%c != 0: return find_gcd(a, b ,b%c)
return b
def find_gcd(a,b,c):
if a%b != 0: return find_gcd(b, a%b)
elif a%b == 0 : return find_gcd(c, b%c)
return c
li=[]
def print_something(*num):
for s in num :
li.append(s)
a= 1000%700%74
print (a)
내일 PL/SQL 알고리즘 문제 시험범위: 오픈북, 실습가능
오늘 배운 재귀 알고리즘을 PL/SQL로 구현하는 문제 2개
예 SQL> exec dbms_output.put_line( factorial(5) )
7.7 중첩함수 ( p 158)
" 파이썬에서는 함수 안에 함수를 정의하는거싱 가능하다"
중첩함수는 자신이 소속된 함수의 매개변수에 접근할 수 있다는 특징이 있다.
예제: p159 쪽 (표준편차를 출력하는 함수)
* 표준편차를 구현하기 위한 함수 2개
1. 평균값 구하는 함수
2. 분산을 구하는 함수
3. 구해진 분산값에 루트를 씌운 값을 출력하는 함수
예제:
(pg159)
import math
def stddev(*args):
def mean(): #평균 구하는 함수
return sum(args)/len(args)
def variance(m): # 분산을 구하는 함수
total = 0
for arg in args:
total += (arg - m) **2
return total/(len(args)-1)
v= variance(mean()) # 분산을 구함
return math.sqrt(v) # 분산에 루트를 씌워서 표준편차를 구함
stddev(2.3,1.7,1.4,0.7,1.9)
import math
def stddev(*args):
def mean():
return sum(args)/len(args)
def variance(m):
total = 0
for arg in args:
total += (arg -m) **2
return total / (len(args)) - 1
v= variance(mean() )
return math .sqrt(v)
stddev(2.3, 1.7, 1.4, 0.7, 1.9)
문제156. 가변 매개변수를 이용해서 여러개의 숫자를 입력 받아 최대공약수를
출력을 해낸 준호의 코드를 가져다가 중첪함수를 구성하시오 !
def gcdtwo(a,b): # 두 수의 최대공약수를 출력
# 분모가 0일경우 에러가 발생하므로 0인 경우를 따로 생각
if min(a,b) == 0: # 0과 A의 최대공약수는 무조건 A 이기 떄문에
return max(a,b) # 두 수중 최소값이 0인경우 두 수중 맥스값으로 최대공약수 출력
return gcdtwo(b,a%b) # 0이 아닌경우에 대해 유클리드호제법으로 재귀
def gcd(a): # 여러 수 중에서 최대공약수를 출력하는 알고리즘
b=gcdtwo(max(a),min(a)) # 여러 수 중 두수를 뽑아서 최대공약수를 구하고
# 다른 두수를 뽑아서 최대공약수를 구하고를 반복해서
a.remove(min(a)) # 마지막에 남는 최대공약수가 전체의 최대공약수인 점을 이용
a.remove(max(a)) # 정렬할 필요가 없게 전체 수에서 최대, 최소값을 뽑아서
# 최대공약수를 구하는데 계산에 사용한 수는 제거하고
a.append(b) # 위에서 구한 최대공약수를 리스트에 추가
if max(a)==min(a): # 위 과정을 재귀를 통해 반복하면 최대공약수만 2개 남는데
print('최대공약수는 : ',a[0]) # 그경우에서 재귀를 종료하고 최대공약수를 출력
else:
gcd(a)
def list(*n): # 가변 매개변수로 데이터를 여러개 입력받으면
# 튜플 형태이기 때문에 데이터 변경이 불가능
a = [] # 리스트를 생성하고 데이터 변경이 가능하도록
for i in n: # 튜플 데이터를 잘라서 리스트에 입력
a.append(i)
gcd(a) # 최종적으로 생성한 리스트 변수를
# 위에 생성한 최대공약수 함수에 입력해서 최대공약수 계산
def list(*n):
def gcdtwo(a,b):
if min(a,b) == 0:
return max(a,b)
return gcdtwo(b,a%b)
def gcd(a):
b=gcdtwo(max(a),min(a))
a.remove(min(a))
a.remove(max(a))
a.append(b)
if max(a)==min(a):
print('최대공약수는 : ',a[0])
else:
gcd(a)
a = []
for i in n:
a.append(i)
gcd(a)
list(4,8,12)
list(6842,176,154)
■ 재귀 알고리즘을 완성하는 문제
MIT 코드를 이해하기 위해서 반드시 알아야하는 알고리즘
- greedy (탐욕) 알고리즘
당장 눈 앞의 이익만 추구하는 것
먼 미래를 내다 보지 않고 지금 당장의 최선이 무언인가만 판단
예 : 틱택토 코드가 가장 유명한 예이다.
문제157. 탐욕 알고리즘을 이용하여 금액과 화폐가 주어졌을 때
가장 적은 화폐로 지불 하시오 !
액수입력 : 362
화폐 단위를 입력 !: 1 50 100
결과 :
100원 3개
50원 1개
1원 12개
def coinGreedy(money, cash_type):
cash_type.sort(reverse=True)
def coinGreedyRecursive(money, cash_type, res, idx):
if idx >= len(cash_type): #화폐 다 사용 시 종료
return res
dvmd = divmod(money,cash_type[idx] )
res[cash_type[idx]] = dvmd[0]
return coinGreedyRecursive(dvmd[1] ,cash_type,res,idx+1)
return coinGreedyRecursive(money,cash_type,{},0)
money = int(input('액수입력 : '))
cash_type = [int(x) for x in input('화폐단위를 입력하세요 : ').split(' ')]
res = coinGreedy(money,cash_type)
for key in res:
print('{0}원 : {1}개'.format(key,res[key]))
■8장. 모듈과 패키지
- 8장 목차
- 1. 모듈이란?
- 2. import 사용법
- 모듈 찾는 방법
- 메인 모듈과 하위 모듈
- 패키지
- _init_.py
8.1 모듈이란? 독자적인 기능을 갖는 구성요소
파이썬에서는 각각의 소스파일을 일컬어 모듈이라고 한다.
모듈 생성 예 :
save as calculator.py
def plus(a,b):
return a+b
def minus(a,b):
return a-b
def multiply(a,b):
return a*b
def divide(a,b):
return a/b
import calculator
print (calculator.plus(10,5))
print (calculator.minus(10,5))
print (calculator.multiply(10,5))
print (calculator.minus(10,5))
■8.2. import 사용법
import 의 역할은 정확하게는 다른 모듈 내의 코드에 대한 접근을 가능하게 하는 것이다.
import 가 접근 가능하게 하는 코드에는 변수, 함수 , 클래스등이 모두 포함된다.
앞에서 썼던 문법 :
import 모듈명
import calculator
print ( calculator.plus(10,5) )
↓
좀더 편하게 코딩 : from 모듈명 import 변수 또는 함수
from calculator import plus
from calculator import minus
from calculator import multiply
from calculator import divide
print ( plus(10,5) )
↓
좀더 편하게 코딩 : from 모듈명 import *
print ( plus(10,5) )
p 168 import * 와 같은 코드는 사용하지 않는것이 좋다.
이유? 코드가 복잡해지고 모듈의 수가 많아지면 어떤 모듈에 또는 어떤 함수를 불러오고 있는지 파악하기 힘들다
좀더 편하게 코딩 : import calculator as c
print (c.plus(10,5) )
문제159.오전에 만들었던 준호의 최대공약수를 구하는 함수를 모듈화 하시오 !
if _name_=="__main__": 모듈을 불러올때 이문장 이후의 문장은 수행되지 않음
list (1000,3350,150)
문제160. 표준편차를 출력하는 함수를 모듈화 시켜서 다른 실행창에서 아래와 같이 실행되게 하시오!
■8.3. 모듈 찾는 방법
방금 만든 calculator 모듈의 위치는 우리가 직접 지정한 위치에 저장되어있었고
calc_test.py 에서 calculator 모듈을 불러올 수 있었다.
sys 라는 모듈( 예: random 함수를 포함하고 있는 모듈) 어디에 있는가?
파이썬은 import를 만나면 아래와 같은 순서로 모듈 파일을 찾아나선다.
- 파이썬 인터프리터 내장 모듈
- sys.path 에 정의 되어 있는 디렉토리
sys 모듈은 파이썬의 내장 모듈이다.
sys 모듈에 들어있는 함수들이 뭐가 있는지 확인하는 코드
import sys
print ( sys.builtin_module_names)
문제161. 혜승이가 sys모듈의 random 함수를 이용해서 경이로운 방법으로 구현해낸 원주율 구하는 코드를 실행해보자