728x90
728x90
๋๋ค(Lambda)์ ํ์ฉ
lambda ํค์๋๋ฅผ ์ด์ฉํด์ ์ด๋ฆ ์๋ ํจ์๋ฅผ ๋ง๋ค ์ ์๋ค.
lambda ๋งค๊ฐ๋ณ์ : ํํ์
- ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์(map, filter, reduce)์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํ๋ค.
- ๊ฐ๋จํ ํจ์์ ๊ฒฝ์ฐ์ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
>>> (lambda x, y: x + y)(10, 20)
30
map ํจ์
map(function, iterable)
๋งค๊ฐ๋ณ์ function
- map์ ๋งค๊ฐ๋ณ์ ํจ์์๋ฆฌ์๋ ๋งค๊ฐ๋ณ์๊ฐ 1๊ฐ์ธ ํจ์๋ง ์ด์ฉ๊ฐ๋ฅํ๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ 1๊ฐ๊ฐ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ TypeError๊ฐ ๋ฐ์ํ๋ค. * ์์ธ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ ์ํ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋, lambda๋ฅผ ์ด์ฉํด ์์ฑํ๋ค.
๋งค๊ฐ๋ณ์ iterble
- ๋ฐ๋ณต๊ฐ๋ฅํ object๋ก list, tuple, string ๋ฑ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๋์
- ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ iterable์ ๊ฐ ์์๋ง๋ค ํจ์๋ฅผ ์ ์ฉ์ํจ ํ ์๋ก์ด ๋ฆฌ์คํธ๋ก ๋ง๋ ๋ค.
- ์๋ก์ด object๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋งค๊ฐ๋ณ์์๋ ๋ณํ๊ฐ ์๋ค.
- ํจ์๋ฅผ ์ ์ฉ์ํจ ์๋ก์ด object๋ฅผ ๋ฐํํ๋ค.
# map ํจ์
>>> def squares(x):
... return x ** 2
...
>>> map(squares, range(5))
[0, 1, 4, 9, 16]
# map ํจ์์์์ lambda ์์ฉ
>>> map(lambda x: x ** 2, range(5))
[0, 1, 4, 9, 16]
>>> squared = map(lambda x: x** 2, range(5)) # ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด squares์ ๋์
ํด์ค์ผํ๋ค.
>>> map(lambda x:x+'@', "abcde") # string์ ๋ํด map ์ฐ์ฐ์ ์ํํ ๊ฒฝ์ฐ
['a@', 'b@', 'c@', 'd@', 'e@']
filter ํจ์
filter(function, iterable)
๋งค๊ฐ๋ณ์ function
- filter์ ๋งค๊ฐ๋ณ์ ํจ์์๋ฆฌ์๋ ๋งค๊ฐ๋ณ์๊ฐ 1๊ฐ์ธ ํจ์๋ง ์ด์ฉ๊ฐ๋ฅํ๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ 1๊ฐ๊ฐ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, TypeError๊ฐ ๋ฐ์ํ๋ค. * ์์ธ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ ์ํ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋, lambda๋ฅผ ์ด์ฉํด ์์ฑํ๋ค.
๋งค๊ฐ๋ณ์ iterble
- ๋ฐ๋ณต๊ฐ๋ฅํ object๋ก list, tuple, string ๋ฑ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๋์
- ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ iterable์ ๊ฐ ์์๋ง๋ค ํจ์๋ฅผ ์ ์ฉ์ํจ ํ ๊ฒฐ๊ณผ๊ฐ ์ฐธ์ธ ์์๋ค์ ํํฐ๋งํ๋ค.
- ๊ธฐ์กด์ iterble์ ๋ณํ๊ฐ ์๊ณ , ํจ์๋ฅผ ์ ์ฉ์ํจ ์๋ก์ด object๋ฅผ ๋ฐํํ๋ค.
# filter ํจ์์์์ lambda ์์ฉ
>>> filter(lambda x: x%2 == 0, squared)
[0, 4, 16]
>>> filter(lambda x:x>'d', "bcdef")
'ef'
reduce ํจ์
reduce(function, iterable, initializer=None)
๋งค๊ฐ๋ณ์ function
- reduce์ ๋งค๊ฐ๋ณ์ ํจ์์๋ฆฌ์๋ ๋งค๊ฐ๋ณ์๊ฐ 2๊ฐ์ธ ํจ์๋ง ์ด์ฉ๊ฐ๋ฅํ๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ 2๊ฐ๊ฐ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, TypeError๊ฐ ๋ฐ์ํ๋ค. (์์ธ์ฒ๋ฆฌ ๊ฐ๋ฅ)
- ์ ์ํ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋, lambda๋ฅผ ์ด์ฉํด ์์ฑํ๋ค.
๋งค๊ฐ๋ณ์ iterable
- ๋ฐ๋ณต๊ฐ๋ฅํ object๋ก list, tuple, string ๋ฑ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๋งค๊ฐ๋ณ์ initializer
- ์ธ์๋ก ์ด๊ธฐ๊ฐ์ ์ ๋ฌํ๋ค๋ฉด, initializer์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ํจ์์ ์ ์ฉํ๋ค.
- ์ด๊ธฐ๊ฐ์ ์ ๋ฌํ์ง ์๋ ๊ฒฝ์ฐ, ์ฒซ๋ฒ์งธ ์์์ ๋๋ฒ์งธ ์์๋ฅผ ํจ์์ ์ ์ฉํ๋ค.
# reduceํจ์์ ๋์
def reduce(function, iterable, initializer=None):
it = iter(iterable) # iterble์ ๋ฐ๋ณต์๋ฅผ it์ ์ ์ฅํ๋ค.
if initializer is None:
value = next(it) # value์ iterable์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ ์ฅํ๋ค.
else:
value = initializer # initizlier๊ฐ ์๋ ๊ฒฝ์ฐ, value์ ๊ทธ ๊ฐ์ ์ ์ฅํ๋ค.
for element in it: # it ์ ์์๋ฅผ ์ฐจ๋ก๋๋ก element์ ์ ์ฅํ๋ค.
value = function(value, element) # value์ element๋ฅผ ํจ์์ ์ ์ฉํด value์ ์ ์ฅํ๋ค.
return value # ์ต์ข
๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ค.
๋์
iter()
ํจ์๋ฅผ ์ด์ฉํด ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ iterable์ ๋ฐ๋ณต์๋ฅผ ๊บผ๋ด ๋ฐํํด it์ ์ ์ฅํ๋ค.- initializer๊ฐ ์๋ ๊ฒฝ์ฐ, value์ iterable์ ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ ์ฅํ๋ค.
- initializer๊ฐ ์๋ ๊ฒฝ์ฐ, value์ initializer ๊ฐ์ ์ ์ฅํ๋ค.
- for๋ฌธ์์ it์ ์์๊ฐ์ ์ฐจ๋ก๋๋ก element์ ์ ์ฅํ๋ค.
- ๋ฐ๋ณต์ด ์ข ๋ฃ๋ ๋๊น์ง value = function(value, element) ์ฐ์ฐ์ ๋ฐ๋ณตํด ๊ฒฐ๊ณผ๊ฐ์ value์ ๋์ ์ํจ๋ค.
- ๋ฐ๋ณต์ด ์ข ๋ฃ๋๋ฉด ์ต์ข ๊ฒฐ๊ณผ๊ฐ์ธ value๋ฅผ ๋ฐํํ๋ค.
# reduce ํจ์์์์ lambda ์์ฉ
>>> reduce(lambda x, y: x+y, [0, 1, 2, 3, 4]) # ((((0+1)+2)+3)+4) = 10
10
>>> reduce(lambda x, y: x+y, [0, 1, 2, 3, 4], 10) # (((((10+0)+1)+2)+3)+4) = 20
20
>>> reduce(lambda x, y: x if x>y else y, [0, 1, 2, 3, 4])
4
# ์๋ ์ฝ๋์ ๋ํ ๋์ ๊ณผ์
>>> reduce(lambda x, y: x+y, [0, 1, 2, 3, 4]) # ((((0+1)+2)+3)+4)
10
# ๋์ ์ฒซ๋ฒ์งธ(์์1, ์์2): 0 + 1 = 1(๊ฒฐ๊ณผ1)
# ๋์ ๋๋ฒ์งธ(๊ฒฐ๊ณผ1, ์์3): 1 + 2 = 3(๊ฒฐ๊ณผ2)
# ๋์ ์ธ๋ฒ์งธ(๊ฒฐ๊ณผ2, ์์4): 3 + 3 = 6(๊ฒฐ๊ณผ3)
# ๋์ ๋ค๋ฒ์งธ(๊ฒฐ๊ณผ3, ์์5): 6 + 4 = 10(๊ฒฐ๊ณผ4)
# ์ต์ข
๋ฆฌํด๊ฐ = 10
reduce์ ๋น list๋ฅผ ์ธ์๋ก ๋๊ธธ ๊ฒฝ์ฐ ํ์ธํ๊ธฐ
์ด๊ธฐ ๊ฐ ์์ด reduceํจ์์ ๋น list๋ฅผ ์ธ์๋ก ๋๊ธธ ๊ฒฝ์ฐ, TypeError๊ฐ ๋ฐ์ํ๋ค. list๊ฐ ๋น์ด์๋๋ผ๋ initial value๋ฅผ ๋๊ฒจ์ฃผ๋ ๊ฒฝ์ฐ, ์ ์์ ์ผ๋ก ์๋ํ๋ค.
>>> reduce(lambda x, y: x+y, []) # ์ด๊ธฐ๊ฐ ์์ด ๋น list๋ฅผ ๋๊ธธ ๊ฒฝ์ฐ
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: reduce() of empty sequence with no initial value
>>> reduce(lambda x, y: x+y, [], 10) # ์ด๊ธฐ๊ฐ์ ๋๊ฒจ์ค ๊ฒฝ์ฐ
10
Iterable, iterator ๊ฐ์ฒด
iterable
๊ฐ์ฒด์ iterator(๋ฐ๋ณต์)
๊ฐ์ฒด, iter()
ํจ์์ next()
ํจ์์ ๋ํด
iterable
๊ฐ์ฒด๋ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ๋ปํ๋ค. list, dict, set, str, bytes, tuple, range ๋ฑ์ด ์๋ค.iterator
๊ฐ์ฒด๋ ๊ฐ์ ์ฐจ๋ก๋๋ก ๊บผ๋ผ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ปํ๋ค.iter()
ํจ์๋ฅผ ํตํด iterable ๊ฐ์ฒด๋ฅผ iterator(๋ฐ๋ณต์) ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์๋ค.- iterable ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์, iterator๋ฅผ ๋ฐํํ๋ค.
next()
ํจ์๋ฅผ ํตํด iterator ๊ฐ์ฒด์ ์์ ๊ฐ์ ํ๋์ฉ ๋ฐํํ ์ ์๋ค.- itertor ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ ฅ๋ฐ์ ๋ค์ ์์๊ฐ์ ๋ฐํํ๋ค.
- ๊ฐ์ฒด์์ ๋ ๊ตฌํ ์์๊ฐ ์์ผ๋ฉด StopIteration์ด๋ผ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
>>> a = [0, 1, 2]
>>> it = iter(a)
>>> type(it)
<type 'listiterator'>
>>> next(it) # a[0]
0
>>> next(it) # a[1]
1
>>> next(it) # a[2]
2
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
- 2019.07.15 ๊ณต๋ถ ์๋ฃ ์ ๋ก๋
- reduce ํจ์์ ๋ํ ์ดํด๋ ๋ถ์กฑํ ๊ฒ ๊ฐ๋ค.
728x90
728x90
'๐ Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] class, instance ์์ฑ, class ์์๊ณผ ์์ฑ์ (0) | 2020.12.07 |
---|---|
[Python] ๋ฐ์ดํฐ ํ์ - List, Dictionary, JSON (0) | 2020.12.07 |
[Python] ํท๊ฐ๋ฆฌ๋ ๋ฌธ๋ฒ ์ ๋ฆฌ (0) | 2020.12.07 |