DAY39. Python ν¨μ (2)μΆμ½ν¨μ, μ ν¨λ²μ, λ΄μ₯ν¨μ, μ€μ²©ν¨μ
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('μ΄μμ ')
#μλ
νμΈμ. μ΄μμ μ
λλ€.