±â´ÉÀû ÇÁ·Î±×·¡¹Ö

ÀÌ ÁÖÁ¦¿¡¼­ ¿ì¸®´Â ÆÄÀ̽ãÀÌ ¾î¶»°Ô ¶Ç ´Ù¸¥ ÇÁ·Î±×·¡¹Ö ½ºÅ¸ÀÏÀ» Áö¿øÇÒ¼ö ÀÖ´ÂÁö »ìÆ캻´Ù: ±â´ÉÀû ÇÁ·Î±×·¡¹Ö(Functional Programming(FP)). µÇºÎ¸§¿¡¼­¿Í ¸¶Âù°¡Áö·Î ÀÌ°ÍÀº ÁøÂ¥·Î Áøº¸µÈ ÁÖÁ¦ÀÌ¸ç ¿ì¸®´Â Áö±ÝÇöÀç·Î´Â ±×°ÍÀ» ¹«½ÃÇÏ°í ½ÍÀ» Á¤µµÀÌ´Ù. ±â´ÉÀû Å×Å©´ÐÀº ¸ÅÀϸÅÀÏÀÇ ÇÁ·Î±×·¡¹Ö¿¡¼­ »ç¿ëÇÏ°í ÀÖ´Â °ÍÀ̸ç FPÀÇ ÁöÁöÀÚµéÀº ÀÌ°ÍÀÌ ¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇϱâ À§ÇÑ ±Ùº»ÀûÀ¸·Î ´õ ÁÁÀº ¹æ¹ýÀ̶ó°í ¹Ï°í ÀÖ´Ù.

±â´ÉÀû ÇÁ·Î±×·¡¹ÖÀ̶õ ¹«¾ùÀΰ¡?

±â´ÉÀû ÇÁ·Î±×·¡¹ÖÀº ¸í·ÉÀû(ȤÀº ÀýÂ÷Àû) ÇÁ·Î±×·¡¹Ö°ú È¥µ¿µÇ¾î¼­´Â ¾ÈµÈ´Ù. °´Ã¼ÁöÇâÇü ÇÁ·Î±×·¡¹Ö°úµµ °°Áö ¾Ê´Ù. ±×°ÍÀº ´Ù¸¥ ¾î¶² °ÍÀÌ´Ù. ±×·¸°Ô ±ÞÁøÀûÀÌÁö´Â ¾Ê´Ù, ¿Ö³ÄÇÏ¸é ¿ì¸®°¡ ŽÇèÇÏ·Á´Â ±× °³³äµéÀº Ä£¼÷ÇÑ ÇÁ·Î±×·¡¹Ö °³³äÀÌ´Ù. ´ÜÁö ´Ù¸¥ ¹æ½ÄÀ¸·Î Ç¥ÇöµÇ¾úÀ» »ÓÀÌ´Ù. ¹®Á¦¸¦ Ǫ´Âµ¥ ÀÌ·¯ÇÑ °³³äµéÀÌ Àû¿ëµÇ´Â ¹æ½ÄµÚ¿¡ ¼û°ÜÁø öÇÐÀº ¶ÇÇÑ ¾à°£ ´Ù¸£´Ù.

±â´ÉÀû ÇÁ·Î±×·¡¹ÖÀº Ç¥Çö½Äexpressions¿¡ °üÇÑ °ÍÀÌ ¸ðµÎÀÌ´Ù. »ç½Ç FP¸¦ ±â¼úÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀº ±×°ÍÀ» Ç¥Çö ÁöÇâÀû ÇÁ·Î±×·¡¹Öexpression oriented programmingÀ̶ó°í À̸§ÁöÀ»¼öµµ ÀÖ´Ù. ¿Ö³ÄÇϸé FP¿¡¼­´Â ¸ðµç°ÍÀÌ Ç¥ÇöÀ¸·Î ¼ö·ÅÇÑ´Ù. ¿©·¯ºÐÀº Ç¥Çö½ÄÀÌ º¯¼ö¿Í 󸮹æ¹ýµéÀÇ ÁýÇÕÀ̶ó´Â°ÍÀ» ±â¾ïÇØ¾ß ÇÏ¸ç ±× ÁýÇÕÀº ´Ü ÇϳªÀÇ °ªÀ» °á°ú·Î ÇÑ´Ù´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. ±×·±½ÄÀ¸·Î x == 5 ´Â ºÒ¸®¾ð Ç¥Çö½ÄÀÌ´Ù. 5 + (7-Y) ´Â ¼öÇÐÀû Ç¥Çö½ÄÀÌ´Ù. ±×¸®°í string.search("Hello world", "Hell") ´Â ¹®ÀÚ¿­ Ç¥Çö½ÄÀÌ´Ù. ¸¶Áö¸·ÀÇ °ÍÀº ¶ÇÇÑ string ¸ðµâ¾È¿¡ ÀÖ´Â ÇÔ¼ö È£ÃâÀÌ´Ù ±×¸®°í, ¿ì¸®°¡ ¾ÕÀ¸·Î º¸°Ô µÇµíÀÌ, ÇÔ¼ö´Â FP¿¡¼­ ´ë´ÜÈ÷ Áß¿äÇÏ´Ù (¿©·¯ºÐÀº ÀÌ¹Ì ±× À̸§À¸·ÎºÎÅÍ ¿¹ÃøÇßÀ» °ÍÀÌ´Ù!).

