Python 30์ผ๐จโ๐ป - 11์ผ์งธ - ํจ์์ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด
class
์ ์กฐํฉํจ์ผ๋ก์จ ์ด๋ฅผ ์คํํ์ง๋ง ํจ์์ ํ๋ก๊ทธ๋๋ฐ์ ์์ฑ๊ณผ ์กฐ์์ ๋ถ๋ฆฌํ๊ณ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ๋ํ ์กฐ์์ ์ํํ๋ค.์ค๋ ๋๋ ํ์ดํค์ ์์ฉ๋๋ ํจ์์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ ์ฐ๊ตฌํ๊ณ ํจ์์ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ์ด๋ป๊ฒ ์คํํ์ฌ ํ์ดํค ์ฝ๋๋ฅผ ์กฐ์งํ๋์ง ์ฐ๊ตฌํ๋ค.
๊ฐ๋ฐ์์ ์ธ๊ณ์์ ์ด๋ค ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ด ๋ ์ข์์ง์ ๋ํ ๋ ผ์์ด ์์ฃผ ์ผ์ด๋๋ค.๋น๋ก ๋ง์ ์ฌ๋๋ค์ด ์์ ๋์ ์ฝ๋๋ ์์ ํจ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ํด ๊ฐํ ๊ฒฌํด๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง.๋์ฑ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์ด ๋ ๋ชจ๋ธ์ ์ฅ์ ๊ณผ ์ฃผ์์ฌํญ์ ์ดํดํ๊ณ ํ์ํ ๋ ์ด ๋ ๋ชจ๋ธ์ ์ฅ์ ์ ๋ฐ์๋ค์ด๋ ๊ฒ์ด๋ค.
๋ค์์ ํจ์์ ํ๋ก๊ทธ๋๋ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ๊ฐ๋ ๊ณผ Python์์์ ์คํ์ด๋ค.
์ํจ์
์์ํจ์๋ ํจ์์ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ๊ณผ ์ํผ์ผ๋ก ํด๋์ค์ ๋์์ด ๋์์ ๋์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ํต์ฌ๊ณผ ์ํผ๊ณผ ๊ฐ๋ค.
์์ ํจ์๋ ๋ค์ ๋ ๊ท์น์ ๋ฐ๋ฅด๋ ํจ์์ ๋๋ค.
def doubler(num):
'''
Accepts a number and multiplies it by 2
'''
return num * 2
print(doubler(5))
def emoji_appender(list, emoji):
'''
Accepts a list and a emoji and
appends to every item of list
'''
new_list = []
for item in list:
new_list.append(str(item) + emoji)
return new_list
print(emoji_appender([1,2,3], '๐')) # ['1๐', '2๐', '3๐']
print(emoji_appender(['alpha','beta','gamma'], '๐'))
# ['alpha๐', 'beta๐', 'gamma๐']
์ํจ์์ ์ฅ์ ์ ๋ฌด์์
๋๊น?์ด์์ ์ธ ์ํฉ์์ ์์ํจ์๋ ํน์ ํ ์กฐ์๋ง ์คํํด์ผ ํ๋ค.์์ํจ์๋ ํญ์ ๊ฐ์ ์ถ๋ ฅ์ ๋๋๋ ค์ฃผ๊ณ ๊ฐ์ ์ ๋ ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์์ธกํ ์ ์๊ธฐ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ์ฝ๋ค.์ด๋ฐ ์์ธก ๊ฐ๋ฅํ ํน์ฑ์ ๋ถ์์ฉ์ด ์๊ธฐ ๋๋ฌธ์ ํญ์ ๋ช ๊ฐ์ ์์ํ ๊ธฐ๋ฅ์ ๋ณํ์ ์ผ๋ก ์ดํํ ์ ์๋ค.๊ทธ๊ฒ์ ์ฝ๋๋ฅผ ๋์ฑ ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ๊ฒ ํ๋ค.
์ฃผ์ ๋ด์ฅ ๊ธฐ๋ฅ
Python์ ํจ์์์ด๋ ๋ ์ฑ๋ช ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋ด์ฅ๋ ํจ์ ์งํฉ์ ์ฒจ๋ถํฉ๋๋ค.์ด ํจ์๋ค์ ์์ ํจ์๋ก ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ์์ ๋ฟ๋ง ์๋๋ผ ๋ถ์์ฉ๋ ๋ฐ์ํ์ง ์๋๋ค.
map
ํจ์๋ ํจ์๋ฅผ ์ด๋ค ์กฐ์์ ์ํํ๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก ํ๊ณ iterable๋ฅผ ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก ํ๋ค.์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋กiterable์ ๋ชจ๋ ํญ๋ชฉ์์ ์ํํ๊ณ ์ ๋ฌํ๋ ํจ์๋ฅผ ์ ์ฉํฉ๋๋ค.numbers = [1,2,3,4,5]
def multiply_by5(num):
return num * 5
result = map(multiply_by5, numbers)
print(result) # <map object at 0x7f572dcb7730> (Memory location of the map object)
print(list(result)) # [5, 10, 15, 20, 25] (to get the updated list)
print(numbers) # [1,2,3,4,5] (Unmodified)`
map
ํจ์๋ map
๋์์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ๋ํ ์ธ์ฉ์ ๋๋๋ ค์ค๋๋ค.๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉดlist ํจ์์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.map
ํจ์์ ๋ํด ์ฃผ์ํด์ผ ํ ์ ์ ํจ์์ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ด ๊ฐ์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ด๋ค.map
์
๋ ฅ iterable๋ฅผ ์์ ํ์ง ์์ต๋๋ค.filter
๋ง ๊ทธ๋๋ก ์ ๋ฌ๋ ํจ์์ ๋ฐ๋ผ ์
๋ ฅํ ํธ์ง ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ํํฐํ๋คcolor_to_remove = 'red'
colors = ['blue', 'green', 'black', 'red']
def remove_color(color):
return color != color_to_remove
result = filter(remove_color, colors)
print(list(result)) # ['blue', 'green', 'black']
print(colors) # ['blue', 'green', 'black', 'red'] (Unmodified)
map
์ ๋ง์ฐฌ๊ฐ์ง๋ก filter
ํจ์๋ ํํฐ ๋์์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ฃผ์์ ๋ํ ์ธ์ฉ์ ๋๋๋ ค์ฃผ๊ณ ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํดlist ํจ์์ ์ ๋ฌํด์ผ ํ๋ค.์กฐ๊ฑด์ ๋ฐ๋ผ ์ถ๋ ฅ์ ๊ธธ์ด๊ฐ ์
๋ ฅ ๊ธธ์ด์ ๊ฐ๊ฑฐ๋ ์์ ์ ์์ต๋๋ค.filter
์
๋ ฅ ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋์ง ์์zip
๋ด์ฅ ํจ์๋ ์ฌ๋ฌ ๊ฐ์iterables์ ๊ทธ๋ฃน์ ๋ฐ์๋ค์ด๊ฑฐ๋ ์์กฐ๋ก ์์ถํฉ๋๋ค.์๋ก ๋ค๋ฅธ ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค๋ฅธ ์ด์ ์ ์ฅ๋๊ณ ๊ทธ๋ค์ ๊ด๊ณ์ ๋ฐ๋ผ ์กฐํฉ๋์ด์ผ ํ ๋ ์ด๋ฐ ๊ธฐ๋ฅ์ ๋งค์ฐ ์ ์ฉํ๋ค.emails = ['[email protected]', '[email protected]']
usernames = ['alan', 'ross']
users = list(zip(emails,usernames))
print(users) # [('[email protected]', 'alan'), ('[email protected]', 'ross')]
print(emails) # ['[email protected]', '[email protected]'] (Unmodified)
print(usernames) # ['alan', 'ross']
reduce
๋ ์์์ ์ธ๊ธํ ๋ค๋ฅธ ํจ์์ ์ฝ๊ฐ ๋ค๋ฅด๋ค.reduce
python ํจ์ ๋ด์ฅ์ ์ผ๋ถ๋ถ์ด ์๋๋๋ค.์ด๊ฒ์python ํด์๊ธฐ์ ํจํค์ง์ ํจ๊ป ๋ค์ด๋ก๋ํ ํจํค์ง๋ ๋๊ตฌ ํ
์ดํ์ ์ผ๋ถ๋ถ์
๋๋ค.๊ทธ๋์ functools
๋ชจ๋์์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.์ ์ ํ ๋ชจ๋์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ํ์ํ ๊ฒ์
๋๋ค.reduce
์ข ์ดํด๊ฐ ์ ๊ฐ์.๊ทธ๋ฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ถ์ผarray
๋ฐฉ๋ฒreduce
์ ์ฐธ๊ณ ํ์ฌ ๊ฐ์ ์ผ์ ํ๋ค.๊ทธ๊ฒ์ ๋์ ๊ธฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ถ์ ํ๋ค.reduce
ํจ์์ iterable๋ฅผ ํ์ํ ๋งค๊ฐ ๋ณ์๋ก ๋ฐ์๋ค์ด๊ณ ์ ํํ ์ ์๋ ์ด๊ธฐ๊ฐ ์ค์ ํญ๋ชฉ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ 0์
๋๋ค.reduce
iterable ๊ฐ์ ๊ฐ์ํ๊ฑฐ๋ ๋จ์ผ ๊ฐ์ผ๋ก ํตํฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ฒจ์ง ์ ์๋ค.A great article to understand the reduce function in depth.
from functools import reduce
numbers = [1,2,3,4]
def accumulator(acc, curr):
return acc + curr
sum = reduce(accumulator, numbers, 0)
print(sum) # 10
์ค๋์ ์ฌ๊ธฐ๊น์ง.์ฐ๋ฆฌ๋ ์ฃผ๋ก ํต์ฌ ๊ฐ๋
์ ์ฐ๊ตฌํ๊ณ ํจ์์ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋
์ด ํ์ดํค์ ์ง์ผ๋ณดํ ๊ณ ๊ธ ๋ถ๋ถ์์ ๋ค์ ๋ํ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๋๋ค.๋ด์ผ ๋๋ ๋จ์ ๋ช ๊ฐ์ ํจ์์ ํ๋ก๊ทธ๋๋ฐ ์ฉ์ด๋ฅผ ํต๋
ํ๊ณ ๊ทธ๊ฒ๋ค์ ๋๋ ทํ ๋ฐฉ์์ผ๋ก ๊ณต์ ํ๊ณ ์ถ๋ค.๋๋ ํ์ดํค์ผ๋ก ์๋ก์ด ๊ฐ๋
์ ํ๊ณ ์๋ก์ด ์์ญ์ ํ์ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์๋ก ํฅ๋ถ๋๋ค.๋๋ ๋๊ฐ์ด ํฅ๋ถํ๊ณ ํธ๊ธฐ์ฌ ์๊ฒ ๋ฐ๋ผ๊ฐ์ผ๋ฉด ์ข๊ฒ ์ด.์ฆ๊ฑฐ์ด ์๊ฐ ๋ณด๋ด์ธ์!
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(Python 30์ผ๐จโ๐ป - 11์ผ์งธ - ํจ์์ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/arindamdawn/30-days-of-python-day-11-functional-programming-i-4d9oํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค