Python 30์ผ๐Ÿ‘จโ€๐Ÿ’ป - 11์ผ์งธ - ํ•จ์ˆ˜์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ดˆ

10392 ๋‹จ์–ด pythonchallenge
๋Œ€์ƒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ชจ๋‘ ๊ฐ™์€ ์›์น™์ธ ๊ด€์‹ฌ์  ๋ถ„๋ฆฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ๋‹ค.๋Œ€์ƒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์†์„ฑ๊ณผ ์กฐ์ž‘์„ ํ•˜๋‚˜์˜ 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()
  • 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๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋‹ค๋ฅธ ํ•จ์ˆ˜์™€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋‹ค.reducepython ํ•จ์ˆ˜ ๋‚ด์žฅ์˜ ์ผ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค.์ด๊ฒƒ์€python ํ•ด์„๊ธฐ์™€ ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ๋‹ค์šด๋กœ๋“œํ•œ ํŒจํ‚ค์ง€๋‚˜ ๋„๊ตฌ ํ…Œ์ดํ”„์˜ ์ผ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.๊ทธ๋ž˜์„œ functools ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.์ž ์‹œ ํ›„ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ํƒ์ƒ‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.reduce ์ข€ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€์š”.๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ถ„์•ผarray ๋ฐฉ๋ฒ•reduce์„ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฐ™์€ ์ผ์„ ํ–ˆ๋‹ค.๊ทธ๊ฒƒ์€ ๋ˆ„์ ๊ธฐ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์ถ”์ ํ•œ๋‹ค.reduce ํ•จ์ˆ˜์™€ iterable๋ฅผ ํ•„์š”ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ด๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • ํ•ญ๋ชฉ์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค.reduceiterable ๊ฐ’์„ ๊ฐ์†Œํ•˜๊ฑฐ๋‚˜ ๋‹จ์ผ ๊ฐ’์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๊ฒจ์งˆ ์ˆ˜ ์žˆ๋‹ค.
    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
    
    ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€.์šฐ๋ฆฌ๋Š” ์ฃผ๋กœ ํ•ต์‹ฌ ๊ฐœ๋…์„ ์—ฐ๊ตฌํ–ˆ๊ณ  ํ•จ์ˆ˜์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฐœ๋…์ด ํŒŒ์ดํ†ค์˜ ์ง„์ผ๋ณดํ•œ ๊ณ ๊ธ‰ ๋ถ€๋ถ„์—์„œ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ๋Š”๋‹ค.๋‚ด์ผ ๋‚˜๋Š” ๋‚จ์€ ๋ช‡ ๊ฐœ์˜ ํ•จ์ˆ˜์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์šฉ์–ด๋ฅผ ํ†ต๋…ํ•˜๊ณ  ๊ทธ๊ฒƒ๋“ค์„ ๋šœ๋ ทํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค.๋‚˜๋Š” ํŒŒ์ดํ†ค์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ํ’€๊ณ  ์ƒˆ๋กœ์šด ์˜์—ญ์„ ํƒ์ƒ‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐˆ์ˆ˜๋ก ํฅ๋ถ„๋œ๋‹ค.๋„ˆ๋„ ๋˜‘๊ฐ™์ด ํฅ๋ถ„ํ•˜๊ณ  ํ˜ธ๊ธฐ์‹ฌ ์žˆ๊ฒŒ ๋”ฐ๋ผ๊ฐ”์œผ๋ฉด ์ข‹๊ฒ ์–ด.
    ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„ ๋ณด๋‚ด์„ธ์š”!

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