ÇÔ¼ö´Â FP¿¡¼­ °´Ã¼·Î »ç¿ëµÈ´Ù. ´Ù½Ã ¸»Çϸé ÇÔ¼öµéÀº ¶§¶§·Î ÇÁ·Î±×·¥¾È¿¡¼­ ´Ù¸¥ º¯¼öµé°ú ¶È °°Àº ¹æ½ÄÀ¸·Î ³Ñ°ÜÁø´Ù. ¿ì¸®´Â ¿ì¸®ÀÇ ±¸ÀÌ(GUI) ÇÁ·Î±×·¥¿¡¼­ ÀÌ·¯ÇÑ ¿¹¸¦ º¸¾Ò´Ù. °Å±â¿¡¼­ ¿ì¸®´Â ÇÔ¼öÀÇ À̸§À» ¹öÆ° ÄÜÆ®·ÑÀÇ ¸í·É¾î(command) ¼Ó¼ºÀ¸·Î ÇÒ´çÇß´Ù. ¿ì¸®´Â »ç°Ç ó¸®ÀÚ ÇÔ¼ö¸¦ °´Ã¼·Î Ãë±ÞÇÏ°í ±× ÇÔ¼öÀÇ ÂüÁ¶Á¡À» ±× ¹öÆ°¿¡ ÇÒ´çÇß´Ù. ¿ì¸®ÀÇ ÇÁ·Î±×·¥¿¡¼­ ÇÔ¼ö¸¦ ³Ñ°ÜÁشٴ ÀÌ·¯ÇÑ °³³äÀº FP·Î °¡´Â ¿­¼èÀÌ´Ù.

±â´ÉÀû ÇÁ·Î±×·¥Àº ¶ÇÇÑ ´ë´ÜÈ÷ ¸®½ºÆ® ÁöÇâÀûÀÎ °æÇâÀÌ ÀÖ´Ù.

¸¶Áö¸·À¸·Î FP´Â ¹®Á¦ Ç®±âÀÇ ¹æ¹ýº¸´Ù´Â ¹®Á¦ Ç®±âÀÇ Á¤ÀÇ¿¡ ÁýÁßÇÑ´Ù. ´Ù½Ã ¸»ÇÏ¸é ±â´ÉÀû ÇÁ·Î±×·¥Àº ÇعýÀÇ ¸ÅÄ«´ÏÁò¿¡ ÁýÁßÇϱ⠺¸´Ù´Â ¹®Á¦°¡ ÇØ°áµÇµµ·Ï ±â¼úÇؾ߸¸ ÇÑ´Ù. ÀÌ·±½ÄÀ¸·Î ÀÛµ¿ÇÏ´Â °ÍÀ» ¸ñÇ¥·Î ÇÏ´Â ¿©·¯ ÇÁ·Î±×·¡¹Ö ¾ð¾îµéÀÌ Àִµ¥, °¡Àå ³Î¸® ¾²ÀÌ´Â °Í ÁßÀÇ Çϳª´Â Haskell ÀÌ´Ù. HaskellÀÇ À¥»çÀÌÆ®(www.haskell.org)¿¡´Â ÇϽºÄÌ ¾ð¾î»Ó¸¸ ¾Æ´Ï¶ó FPÀÇ Ã¶ÇÐÀ» ±â¼úÇÏ´Â ¼ö¸¹Àº ³í¹®µéÀÌ ÀÖ´Ù. (³ªÀÇ °³ÀÎÀû °ßÇØ·Î º¸¸é ÀÌ ¸ñÇ¥´Â FPÀÇ ¿ËÈ£Àڵ鿡 ÀÇÇØ ¾à°£Àº °úÀåµÈ °¨ÀÌ ÀÖ´Ù. ±×·¸Áö¸¸ Ī¼ÛÇÒ ¸¸ÇÏ´Ù.)

¼ø¼öÇÑ ±â´ÉÀû ÇÁ·Î±×·¥Àº ÇÁ·Î±×·¥ÀÇ Àǵµ¸¦ ¿ä¾àÇϴ ǥÇö½ÄÀ» Á¤ÀÇÇÔÀ¸·Î½á ¸¸µé¾îÁø´Ù. Ç¥Çö½ÄÀÇ °¢ ´Ü¾îµéÀº À̹ø¿¡´Â ¹®Á¦ÀÇ Æ¯Â¡À» ±â¼úÇÏ´Â (¾Æ¸¶µµ ´Ù¸¥ Ç¥ÇöÀ¸·Î ĸ½¶È­µÈ) ¼­¼ú¹®ÀÌ´Ù.±×¸®°í ÀÌ·¯ÇÑ ¿ë¾îµéÀÇ °¢°¢À» Æò°¡ÇÔÀ¸·Î½á °á°úÀûÀ¸·Î ÇعýÀ» »êÃâÇÑ´Ù.

