Quiet Time

7장. 함수

PYTHON2017. 9. 10. 00:42
■ 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일때 미분계수를 구하시오 





■ 지난 주에 배웠던 내용 복습
  1. 함수
- 머신 러닝을 이해하기위한 Mit TTT 코드 구현
- 웹 스크롤링 ----> 빅데이터 수집
  1.  
6장함수 
for 
while
continue
break

5장. 파이썬 자료형 3가지 
  1. 리스트 []
  2. 튜플 ()
  3. 딕셔너리 {} (키와 값으로 구성된 자
   - 어순 번역기
   - nested loop join 구현
          ↓ data 양이 많아지면 느려진다.
   - hash join 으로 구현 (해쉬 알고리즘)  오라클이 이걸로 다른rdb회사 눌러버림

  1. 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)

  1. 함수 밖의 변수, 함수 안의 변수

     로컬 변수? 함수 내에서만 사용하는 변수
     글로벌 변수? 함수 내,외 둘다 사용 가능한 변수 
               특정함수에서 출력된 결과를 다른 함수에서 사용할 때 
               사용합니다. 


함수안의 변수와 함수 밖의 변수가 서로 이름이 같다해도 전혀 다른 변수이다. 
만약 같은 변수로 취급하려면 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 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 코드를 이해하기 위해서 반드시 알아야하는 알고리즘 
  1. 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를 만나면 아래와 같은 순서로 모듈 파일을 찾아나선다.
  1. 파이썬 인터프리터 내장 모듈
  2. sys.path 에 정의 되어 있는 디렉토리 

sys 모듈은 파이썬의 내장 모듈이다. 

sys 모듈에 들어있는 함수들이 뭐가 있는지 확인하는 코드 

import sys
print ( sys.builtin_module_names)

문제161. 혜승이가 sys모듈의  random 함수를 이용해서 경이로운 방법으로 구현해낸 원주율 구하는 코드를 실행해보자 























 
 

'PYTHON' 카테고리의 다른 글

gcp를 이용해서 jupyter notebook / jupyter lab 서버 만들기  (0) 2018.08.27
9장. 객체와 클래스 (가장 중요한 단원)  (0) 2017.09.10
8장. 모듈  (0) 2017.09.10
6장. if 문과 loop문 (p126)  (0) 2017.09.10
1-5장  (0) 2017.09.10