데이터뢄석가 κ³Όμ •/Python

DAY39. Python ν•¨μˆ˜ (2)μΆ•μ•½ν•¨μˆ˜, μœ νš¨λ²”μœ„, λ‚΄μž₯ν•¨μˆ˜, μ€‘μ²©ν•¨μˆ˜

LEE_BOMB 2021. 11. 9. 17:08
1. μΆ•μ•½ν•¨μˆ˜(Lambda)

ν•¨μˆ˜λ₯Ό 생성할 λ•Œ μ‚¬μš©ν•˜λŠ” μ˜ˆμ•½μ–΄λ‘œ def와 λ™μΌν•œ 역할을 ν•œλ‹€.

보톡 ν•¨μˆ˜λ₯Ό ν•œμ€„λ‘œ κ°„κ²°ν•˜κ²Œ λ§Œλ“€ λ•Œ μ‚¬μš©ν•œλ‹€.

μš°λ¦¬λ§λ‘œλŠ” "λžŒλ‹€"라고 읽고 defλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  μ •λ„λ‘œ λ³΅μž‘ν•˜μ§€ μ•Šκ±°λ‚˜ defλ₯Ό μ‚¬μš©ν•  수 μ—†λŠ” 곳에 주둜 쓰인닀.

lambda μ˜ˆμ•½μ–΄λ‘œ λ§Œλ“  ν•¨μˆ˜λŠ” return λͺ…λ Ήμ–΄κ°€ 없어도 결괏값을 λŒλ €μ€€λ‹€.


ν˜•μ‹) λ³€μˆ˜ = lambda 인수 : λͺ…λ Ήλ¬Έ(리턴값)
예) lambda x, y : x + y

 


1. μΆ•μ•½ν•¨μˆ˜(Lambda)
1) λΈ”λŸ­ν˜• ν•¨μˆ˜ 

def Adder(x, y) :
    add = x + y
    return add

print('add =', Adder(10, 20)) # add = 30


2) μΆ•μ•½ν•¨μˆ˜ 

Adder2 = lambda x, y : x + y

print('add =', Adder2(10,20)) # add = 30


xλ³€λŸ‰μ— μ œκ³± 

datas = [2, 4, 5, 6, 8, 3]
square = lambda datas : [x**2 for x in datas] # list 내포 

print('square =', square(datas))

square = [4, 16, 25, 36, 64, 9]

ν˜ˆμ•‘ν˜• dummy λ³€μˆ˜ : AB(1),A,B,O(0)

map_data = {'A':0,'B':0,'O':0,'AB':1} # dict 

blood = ['O','B','A','AB','O','A']

dummy = lambda blood : [map_data[i] for i in blood]
print('dummy =', dummy(blood))

dummy = [0, 0, 0, 1, 0, 0]

ν˜ˆμ•‘ν˜• dummy λ³€μˆ˜ : AB(1),A,B,O(0), err : -1

blood_err = ['O','B','A','AB','O','A','C']


λ³€μˆ˜ = [μ°Έ if 쑰건식 else κ±°μ§“  for λ³€μˆ˜ in μ—΄κ±°ν˜•κ°μ²΄]

dummy2 = lambda blood : [map_data[i] if i in map_data else -1 
                         for i in blood]
print('dummy =', dummy2(blood_err))

dummy = [0, 0, 0, 1, 0, 0, -1]

 

 

 

 

 

 

2. scope : λ³€μˆ˜μ˜ 유효 μ‚¬μš©λ²”μœ„ 

μ „μ—­λ³€μˆ˜(Global Scope) : ν•¨μˆ˜ μ™Έ.λ‚΄μ—μ„œ μ‚¬μš©κ°€λŠ₯ λ³€μˆ˜ (κΈ€λ‘œλ²Œλ³€μˆ˜)

μ§€μ—­λ³€μˆ˜(Local Scope) : ν•¨μˆ˜λ‚΄μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯ λ³€μˆ˜ (λ§€κ°œλ³€μˆ˜) 


-> ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ μžλ™ μ†Œλ©Έ 

x = 50 # μ „μ—­λ³€μˆ˜ x


μ§€μ—­λ³€μˆ˜ : x 

def local_fn(x) :
    x += 50 # μ§€μ—­λ³€μˆ˜ 
    y = x*2 # μ§€μ—­λ³€μˆ˜ 
    print('local x =', x) # local x = 100
    print('y=', y)

 

ν•¨μˆ˜ 호좜     

local_fn(x)

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


μ „μ—­λ³€μˆ˜ : x

def global_fn() :
    global x # μ „μ—­λ³€μˆ˜ : x
    x += 50
    print('global x =', x)  # global x = 100

 

ν•¨μˆ˜ ν˜ΈμΆœ 

global_fn()

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


λ‚œμˆ˜ κ΄€λ ¨ ν•¨μˆ˜μ œκ³΅ λͺ¨λ“ˆ 

import random #  방법1)
from random import uniform, randint # 방법2)


방법1

r = random.uniform(0, 1) # λͺ¨λ“ˆ.ν•¨μˆ˜()
r # 0.9455726705758528


방법2

r2 = uniform(0, 1) # ν•¨μˆ˜()
r2 # 0.3341880766129778

r3 = randint(1, 10)
r3 # 5


size만큼 λ‚œμˆ˜ 생성 

size = 1000
rdata = [uniform(0, 1)  for i in range(size)]
len(rdata) # 1000

tot = 0.0 # μ „μ—­λ³€μˆ˜ 