ÀÚ, ÀÌ°ÍÀÌ ±× ÀÌ·ÐÀÌ´Ù. ÀÛµ¿Çϴ°¡? ±×·¸´Ù, ¶§·Î´Â Àß ÀÛµ¿ÇÑ´Ù. ¾î¶² Á¾·ùÀÇ ¹®Á¦¿¡´Â ±×°ÍÀÌ ÀÚ¿¬½º·´°í °­·ÂÇÑ Å×Å©´ÐÀÌ´Ù. ºÒÇàÇÏ°Ôµµ ¸¹Àº ´Ù¸¥ ¹®Á¦¿¡´Â ±×°ÍÀº ¼öÇÐÀû ¿ø¸®¿¡ Å©°Ô ¿µÇâÀ» ¹Þ´Â, ¾ÆÁÖ Ãß»óÀûÀÎ »ç°íÀÇ ½ºÅ¸ÀÏÀ» ¿ä±¸ÇÑ´Ù. °á°úÀûÀ¸·Î »ý±â´Â ÄÚµå´Â °¡²û Æò¹üÇÑ ÇÁ·Î±×·¡¸Ó·Î¼­´Â µµÀúÈ÷ ÀбⰡ ¾î·Æ´Ù. (±×·¯³ª) ±× ÄÚµå´Â ¶ÇÇÑ µ¿µîÇÑ ¸í·ÉÀû Äڵ庸´Ù ¾ÆÁÖ ´ë´ÜÈ÷ ´õ ªÀ¸¸ç ´õ ½Å·ÚÇÒ ¼ö ÀÖ´Ù. ÀüÅëÀûÀÎ ¸¹Àº ¸í·ÉÀû ÇÁ·Î±×·¡¸Ó ȤÀº °´Ã¼ ÁöÇâÀû ÇÁ·Î±×·¡¸ÓµéÀÌ FP¸¦ ¿¬±¸Çϵµ·Ï ÇÑ ¿øµ¿·ÂÀº ¹Ù·Î ÀÌ·¯ÇÑ ÈÄÀÚÀÇ ¼ºÁú ¶§¹®ÀÌ´Ù. Áø½ÉÀ¸·Î ¸ðµç »ç¶÷ÀÌ µ¿ÀÇÇÏÁö´Â ¾Ê°ÚÁö¸¸ ¸ðµç »ç¶÷µéÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Â °­·ÂÇÑ µµ±¸µéÀÌ ÀÖ´Ù.

¾î¶»°Ô ÆÄÀ̽ãÀº ±×·¸°Ô Çϴ°¡?

ÆÄÀ̽ãÀº ÇÁ·Î±×·¡¹Ö¿¡ ±â´ÉÀûÀ¸·Î Á¢±ÙÇÒ¼ö ÀÖµµ·Ï ÇØÁÖ´Â ¾à°£ÀÇ ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ±×°ÍµéÀÌ ÆÄÀ̽ãÀ¸·Î ¾ÆÁÖ ½±°Ô ÀÛ¼ºµÉ ¼ö ÀÖ´Ù´Â Á¡¿¡¼­ ÀÌ·¯ÇÑ ÇÔ¼öµéÀº Á¤¸»·Î Æí¸®ÇÑ »ç¾çÀÌ´Ù. ±×·¸Áö¸¸ ´õ Áß¿äÇÑ °ÍÀº ±×°ÍµéÀÌ Á¦°øµÈ ¹¬½ÃÀûÀÎ Àǵµ ÀÌ´Ù. ´Ù½Ã¸»Çؼ­ ¿øÇϱ⸸ ÇÑ´Ù¸é ÆÄÀ̽ã ÇÁ·Î±×·¡¸Ó°¡ FP ¹æ½ÄÀ¸·Î ÀÛ¾÷ÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ´Â °ÍÀÌ´Ù.

¿ì¸®´Â Á¦°øµÈ ÇÔ¼öµé ¾à°£À» »ìÆ캼 °ÍÀÌ´Ù. ±×¸®°í ¿ì¸®°¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÑ »ùÇà µ¥ÀÌŸ ±¸Á¶¿¡¼­ ±×°ÍµéÀÌ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö »ìÆ캼 °ÍÀÌ´Ù:

spam = ['pork','ham','spices']
numbers = [1,2,3,4,5]

def eggs(item):
    return item

map(aFunction, aSequence)

ÀÌ ÇÔ¼ö´Â ÆÄÀ̽ãÀÇ ÇÔ¼ö, aFunctionÀ» aSequenceÀÇ °¢ ±¸¼º¿ø¿¡ Àû¿ëÇÑ´Ù.
´ÙÀ½ÀÇ Ç¥Çö½ÄÀº :

L = map(eggs, spam)
print L
ÀÌ Ç¥Çö½ÄÀº L ¿¡ ¹ÝȯµÇ´Â, (ÀÌ°æ¿ì¿¡´Â spam°ú µ¿ÀÏÇÑ) »õ·Î¿î ¸®½ºÆ®¸¦ °á°ú·Î ³½´Ù.

¿ì¸®´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ¿© °°Àº ÀÏÀ» ÇÒ¼ö ÀÖ´Ù:

for i in spam:
   L.append(i)
print L

±×·¸Áö¸¸, map ÇÔ¼ö·Î ¿ì¸®´Â ³»Æ÷µÈ ÄÚµå ºí·ÏÀÇ Çʿ伺À» Á¦°ÅÇÒ ¼ö ÀÖ´Ù. ÇÑ°¡Áö °üÁ¡¿¡¼­ º»´Ù¸é ±×°ÍÀº ÇÁ·Î±×·¥ÀÇ º¹À⼺À» ÇÑ ¼öÁØ °¨¼Ò½ÃŲ´Ù. ¿ì¸®´Â ±×°ÍÀ» FPÀÇ µÇºÎ¸§ÀÇ ÁÖÁ¦·Î¼­ »ìÆ캼 °ÍÀÌ´Ù. FPÇÔ¼ö¿¡ ÀÌ°ÍÀ» »ç¿ëÇϸé ÄÚµåÀÇ º¹À⼺ÀÌ ºí·ÏÀ» Á¦°ÅÇÔÀ¸·Î½á »ó´ëÀûÀ¸·Î °¨¼ÒÇÑ´Ù.

filter(aFunction, aSequence)

À̸§ÀÌ ¾Ï½ÃÇÏ´Â ¹Ù¿Í °°ÀÌ filter´Â ±× ÇÔ¼ö°¡ Âü°ªÀ¸·Î ¹ÝȯÇÏ´Â ¿¬¼Ó¿­¿¡¼­ °¢ ¿ä¼Ò¸¦ ÃßÃâÇÑ´Ù ¿ì¸®ÀÇ ¼ýÀÚÀÇ ¸ñ·ÏÀ» »ý°¢Çغ¸ÀÚ. ¸¸¾à ¿ì¸®°¡ ¿ÀÁ÷ Ȧ¼ö¸¸ °¡Áö´Â »õ·Î¿î ¸®½ºÆ®¸¦ ¸¸µé°íÀÚ ÇÑ´Ù¸é ¿ì¸®´Â ±×°ÍÀ» ´ÙÀ½°ú °°ÀÌ ÇÔÀ¸·Î½á »êÃâÇÒ ¼ö ÀÖ´Ù:

def isOdd(n): return (n%2 != 0) # use mod operator
L = filter(isOdd, numbers)
print L

´Ù¸¥ ½ÄÀ¸·Î ¿ì¸®´Â ÀÛ¼ºÇÒ¼ö ÀÖ´Ù:

def isOdd(n): return (n%2 != 0)
for i in numbers:
   if isOdd(i):
      l.append(i)
print L

´Ù½Ã ¶Ç ÁÖ¸ñÇÒ °ÍÀº °ü·ÊÀûÀÎ ÄÚµå´Â µÎ ·¹º§ÀÇ µé¿©¾²±â¸¦ ¿ä±¸ÇÏ¿© °°Àº °á°ú¸¦ ´Þ¼ºÇÑ´Ù´Â °ÍÀÌ´Ù. ¶Ç Áõ°¡ÇÏ´Â µé¿©¾²±â´Â ÄÚµåÀÇ º¹À⼺ÀÌ Áõ°¡ÇѴٴ ǥ½ÃÀÌ´Ù.

reduce(aFunction, aSequence)

reduce ÇÔ¼ö´Â ±× Àǵµ°¡ ¾à°£Àº ºÒºÐ¸íÇÏ´Ù. Á¦°øµÇ¾îÁø ÇÔ¼ö¸¦ ÅëÇÏ¿© ¿ä¼ÒµéÀ» °áÇÕÇÔÀ¸·Î½á ÀÌ ÇÔ¼ö´Â ¸®½ºÆ®¸¦ ÇÑ°³ÀÇ °ªÀ¸·Î ÁÙ¿©ÁØ´Ù ¿¹¸¦ µé¾î ¿ì¸®´Â ¸®½ºÆ®ÀÇ °ªµéÀ» ÇÕÇÒ ¼ö ÀÖ°í ±× Çհ踦 ´ÙÀ½°ú °°ÀÌ ¹ÝȯÇÒ ¼ö ÀÖ´Ù:

def add(i,j): return i+j
print reduce(add, numbers)

Àü°ú °°ÀÌ ¿ì¸®´Â ÀÌ°ÍÀ» ´õ¿í ÀüÅëÀûÀÎ ¹æ½ÄÀ¸·Î ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù.:

L = [] # empty list
res = 0
for i in range(len(numbers)): # use indexing
    res = res + numbers[i]
print res

ÀÌ°ÍÀº ÀÌ°æ¿ì¿¡´Â °°Àº °á°ú¸¦ »êÃâÇϱâ´Â ÇÏÁö¸¸ ±×·¸°Ô Ç×»ó °£´ÜÇÏÁö´Â ¾Ê´Ù. reduce°¡ ½ÇÁ¦ÀûÀ¸·Î ÇÏ´Â ÀÏÀº ±× ¿¬¼Ó¿­ÀÇ Ã¹ ¹ø° µÎ ±¸¼º¿øÀ» ³Ñ°Ü ÁÖ°í ÁÖ¾îÁø ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀÌ¸ç µÎ ¹ø° Ç׸ñÀ» ±× °á°ú·Î ¹Ù²Ù´Â °ÍÀÌ´Ù. ´Ù¸¥ ¸»·Î ÇÏ¸é ´õ¿í ÁÙ¾îÁø Á¤È®ÇÑ Ç¥ÇöÀº ´ÙÀ½°ú °°´Ù:

L = numbers[:] # make a copy of original
while len(L) >= 2:
   i,j = L[0],L[1] # use tuple assignment
   L = [i+j] + L[2:]