def calc_fn(data) :
    global tot # μ „μ—­λ³€μˆ˜ 
    for x in data :
        tot += x # λ‚œμˆ˜ λˆ„μ  
    return tot / len(data) # λ‚œμˆ˜ 평균

  
ν•¨μˆ˜ 호좜 

avg = calc_fn(rdata)
print('λ‚œμˆ˜ 평균 =', avg) # λ‚œμˆ˜ 평균 = 0.4939596231829882
print('λ‚œμˆ˜ 합계 =', tot) # λ‚œμˆ˜ 합계 = 493.9596231829882

 

 

 

 

 

μ€‘μ²©ν•¨μˆ˜

ν•¨μˆ˜μ•ˆμ— 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•œ ꡬ쑰 

ν˜•μ‹)
def outer(인수) :
    λͺ…λ Ήλ¬Έ
    def inner(인수) :
        λͺ…λ Ήλ¬Έ
    return inner


1. μ€‘μ²©ν•¨μˆ˜ 예

def outer() : # μ™ΈλΆ€ν•¨μˆ˜ 
    print('outer')
    
    def inner() : # λ‚΄λΆ€ν•¨μˆ˜ 
        print('inner')
        
    return inner # λ‚΄λΆ€ν•¨μˆ˜ λ°˜ν™˜(ν•¨μˆ˜ ν΄λ‘œμ €)


μ™ΈλΆ€ν•¨μˆ˜ 호좜 

inner = outer()


λ‚΄λΆ€ν•¨μˆ˜ 호좜 

inner()




2. μ€‘μ²©ν•¨μˆ˜ μ‘μš© 
μ™ΈλΆ€ν•¨μˆ˜ μ—­ν•  : dataset 생성, λ‚΄λΆ€ν•¨μˆ˜ 포함 
λ‚΄λΆ€ν•¨μˆ˜ μ—­ν•  : dataset μ‘°μž‘  

def outer_fn(data) :
    dataset = data # dataset 생성(1~100)

     
합계 inner 

    def tot() :
        tot_val = sum(dataset)
        return tot_val


평균 inner 

    def avg(tot_val) :
        avg_val = tot_val / len(dataset)
        return avg_val
    
    return tot, avg # λ‚΄λΆ€ν•¨μˆ˜ λ°˜ν™˜(ν•¨μˆ˜ ν΄λ‘œμ €)


ν•¨μˆ˜ 호좜

dataset = list(range(1,101))
tot, avg = outer_fn(dataset)

1. dataset 생성
2. λ‚΄λΆ€ν•¨μˆ˜ λ°˜ν™˜

tot_val = tot()
print('tot =', tot_val) # tot = 5050
avg_val = avg(tot_val)
print('ave =', avg_val) # ave = 50.5




3. nonlocal : inner -> outer κ°’ μ ‘κ·Ό 
νšλ“μž(getter) : ν•¨μˆ˜ λ‚΄ 값을 μ™ΈλΆ€λ‘œ λ„˜κΈ°λŠ” ν•¨μˆ˜ 
μ§€μ •μž(setter) : ν•¨μˆ˜ λ‚΄ κ°’을 μˆ˜μ •ν•˜λŠ” ν•¨μˆ˜ 

def main_fn(num) : # outer
    num_val = num # data 생성(100)


inner

def get_fn() : # νšλ“μž(getter) 
    return num_val
def set_fn(value) : # μ§€μ •μž(setter)
    nonlocal num_val # μ™ΈλΆ€ν•¨μˆ˜ λ³€μˆ˜  
    num_val = value # κ°’ μˆ˜μ • 
        
return get_fn, set_fn # λ‚΄λΆ€ν•¨μˆ˜ λ°˜ν™˜(ν•¨μˆ˜ ν΄λ‘œμ €)
        
get_fn, set_fn = main_fn(100)        

print('num_val =', get_fn()) # num_val = 100

set_fn(200)  # 값을 μˆ˜μ • : 100 -> 200       

print('num_val =', get_fn()) # num_val = 200




4. ν•¨μˆ˜ μž₯μ‹μž 
λ‹€λ₯Έ ν•¨μˆ˜μ˜ μ‹œμž‘κ³Ό μ’…λ£ŒλΆ€λΆ„μ— μž₯식 μΆ”κ°€ κΈ°λŠ₯ 

ν˜•μ‹) @ν•¨μˆ˜μž₯μ‹μž 
def ν•¨μˆ˜λͺ…() :
    λͺ…λ Ήλ¬Έ 


ν•¨μˆ˜ μž₯μ‹μž : μ€‘μ²©ν•¨μˆ˜ 이용 

def hello_deco(func) : # outer : λŒ€μƒν•¨μˆ˜ λ°›μŒ 
    def inner(name) : # inner : 인수 λ°›μŒ

 

ν•¨μˆ˜ κΎΈλ―ΈκΈ° 

    print('*'*30) # μ‹œμž‘λΆ€λΆ„ 
    func(name) # hello(name) : ν•¨μˆ˜ 호좜 
    print('*'*30) # μ’…λ£ŒλΆ€λΆ„ 
return inner


λŒ€μƒν•¨μˆ˜ 

@hello_deco
def hello(name) :
    print('μ•ˆλ…•ν•˜μ„Έμš”. %s μž…λ‹ˆλ‹€.'%name)


ν•¨μˆ˜ν˜ΈμΆœ 

hello('μ΄μˆœμ‹ ')
#μ•ˆλ…•ν•˜μ„Έμš”. μ΄μˆœμ‹  μž…λ‹ˆλ‹€.