print L[0]

Çѹø ´õ ¿ì¸®´Â µé¿©¾²±âµÈ ÄÚµåÀÇ ºí·ÏÀÇ Çʿ伺À» ÇÇÇÔÀ¸·Î½á ÄÚµåÀÇ º¹À⼺À» °¨¼Ò½ÃÅ°´Â FPÀÇ Å×Å©´ÐÀ» »ìÆ캻´Ù.

¶÷´Ù lambda

Áö±Ý±îÁö ¿©·¯ºÐÀÌ ÀÌ ¿¹Á¦µé¿¡¼­ ±ú´Ý¾ÒÀ» Áöµµ ¸ð¸£´Â ÇϳªÀÇ »ç¾çÀº FP ÇÔ¼öµé·Î ³Ñ°ÜÁö´Â ±× ÇÔ¼öµéÀÌ ´ë´ÜÈ÷ ªÀº °æÇâÀÌ ÀÖÀ¸¸ç, ¶§·Î´Â °Ü¿ì ÇÑ ÁÙÀÇ ÄÚµå¶ó´Â °ÍÀÌ´Ù. ¼ö ¸¹Àº ¾ÆÁÖ ÀÛÀº ÇÔ¼öµéÀ» Á¤ÀÇÇÏ´Â ¼ö°í¸¦ ´ú±â À§ÇÏ¿© ÆÄÀ̽ãÀº FP¿¡ ¶Ç ´Ù¸¥ µµ¿òÀ» Á¦°øÇÑ´Ù - lambda

¶÷´Ù´Â À͸íÇÔ¼ö(À̸§¾ø´Â ÇÔ¼ö anonymous function)¶ó°í ÁöĪµÇ°ï ÇÏ´Â ¿ë¾î·Î¼­, À͸íÇÔ¼ö´Â À̸§¾øÀ̵µ ¸¶Ä¡ ÇϳªÀÇ ÇÔ¼öÀÎ°Í Ã³·³ ½ÇÇàµÉ ¼ö ÀÖ´Â ÄÚµå ºí·ÏÀÌ´Ù. ¶÷´Ù´Â Àû¹ýÇÑ ÆÄÀ̽ã Ç¥Çö½ÄÀÌ ³ªÅ¸³¯ ¼ö ÀÖ´Â °÷À̸é ÇÁ·Î±×·¥¾ÈÀÇ ¾îµð¿¡³ª Á¤ÀÇµÉ ¼ö ÀÖÀ¸¸ç, ±×°ÍÀÌ ¶æÇÏ´Â °ÍÀº ¿ì¸®°¡ ±×°ÍµéÀ» ¿ì¸®ÀÇ FP ÇÔ¼ö¾È¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.

¶÷´Ù´Â ´ÙÀ½°ú °°Àº °ÍÀÌ´Ù:

lambda <aParameterList> : <a block of code using the parameters>

±×·±½ÄÀ¸·Î À§ÀÇ add ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ´Ù½Ã ÀÛ¼ºµÉ ¼ö ÀÖ´Ù.:

add = lambda i,j: i+j
±×¸®°í ¿ì¸®´Â Á¤ÀǸ¦ ÇÏ´Â ¶óÀÎÀ» reduceÇÔ¼ö¿¡ ´ëÇÑ È£Ãâ¾È¿¡ ¶÷´Ù¸¦ ¸¸µé¾î¼­, ¿ÏÀüÇÏ°Ô ÇÇÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°ÀÌ:
print reduce(lambda i,j:i+j, numbers)

ºñ½ÁÇÏ°Ô ¿ì¸®´Â ¿ì¸®ÀÇ map°ú filterÀÇ ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ ´Ù½Ã ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù:

L = map(lambda i: i, spam)
print L
L = filter(lambda i: (i%2 != 0), numbers)
print L

´Ù¸¥ ±¸Á¶µé

¹°·Ð ÀÌ·¯ÇÑ ÇÔ¼öµéÀÌ ÀڽŸ¸ÀÇ ¸ñÀûÀ» À§ÇÏ¿©´Â À¯¿ëÇÑ ¹Ý¸é¿¡ ÆÄÀ̽㠾ȿ¡¼­ ¿ÏÀüÇÑ FP ½ºÅ¸ÀÏÀ» Çã¿ëÇϱ⿡´Â ±×°ÍµéÀº ÃæºÐÇÏÁö ¾Ê´Ù. FP Á¢±Ù¹æ½ÄÀ¸·Î ¾ð¾îÀÇ Á¦¾î±¸Á¶°¡ ¶ÇÇÑ º¯°æµÉ ÇÊ¿ä°¡ ÀÖÀ¸¸ç ȤÀº Àû¾îµµ ´ëÄ¡µÉ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÌ°ÍÀ» ´Þ¼ºÇÏ´Â ÇÑ °¡Áö ¹æ¹ýÀ¸·Î´Â ÆÄÀ̽ãÀÌ ºÒ¸®¾ð Ç¥Çö½ÄÀ» Æò°¡ÇÏ´Â ¹æ½Ä¿¡¼­ ¿À´Â ºÎ°¡È¿°ú¸¦ Àû¿ëÇÏ´Â °ÍÀÌ´Ù.

´ÜÃà ȸ·Î Æò°¡

ÆÄÀ̽ãÀº ºÒ¸®¾ð Ç¥Çö½Ä¿¡ ´ëÇÏ¿© ´ÜÃà ȸ·Î Æò°¡ short circuit evaluation¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ÀÌ·¯ÇÑ Ç¥Çö½ÄÀÇ ¾î¶² ¼Ó¼ºµéÀÌ ÀÌ¿ëµÉ ¼ö ÀÖ´Ù. ´ÜÃà-ȸ·Î Æò°¡¿¡ °üÇÏ¿© ¿ä¾àÇϸé : ºÒ¸®¾ð Ç¥Çö½ÄÀÌ Æò°¡µÉ ¶§ ±× Æò°¡´Â ¿ÞÂÊÀÇ Ç¥Çö½Ä¿¡¼­ ½ÃÀÛÇÏ¿© ¿À¸¥ÂÊÀ¸·Î ó¸®ÇÏ´Ù°¡, ¸¶Áö¸· Ãâ·Â°á°ú¸¦ °áÁ¤Çϱâ À§ÇÏ¿© ´õ ÀÌ»ó Æò°¡ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸é Æò°¡¸¦ ÁßÁöÇÑ´Ù.

¾à°£ÀÇ Æ¯º°ÇÑ ¿¹Á¦¸¦ ÅÃÇÏ¿© ¾î¶»°Ô ´ÜÃà ȸ·Î Æò°¡°¡ ÀÛµ¿ÇÏ´ÂÁö »ìÆ캸ÀÚ:

>>> def TRUE:
...   print 'TRUE'
...   return 1 # boolean TRUE
...
>>>def FALSE:
...   print 'FALSE'
...   return 0 # boolean FALSE
...

¸ÕÀú ¿ì¸®´Â ±×°ÍµéÀÌ ¾ðÁ¦ ½ÇÇàµÉÁö ¿ì¸®¿¡°Ô ¾Ë·ÁÁÖ´Â ÇÔ¼ö ±×¸®°í ±×µéÀÇ À̸§°ªÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö, µÎ °³ÀÇ ÇÔ¼ö¸¦ Á¤ÀÇÇÑ´Ù. ÀÌÁ¦ ¿ì¸®´Â ÀÌ°ÍÀ» »ç¿ëÇÏ¿© ¾î¶»°Ô ºÒ¸®¾ð Ç¥Çö½ÄÀÌ Æò°¡µÇ´Â Áö¸¦ ŽÇèÇÒ ¼ö ÀÖ´Ù:

>>>print TRUE() and FALSE()
TRUE
FALSE
0
>>>print TRUE() and TRUE()
TRUE
TRUE
1
>>>print FALSE() and TRUE()
FALSE
0
>>>print TRUE() or FALSE()
TRUE
1
>>>print FALSE() or TRUE()
FALSE
TRUE
1
>>>print FALSE() or FALSE()
FALSE
FALSE
0

ÁÖ¸ñÇ϶ó. AND Ç¥Çö½ÄÀÇ Ã¹ ¹ø° ºÎºÐÀÌ ÂüÀÏ ¶§¸¸ ±×·² ¶§¸¸ µÎ ¹ø° ºÎºÐÀÌ Æò°¡µÈ´Ù. ¸¸¾à ù ¹ø° ºÎºÐÀÌ °ÅÁþÀ̶ó¸é ±×·¯¸é µÎ ¹øÀç ºÎºÐÀº Æò°¡µÇÁö ¾Ê´Â´Ù. ¿Ö³ÄÇÏ¸é ±× Ç¥Çö½Ä Àüü°¡ ÂüÀϼö´Â ¾ø±â ¶§¹®ÀÌ´Ù.

¸¶Âù°¡Áö·Î OR ¸¦ ±âÃÊ·ÎÇÑ Ç¥Çö½Ä¿¡¼­µµ ¸¸¾à ù ¹ø° ºÎºÐÀÌ ÂüÀ̶ó¸é µÎ ¹ø° ºÎºÐÀº Æò°¡µÉ ÇÊ¿ä°¡ ¾ø´Ù. ¿Ö³ÄÇϸé Àüü´Â ¹Ýµå½Ã ÂüÀ̱⠶§¹®ÀÌ´Ù.

¿ì¸®´Â ÀÌ·¯ÇÑ ¼Ó¼ºµéÀ» »ç¿ëÇÏ¿© ¸¶Ä¡ ÇàÀ§(behaviour)¿Í °°ÀÌ ºÐ±â¸¦ ´Ù½Ã ¸¸µé ¼ö ÀÖ´Ù.
¿¹¸¦ µé¾î ¿ì¸®°¡ ´ÙÀ½°ú °°Àº ÄÚµå Á¶°¢À» °¡Áö°í ÀÖ´Ù°í ÇÏÀÚ:

if TRUE(): print "It is True"
else: print "It is False"

¿ì¸®´Â ±×°ÍÀ» FP ½ºÅ¸ÀÏ ±¸Á¶·Î ¹Ù²Ü ¼ö ÀÖ´Ù:

V =  (TRUE() and (print "It is True")) or \
     (print "It is False")

ÀÌ ¿¹Á¦µéÀ» ½ÃÇèÇØ º¸°í ±×¸®°í³ª¼­ TRUE() ¿¡ ´ëÇÑ È£ÃâÀ» FALSE()¿¡ ´ëÇÑ È£Ãâ·Î ´ëÄ¡ÇÏ¿© º¸¶ó. ±×·±½ÄÀ¸·Î ºÒ¸®¾ð Ç¥Çö½Ä¿¡ ´ÜÃà ȸ·Î Æò°¡¸¦ »ç¿ëÇÔÀ¸·Î½á ¿ì¸®´Â ÀüÅëÀûÀÎ if/else ¼­¼ú¹®À» ¿ì¸®ÀÇ ÇÁ·Î±×·¥¿¡¼­ Á¦°ÅÇÏ´Â ±æÀ» ¹ß°ßÇÑ´Ù. ¿©·¯ºÐÀº ±â¾ïÇÒÁöµµ ¸ð¸£°Ú´Ù. µÇºÎ¸§À» ÁÖÁ¦·Î ÇÑ Àå¿¡¼­ ¿ì¸®´Â µÇºÎ¸§ÀÌ È¸µ¹ÀÌ ±¸Á¶¸¦ ´ëüÇϴµ¥ »ç¿ëµÇ¾îÁú ¼ö ÀÖ´Ù´Â °ÍÀ» °üÂûÇß¾ú´Ù. ±×·±½ÄÀ¸·Î À̰͵éÀ» °áÇÕÇÏ¿© ÀÛµ¿½ÃÅ°¸é ¿ì¸®ÀÇ ÇÁ·Î±×·¥¿¡¼­ ¸ðµç ÀüÅëÀûÀÎ Á¦¾î ±¸Á¶¸¦ Á¦°ÅÇÒ ¼ö ÀÖÀ¸¸ç, ±×°ÍµéÀ» ¼ø¼öÇÑ Ç¥Çö½ÄÀ¸·Î ´ëüÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ ¼ø¼öÇÑ FP ½ºÅ¸ÀÏÀÇ ÇعýÀ» ÇâÇÑ Å« ¹ß°ÉÀ½ÀÌ´Ù.

°á ·Ð

ÀÌ ½ÃÁ¡¿¡¼­ ¿©·¯ºÐÀº ¹«¾ùÀÌ Á¤È®È÷ ÀÌ ¸ðµç °ÍÀÇ ¿äÁ¡Àΰ¡ ±Ã±ÝÇÒÁöµµ ¸ð¸£°Ú´Ù? ¿©·¯ºÐÀº È¥ÀÚ°¡ ¾Æ´Ï´Ù. FP°¡ ¸¹Àº ÄÄÇ»ÅÍ °úÇÐ Çа迡 (ƯÈ÷ ¼öÇÐÀڵ鿡°Ô) È£¼ÒÇÏ´Â ¹Ù°¡ ÀÖÁö¸¸ ´ëºÎºÐÀÇ Çö¾÷¿¡ Á¾»çÇÏ´Â ÇÁ·Î±×·¡¸ÓµéÀº FP Å×Å©´ÐÀ» Àß »ç¿ëÇÏÁö ¾Ê´Â °Í °°À¸¸ç ÀÏÁ¾ÀÇ È¥ÇÕÀûÀÎ ¹æ½ÄÀ¸·Î ±×°ÍÀ» ´õ ÀüÅëÀûÀÎ ¸í·ÉÀû ½ºÅ¸ÀÏ°ú È¥ÇÕÇÏ¿© »ç¿ëÇÏ´Â °Í °°´Ù. ±×°ÍÀ» ÇÁ·Î±×·¡¸ÓµéÀº ÀûÀýÇÏ´Ù°í ´À³¤´Ù.

¿©·¯ºÐÀÌ ¸®½ºÆ®¿¡ ÀÖ´Â ¿ä¼Òµé¿¡ ´ëÇÏ¿© 󸮸¦ ÇØ¾ß ÇÑ´Ù¸é 'map, reduce ȤÀº filter'¿Í °°Àº ÇÔ¼öµéÀº ÇعýÀ» Ç¥ÇöÇÏ´Â ÀÚ¿¬½º·¯¿î ¹æ¹ýÀÎ °Íó·³ º¸ÀδÙ. ±×°ÍµéÀ» ¾î¶µç°£ »ç¿ëÇ϶ó. ½ÉÁö¾î´Â ÀÚÁÖ ¿©·¯ºÐÀº µÇºÎ¸§ÀÌ °ü·ÊÀûÀΠȸµ¹ÀÌ º¸´Ù´Â ´õ ÀûÀýÇÏ´Ù´Â °ÍÀ» ¹ß°ßÇÑ´Ù. ½ÉÁö¾î´Â ´õ¿í ÀÚÁÖ ¿©·¯ºÐÀº °ü·ÊÀûÀÎ if/else º¸´Ù´Â ´ÜÃà ȸ·Î Æò°¡¸¦ »ç¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù - ƯÈ÷³ª Ç¥Çö½Ä¾È¿¡¼­ ¿ä±¸µÈ´Ù¸é. ¾î¶°ÇÑ ÇÁ·Î±×·¡¹Ö µµ±¸¸¦ »ç¿ëÇÔ¿¡ À־, öÇÐÀ» µ¿¹ÝÇÏÁö ¸»¾Æ¶ó, ±×º¸´Ù´Â ¾î¶² µµ±¸¶óµµ ±× ÀÛ¾÷¿¡ ¹Ù·Î ¾µ¼ö ÀÖ´Â °¡Àå Àû´çÇÑ °ÍÀ» »ç¿ëÇ϶ó. Àû¾îµµ ¿©·¯ºÐÀº ´ë¾ÈµéÀÌ Á¸ÀçÇÑ´Ù´Â °ÍÀ» ¾ËÁö ¾Ê´Â°¡!

¶÷´Ùlambda¸¦ ¼³¸íÇϱâ À§ÇÑ ¸¶Áö¸· ¿äÁ¡ÀÌ ÀÖ´Ù. FP ¿µ¿ªÀÇ ¹Ù±ùÂÊ¿¡ ÀÖ´Â ÇÑ Áö¿ª¿¡¼­ ¶÷´Ù°¡ ½ÇÁ¦Àû »ç¿ëó¸¦ ã´Â´Ù. ¶÷´Ù´Â ±¸ÀÌ(GUI)ÇÁ·Î±×·¡¹Ö¿¡¼­ »ç°Ç ó¸®ÀÚ¸¦ Á¤ÀÇ Çϴµ¥¿¡ »ç¿ëµÈ´Ù. »ç°Ç ó¸®ÀÚ´Â ÀÚÁÖ ´ë´ÜÈ÷ ªÀº ÇÔ¼öÀ̰ųª, ȤÀº ¾Æ¸¶µµ ´Ü¼øÈ÷ ¸î°³ÀÇ ´Ü´ÜÈ÷ ¿«ÀÎ Àμö °ªµéÀ» °¡Áö°í ¾î¶² Å« ÇÔ¼ö¸¦ È£ÃâÇϰųª ÇÑ´Ù. ¾î´À °æ¿ì¿¡³ª ¶÷´Ù ÇÔ¼ö´Â »ç°Ç ó¸®ÀÚ·Î »ç¿ëµÉ ¼ö À־ ¸¹Àº ¼öÀÇ ÀÛÀº °³º°Àû ÇÔ¼öµéÀ» Á¤ÀÇÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç À̸§¿µ¿ªÀ» °Ü¿ì ´Ü ÇÑ ¹ø¸¸ »ç¿ëµÇ´Â À̸§µé·Î ä¿ï ÇÊ¿ä°¡ ¾ø´Ù. ¶÷´Ù ¼­¼ú¹®Àº ÇÔ¼ö °´Ã¼¸¦ ¹ÝȯÇÑ´Ù´Â °ÍÀ» ±â¾ïÇ϶ó. ÀÌ ÇÔ¼ö °´Ã¼´Â À§Á¬¿¡ º¸³»¾îÁö´Â °´Ã¼ÀÌ¸ç »ç°ÇÀÌ ¹ß»ýÇÏ´Â ¼ø°£¿¡ È£ÃâµÈ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ¿ì¸®°¡ ¾î¶»°Ô Tkinter¿¡¼­ ¹öÆ°À§Á¬À» ¼±¾ðÇÏ´ÂÁö¸¦ ±â¾ïÇÑ´Ù¸é, ±×·¯¸é ¶÷´Ù´Â ´ÙÀ½°ú °°ÀÌ º¸ÀÏ °ÍÀÌ´Ù:

def write(s): print s
b = Button(parent, text="Press Me",
           command = lambda : write("I got pressed!"))
b.pack()

ȤÀº ¹­±â Å×Å©´ÐÀ» »ç¿ëÇϸé, ±×°ÍÀº »ç°Ç °´Ã¼¸¦ Àμö·Î º¸³½´Ù:

def write(s): print s
b = Button(parent, text="Press me")
b.bind(, lambda ev : write("Pressed"))

Çã, ÀÌ°ÍÀÌ ¹Ù·Î ±â´ÉÀû ÇÁ·Î±×·¡¹Ö ±×°ÍÀ» À§ÇÑ °ÍÀÌ´Ù. ¿©·¯ºÐÀÌ ´õ ±íÀÌ ±×°ÍÀ» µé¿©´Ù º¸°í ½ÍÀ¸¸é ¸¹Àº ´Ù¸¥ ÀÚ¿øµéÀÌ ÀÖ´Ù, ¸î¸îÀº ¾Æ·¡¿¡ ³ª¿­ ÇÑ´Ù.

¶Ç´Ù¸¥ ÀÚ¿øµé

¸¸¾à ´©±¸¶óµµ ÁÁÀº ÂüÁ¶Á¡ÀÌ ÀÖ´Ù¸é ³ª¿¡°Ô ÀüÀÚ¸ÞÀÏ ÇÑ ÅëÀ» ¾Æ·¡ ¸µÅ©·Î º¸³»¶ó.


Previous Next Contents
 

¿©·¯ºÐÀÌ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÏ¿© Áú¹® ȤÀº Á¦¾È»çÇ×ÀÌ ÀÖÀ¸¸é ´ÙÀ½ ÁÖ¼Ò¸¦ ÀüÀÚ¸ÞÀÏÀ» º¸³»¶ó: agauld@crosswinds.net