begin/end °ýÈ£°¡ ¾øÀ¸¹Ç·Î ÇØ¼®±â¿¡ ÀÇÇÏ¿© ÀÎÁöµÇ´Â ±¸·ìÈ¿Í Àд »ç¶÷»çÀÌÀÇ ºÒÀÏÄ¡°¡ ÀÖÀ» ¼ö ¾ø½À´Ï´Ù. ¿À·¡Àü¿¡ ´ÙÀ½°ú °°Àº C Äڵ带 º» ±â¾ïÀÌ ³³´Ï´Ù:
if (x <= y) x++; y--; z++;¿À·§µ¿¾È µé¿©´Ù º¸°í¼ x > yÀÓ¿¡µµ ºÒ±¸ÇÏ°í ¿Ö y°¡ °¨¼ÒÇÏ´ÂÁö ±Ã±ÝÇß½À´Ï´Ù... (±×¶§ ³ª´Â C Ãʺ¸ÀÚ°¡ ¾Æ´Ï¾ú½À´Ï´Ù.)
½ÃÀÛ/³¡ °ýÈ£°¡ ¾øÀ¸¹Ç·Î, ÆÄÀ̽ãÀº ÄÚµùÀÇ ¹®Á¦°¡ ´ú ÇÕ´Ï´Ù. C¿¡¼´Â (Àϰü¼º ¶§¹®¿¡, ¾î¶°ÇÑ °æ¿ì¿¡´Â ÇѰ³ÀÇ ¼¼ú¹® ÁÖÀ§¿¡µµ °ýÈ£¸¦ ¹èÄ¡ÇÑ´Ù´Â ¼±ÅÃÀ» Æ÷ÇÔÇÏ¿©) °ýÈ£¸¦ ³õ´Â ¼ö ¸¹Àº ´Ù¸¥ ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ÇϳªÀÇ ½ºÅ¸ÀÏÀ» »ç¿ëÇÏ´Â Äڵ带 Àаí (¾²°í) Çϴµ¥¿¡ Àͼ÷ÇØÁö¸é, ¶Ç ´Ù¸¥ ½ºÅ¸ÀÏÀ» ÀÐÀ» ¶§¿¡ (¶Ç´Â ÀÛ¼ºÀ» ÇÊ¿ä·Î ÇÑ´Ù¸é) Àû¾îµµ ¾à°£Àº ºÒÆíÇÒ °ÍÀÔ´Ï´Ù. ¸¹Àº ÄÚµù ½ºÅ¸ÀÏÀº ½ÃÀÛ/³¡ °ýÈ£µéÀº ÇÑÁÙ¿¡ ¹èÄ¡ÇÕ´Ï´Ù. À̰Ͷ§¹®¿¡ ÇÁ·Î±×·¥Àº »ó´çÈ÷ ±æ¾îÁö°í ¾Æ±î¿î È¸é °ø°£À» ³¶ºñÇÏ¿©, ÇÁ·Î±×·¥À» °³°ýÇØ º¸±â°¡ ´õ ¾î·Æ°Ô µË´Ï´Ù. ÀÌ»óÀûÀ¸·Î, ÇÔ¼ö´Â ÇѰ³ÀÇ tty ȸ鿡 ¸Â¾Æ¾ß ÇÕ´Ï´Ù (Áï, 20 ÁÙÁ¤µµ). ÆÄÀ̽㿡¼ 20 ÁÙÀº C¿¡¼ÀÇ 20ÁÙ ÀÌ»óÀÇ °ª¾îÄ¡¸¦ ÇÕ´Ï´Ù. À̰ÍÀº ´ÜÁö ½ÃÀÛ/³¡ °ýÈ£°¡ ¾ø¾î¼°¡ ¾Æ´Õ´Ï´Ù (¼±¾ðÀÌ ¾ø´Ù´Â Á¡µµ µµ¿òÀÌ µË´Ï´Ù, ±×¸®°í ¹°·Ð °·ÂÇÑ ¿¬»êÀº ¸»ÇÒ °Íµµ ¾ø°í), ±×·¯³ª (¾ø¾îµµ) È®½ÇÈ÷ µµ¿òÀÌ µË´Ï´Ù!
ù°·Î, ´õ¿í ´õ ¸í·áÇØÁø °ÍÀº ¸Þ½îµå³ª ½Çü ¼Ó¼ºÀ» Áö¿ª º¯¼ö ´ë½Å¿¡ »ç¿ëÇϰí ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. "self.x" ¶Ç´Â "self.meth()"¸¦ Àо¸é ¿©·¯ºÐÀÌ ±× Ŭ·¡½º Á¤ÀǸ¦ ±â¾ïÇÏÁö ¸øÇÏ´õ¶óµµ ½Çü º¯¼ö ȤÀº ¸Þ½îµå°¡ »ç¿ëµÈ´Ù´Â »ç½ÇÀÌ Àý´ëÀûÀ¸·Î ¸í¹éÇØÁý´Ï´Ù. C++¿¡¼, Áö¿ª º¯¼ö ¼±¾ðÀ» ¾ø¾Ö º½À¸·Î½á ¾à°£Àº ¾Ë¾Æº¼ ¼ö ÀÖ½À´Ï´Ù (Àü¿ª º¯¼ö°¡ º°·Î ¾ø°Å³ª ȤÀº ½±°Ô ÀÎ½ÄµÉ ¼ö ÀÖ´Ù´Â °¡Á¤Çϰí) -- ±×·¯³ª ÆÄÀ̽㿡´Â, Áö¿ª º¯¼ö ¼±¾ðÀÌ ¾ø½À´Ï´Ù, ±×·¡¼ ±× Ŭ·¡½º Á¤ÀǸ¦ È®½ÇÇÏ°Ô ÂüÁ¶ÇÏ¿©¾ßÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù
µÎ¹øÂ°·Î, ƯÁ¤ÇÑ Å¬·¡½º·ÎºÎÅÍ ¸Þ½îµå¸¦ ¸í½ÃÀûÀ¸·Î ÂüÁ¶Çϰųª È£ÃâÇϱ⸦ ¿øÇÑ´Ù°í ÇÒÁö¶óµµ ¾î¶² Ưº°ÇÑ ±¸¹®µµ ÇÊ¿äÇÏÁö ¾Ê´Ù´Â °ÍÀ» ¶æÇÕ´Ï´Ù. C++¿¡¼, ÆÄ»ýµÈ Å©·¡½º°¡ µ¤¾î ¾´ ±âº» Ŭ·¡½º·ÎºÎÅÍ ¸Þ½îµå¸¦ »ç¿ëÇÏ·Á°í ÇÑ´Ù¸é, :: ¿¬»êÀÚ¸¦ »ç¿ëÇØ¾ß ÇÕ´Ï´Ù -- ÆÄÀ̽㿡¼´Â baseclass.methodname(self, <argument list>)·Î »ç¿ëÇÕ´Ï´Ù. À̰ÍÀº ƯÈ÷ __init__() ¸Þ½îµå¿¡ À¯¿ëÇÕ´Ï´Ù, ±×¸®°í ÀϹÝÀûÀ¸·Î ÆÄ»ýµÈ Ŭ·¡½º ¸Þ½îµå°¡ °°Àº À̸§À» °¡Áø ±âº» Ŭ·¡½º ¸Þ½îµå¸¦ È®ÀåÇϱ⸦ ¿øÇÏ¸é ±×¸®ÇÏ¿© ¾î·µç°£ ±âº» Ŭ·¡½º¸¦ È£ÃâÇÏ¿©¾ß¸¸ ÇÏ´Â °æ¿ì¿¡ À¯¿ëÇÕ´Ï´Ù.
¸¶Áö¸·À¸·Î, ½Çü º¯¼ö¿¡ ´ëÇÏ¿©´Â, ÇÒ´ç¿¡ ´ëÇÑ ±¸¹®Àû ¹®Á¦¸¦ ÇØ°áÇÕ´Ï´Ù: ÆÄÀ̽㿡¼ Áö¿ª º¯¼ö´Â (±× Á¤ÀÇ»ó!) ÇÔ¼ö ¸öü¿¡ °ªÀÌ ÇÒ´çµÈ º¯¼öµéÀ̹ǷΠ(±×¸®°í ¸í½ÃÀûÀ¸·Î Àü¿ªº¯¼ö·Î ¼±¾ðµÇÁö ¾ÊÀ¸¹Ç·Î), ÇÒ´çÀÌ Áö¿ª º¯¼ö´ë½Å¿¡ ½Çü º¯¼ö¿¡°Ô ÇÒ´çµÇ°íÀÚ ÇÔÀ» ÀÎÅÍÇÁ¸®ÅÍ¿¡°Ô ¾Ë·ÁÁÙ ¾î¶² ¹æ¹ýÀÌ ÀÖ¾î¾ß ÇÕ´Ï´Ù, ±×¸®°í ±×°ÍÀº (È¿À²¼ºÀÇ ÀÌÀ¯·Î) ±¸¹®ÀûÀÎ °ÍÀÌ ´õ ÁÁ½À´Ï´Ù. C++Àº À̰ÍÀ» ¼±¾ðÀ¸·Î ÇØ°áÇÏÁö¸¸, ÆÄÀ̽ãÀº ¼±¾ðÀ» °¡Áö°í ÀÖÁö ¾ÊÀ¸¸ç ´ÜÁö ÀÌ·¯ÇÑ ¸ñÀûÀ» À§ÇÏ¿© ¼±¾ðÀ» µµÀÔÇØ¾ß¸¸ ÇÑ´Ù¸é ºÒÇàÇÑ ÀÏÀÔ´Ï´Ù. ¸í½ÃÀûÀÎ "self.var"¸¦ »ç¿ëÇÏ°Ô µÇ¸é À̰ÍÀº ¸ÚÁö°Ô ÇØ°áµË´Ï´Ù. ºñ½ÁÇϰÔ, ½Çü º¯¼ö¸¦ À§Çؼ´Â, "self.var"¶ó°í ¾²°Ô µÇ¸é ÇÑ ¸Þ½îµå ¾È¿¡ ÀÖ´Â Çã°¡µÇÁö ¾ÊÀº À̸§µéÀ» ÂüÁ¶Çϱâ À§Çؼ ±× ½ÇüÀÇ µð·ºÅ丮¸¦ Ž»öÇÒ Çʿ䰡 ¾ø´Ù´Â °ÍÀ» ¶æÇÕ´Ï´Ù.
´äº¯ 2: ´ÙÇེ·´°Ôµµ, ½ºÅø®½º ÆÄÀ̽ãÀÌ ÀÖ½À´Ï´Ù, C ½ºÅÃÀ» ÇÇÇØ¼ ¿ÏÀüÇÏ°Ô ´Ù½Ã µðÀÚÀÎµÈ ÀÎÅÍÇÁ¸®ÅÍ È¸µ¹À̸¦ °¡Áý´Ï´Ù. ¿©ÀüÈ÷ ½ÇÇèÀûÀ̱â´Â ÇÏÁö¸¸ ´ë´ÜÈ÷ À¯¸ÁÇÕ´Ï´Ù. ºñ·Ï Ç¥ÁØ ÆÄÀ̽ã°ú ÀÌÁø ¼öÁØ¿¡¼ ȣȯ°¡´ÉÇÔ¿¡µµ ºÒ±¸Çϰí, ½ºÅø®½º ÆÄÀ̽ãÀÌ ÇٽɺηΠÀåÂøµÉÁö´Â ¿©ÀüÈ÷ ºÒ¸íÈ®ÇÕ´Ï´Ù -- ¾Æ¸¶µµ ´ÜÁö ³Ê¹« Çõ¸íÀûÀ̱⠶§¹®ÀÏ °ÍÀÔ´Ï´Ù. ½ºÅø®½º ÆÄÀ̽ãÀº ÇöÀç·Î ¿©±â¿¡ ÀÖ½À´Ï´Ù: http://www.stackless.com/. À̰ÍÀ» »ç¿ëÇÏ´Â microthread ±¸ÇöÀº ¿©±â¿¡¼ ã¾Æ º¼ ¼ö ÀÖ½À´Ï´Ù: http://world.std.com/~wware/uthread.html.
±×·¸Áö¸¸, ÆÄÀ̽㿡¼, À̰ÍÀº Å« ¹®Á¦°¡ ¾Æ´Õ´Ï´Ù. ±â´ÉÀ» Ãß°¡ÇÏ´Â, ´Ù¸¥ ¾ð¾î¿¡¼ÀÇ ¶÷´Ù ÇüÅ¿ʹ ´Ù¸£°Ô, ÆÄÀ̽㠶÷´Ù´Â ³Ê¹« °ÔÀ»·¯¼ ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ¾øÀ»¶§ »ç¿ëÇÏ´Â ´ÜÃà Ç¥±â¹ýÀÏ »ÓÀÔ´Ï´Ù.
ÇÔ¼ö´Â ÆÄÀ̽ãÀÇ ÀÌ¹Ì Ã¹¹øÂ° Ŭ·¡½ºÀ̸ç, Áö¿ª ¿µ¿ª¿¡¼ ¼±¾ðµÉ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î Áö¿ªÀûÀ¸·Î-Á¤ÀÇµÈ ÇÔ¼ö ´ë½Å¿¡ ¶÷´ÙÇüŸ¦ »ç¿ëÇÏ´Â À¯ÀÏÇÑ ÀÌÁ¡À̶ó¸é ±× ÇÔ¼ö¸¦ À§ÇÑ À̸§À» ¸¸µé Çʿ䰡 ¾ø´Ù´Â °ÍÀÔ´Ï´Ù -- ±×·¯³ª ±×°ÍÀº ÇÔ¼ö °´Ã¼°¡ (¶÷´Ù ÇüŰ¡ »êÃâÇÏ´Â °Í°ú Á¤È®ÇÏ°Ô ¶È °°Àº ÇüÅÂÀÇ °´Ã¼ÀÔ´Ï´Ù) ÇÒ´çµÈ Áö¿ª º¯¼öÀÏ »ÓÀÔ´Ï´Ù!
def test(): class factorial: def __call__(self, n): if n<=1: return 1 return n * self(n-1) return factorial()
fact = test()À§ÀÇ factorial()¿¡ ÀÇÇØ¼ »ý¼ºµÈ ½Çü´Â Àç±Í °è½Â ÇÔ¼öó·³ ÇൿÇÕ´Ï´Ù.
»óȣȣÃâÀûÀÎ Àç±Í ÇÔ¼ö´Â ¼·Î°£¿¡ Àμö·Î¼ °Ç³×Áú ¼ö ÀÖ½À´Ï´Ù.
dict.keys()¸¦ È£ÃâÇÏ¸é ±× »çÀüÀ» ½Å¼ÓÇÏ°Ô ÇÑ ¹ø Äf¾î¼ (³»ºÎÀûÀ¸·Î, ¹Ýº¹ ÇÔ¼ö°¡ Á¸ÀçÇÕ´Ï´Ù) ±× Ű °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶Á¡µéÀ» ¹Ì¸®-ÇÒ´çµÈ ÇÕ´çÇÑ Å©±âÀÇ ¸®½ºÆ® °´Ã¼¿¡ º¹»çÇÕ´Ï´Ù. ¹Ýº¹ ½Ã°£Àº ¼ÕÇØ°¡ ¾Æ´Õ´Ï´Ù (¿Ö³ÄÇϸé, ¾î·µç ¹Ýº¹Çؾ߸¸ ÇÒ °ÍÀ̱⠶§¹®ÀÔ´Ï´Ù -- ¸¹Àº °æ¿ì¿¡ ¿©·¯ºÐÀÇ È¸µ¹À̰¡ ´ë´ÜÈ÷ ÀÏÂï Á¾·áÇÏÁö ¾Ê´Â ÇÑ ¸»ÀÌÁö¿ä. (±× ۸¦ ¹«ÀÛÀ§ ¼ø¼·Î ¾òÀ» °ÍÀ̱⠶§¹®¿¡ ´ë´ÜÈ÷ ÀÏÂï Á¾·áÇÏÁö´Â ¾ÊÀ» °ÍÀ̶ó°í »ý°¢ÇÕ´Ï´Ù).
³ª´Â ±× »çÀü ¹Ýº¹ ¿¬»êÀ» ÆÄÀ̽ã ÇÁ·Î±×·¡¸Óµé¿¡°Ô °ø°³ÇÏÁö ¾Ê°í Àִµ¥ ¿Ö³ÄÇÏ¸é »çÀüÀº Àüü ¹Ýº¹ ±â°£Áß¿¡ º¯°æµÇ¾î¼´Â ¾ÈµÇ±â ¶§¹®ÀÔ´Ï´Ù -- ¸¸¾à ±×·¸°Ô µÇ¸é, ±× »çÀüÀÌ ÀçÁ¶Á÷µÉ °¡´É¼ºÀÌ ¾à°£ Àֱ⠶§¹®Àε¥ ¿Ö³ÄÇϸé ÇØ½¬ Å×À̺íÀÌ ³Ê¹« ²Ë Â÷¼, ±× ¹Ýº¹ÀÌ ¾à°£ÀÇ Ç׸ñµéÀ» ³õÄ¡°Ô µÉ ¼ö ÀÖ°í ´Ù¸¥ °ÍµéÀº µÎ¹ø ó¸®ÇÒ °¡´É¼ºÀÌ Àֱ⠶§¹®ÀÔ´Ï´Ù. Á¤È®ÇÏ°Ô ¸»Çϸé À̰ÍÀº ¾ÆÁÖ µåµÑ°Ô ÀϾ¹Ç·Î, ÇÁ·Î±×·¥¿¡ ÀÖ´Â ¹ö±×¸¦ ¼û±â´Â °æÇâÀÌ ÀÖ½À´Ï´Ù: ´ÜÁö ¹Ýº¹ÇÒ ¶§¸¶´Ù ÀÛÀº ¼öÀÇ Ç׸ñÀ» »èÁ¦Çϰųª »ðÀÔÇϱ⸸ ÇÒ »ÓÀ̶ó¸é ±×°ÍÀÌ Å×½ºÆ®Áß¿¡ Àý´ë·Î ÀϾÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀº ½¬¿î ÀÏÀÔ´Ï´Ù -- ±×·¯³ª »ç¿ëÀÚµéÀº Á¶¸¸°£ È®½ÇÈ÷ ±×°Í°ú ¸¶ÁÖÄ¡°Ô µÉ °ÍÀÔ´Ï´Ù.
ÆÄÀ̽㠴º½º±×·ì ȤÀº Áö³ ÆÄÀ̽ã ȸÀÇ¿¡¼ ¼³¸íµÈ ´Ù¼öÀÇ ÇÁ·ÎÁ§Æ®¸¦ º¸¸é, Áö±Ý±îÁö ´Þ¼ºµÈ ±× ¼Óµµ°¡(¿¹. 2x) °Ü¿ì ÂüÀ» Á¤µµÀ̱ä ÇÏÁö¸¸, ÀÌ·¯ÇÑ Á¢±ÙÀÌ °¡´ÉÇØ º¸ÀÔ´Ï´Ù. JPython ¿ª½Ã ÀÚ¹Ù ¹ÙÀÌÆ®ÄÚµå·Î ÄÄÆÄÀÏÇϱâ À§ÇÏ¿© °°Àº Àü·«À» »ç¿ëÇÕ´Ï´Ù. (Jim HuguninÀÌ ¿¹½ÃÇØÁØ ¹Ù¿¡ ÀÇÇϸé Àüü-ÇÁ·Î±×·¥ ºÐ¼®À» ÅëÇÏ¿© ¿©·¯ Á¶ÇÕÀ» ÇØº¸¸é ÀÛÀº µ¥¸ð ÇÁ·Î±×·¥¿¡¼´Â 1000x ¼Óµµ °³¼±µµ °¡´ÉÇØ º¸ÀÔ´Ï´Ù. 1997 ÆÄÀ̽ã ȸÀÇ¿ë À¥ »çÀÌÆ®¸¦ ÂüÁ¶Çϼ¼¿ä.)
³»ºÎÀûÀ¸·Î, ÆÄÀ̽㠼ҽº ÄÚµå´Â ("ÆÄÀ̽㠰¡»ó ±â°è" ȤÀº "¹ÙÀÌÆ®ÄÚµå ÀÎÅÍÇÁ¸®ÅÍ"¿¡ ÀÇÇÏ¿©) ¹ø¿ªµÇ±â Àü¿¡ Ç×»ó "°¡»ó ±â°è ÄÚµå" ¶Ç´Â "¹ÙÀÌÆ® ÄÚµå" Ç¥ÇöÀ¸·Î ¹ø¿ªµË´Ï´Ù. ÀÚÁÖ º¯°æµÇÁö´Â ¾Ê´Â ¸ðµâÀ» ÇØ¼®ÇÏ°í ¹ø¿ªÇÏ´Â ºÎ´ãÀ» ÇÇÇϱâ À§ÇÏ¿©, ÀÌ ¹ÙÀÌÆ® ÄÚµå´Â ±× À̸§ÀÌ ".py"·Î ³¡³ª´Â ÆÄÀϷκÎÅÍ ¸ðµâÀÌ ÇØ¼®µÉ ¶§¸¶´Ù À̸§ÀÌ ".pyc"·Î ³¡³ª´Â ÆÄÀÏ¿¡ ÀÛ¼ºµË´Ï´Ù. ±× »óÀÀÇÏ´Â .py ÆÄÀÏÀÌ º¯°æµÇ¸é, ´Ù½Ã ÇØ¼®µÇ°í ¹ø¿ªµÇ¾î¼ .pyc ÆÄÀÏÀÌ ÀçÀÛ¼ºµË´Ï´Ù.
ÀÏ´Ü .pyc ÆÄÀÏÀÌ ÀûÀç µÇ¸é ¼º´ÉÂ÷ÀÌ´Â ¾ø½À´Ï´Ù. ( .pyc ÆÄÀÏ¿¡¼ ÀÐÀº ¹ÙÀÌÆ® ÄÚµå´Â Á÷Á¢ ¹ø¿ª¿¡ ÀÇÇØ¼ »ý¼ºµÈ ¹ÙÀÌÆ® ÄÚµå¿Í Á¤È®ÇÏ°Ô ¶È °°½À´Ï´Ù). À¯ÀÏÇÑ Â÷ÀÌÁ¡Àº .pyc ÆÄÀÏÀ» ÀûÀçÇÏ´Â °ÍÀÌ .py ÆÄÀÏÀ» ÇØ¼®ÇÏ°í ¹ø¿ªÇÏ´Â °Íº¸´Ù ºü¸£´Ù´Â °ÍÀÔ´Ï´Ù, ±×·¡¼ ¹Ì¸® ÄÄÆÄÀÏµÈ .pyc ÆÄÀÏÀÌ ÀÖ´Ù¸é ÀϹÝÀûÀ¸·Î ÆÄÀ̽㠽ºÅ©¸³Æ®¸¦ ±âµ¿-ÇÏ´Â ½Ã°£À» °³¼±½ÃÄÑ ÁÙ °ÍÀÔ´Ï´Ù. ¿øÇϱ⸸ ÇÑ´Ù¸é, Lib/compileall.py module/script¸¦ »ç¿ëÇØ¼ ÁÖ¾îÁø ¸ðµâ ¸ðÀ½¿¡ ´ëÇÏ¿© À¯È¿ÇÑ .pyc ÆÄÀϵéÀ» °Á¦·Î »ý¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÁÖ¸ñÇÒ °ÍÀº ÆÄÀ̽㿡 ÀÇÇÏ¿© ½ÇÇàµÇ´Â ÁÖ ½ºÅ©¸³Æ®´Â, ±× ÆÄÀÏ À̸§ÀÌ .pyÀ¸·Î ³¡³²¿¡µµ ºÒ±¸Çϰí, .pyc ÆÄÀÏ·Î ÄÄÆÄÀϵÇÁö ¾Ê´Â´Ù´Â °ÍÀÔ´Ï´Ù. ±×°ÍÀº ¹ÙÀÌÆ® ÄÚµå·Î ÄÄÆÄÀϵ˴ϴÙ, ±×·¯³ª ±× ¹ÙÀÌÆ® ÄÚµå´Â ÆÄÀÏ·Î ÀúÀåµÇÁö ¾Ê½À´Ï´Ù.
¸¸¾à ÀÎÅÍÇÁ¸®ÅÍ¿Í ¶óÀ̺귯¸®¸¦ ¹èÆ÷ÇÒ ÇÊ¿ä¾øÀÌ, ÀÌÁøÆÄÀÏ ÇüÅ·Π¹èÆ÷Çϱâ À§ÇÏ¿© ÆÄÀ̽ã ÇÁ·Î±×·¥À» ¹ø¿ªÇÏ´Â ¹æ¹ýÀ» ã°í °è½Å´Ù¸é, freeze.py ½ºÅ©¸³Æ®¸¦ Tools/freeze µð·ºÅ丮¿¡¼ ã¾Æ º¸¼¼¿ä. À̰ÍÀ¸·Î ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥, ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ¿Í, ±×¸®°í ÇÊ¿äÇÑ ÆÄÀ̽㠶óÀ̺귯¸®µîÀ» ÇѰ³ÀÇ ÀÌÁø ÆÄÀÏ·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ¹°·Ð, °á°ú·Î ³ª¿À´Â ÀÌÁø ÆÄÀÏÀº ±×°ÍÀ» ¸¸µå´Âµ¥ »ç¿ëÇß´ø, °°Àº ÇüÅÂÀÇ Ç÷§Æû¿¡¼ ½ÇÇàµÉ °ÍÀÔ´Ï´Ù.
¹Ý¸é¿¡, JPythonÀº ÀÚ¹Ù ½ÇÇà½Ã°£ ¶óÀ̺귯¸®¿¡ ±âÃÊÇÕ´Ï´Ù; ±×·¡¼ ±×°ÍÀº JVM ¾²·¹±â ¼öÁý±â¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ Â÷ÀÌ·Î ÀÎÇÏ¿© ÆÄÀ̽ã Äڵ尡 ÂüÁ¶ Ƚ¼ö ±¸ÇöÀÇ ÇàÀ§¿¡ ±âÃÊÇÔ¿¡µµ ºÒ±¸ÇÏ°í ¾à°£ ¹Ì¹¦ÇÑ ÀÌ½Ä ¹®Á¦°¡ ¹ß»ýÇÕ´Ï´Ù.
Ç¥ÁØ ÆÄÀ̽㿡 ´ëÇÏ¿© ±â¾ïÇÏ¿©ÇÒ µÎ °¡Áö ¿¹¿Ü´Â:
1) ¸¸¾à °´Ã¼°¡ ¼øÈ¯ ÂüÁ¶ °æ·Î¿¡ ÀÖ´Ù¸é ±× ¼øÈ¯°í¸®°¡ ±úÁöÁö ¾Ê´Â ÇÑ Á¦°ÅµÇÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ¿¹:
List = [None] List[0] = ListList´Â ±× ¼øÈ¯°í¸®(List[0]ÀÌ ¸®½ºÆ®ÀÔ´Ï´Ù)°¡ ²÷¾îÁöÁö ¾Ê´Â ÇÑ Á¦°ÅµÇÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ¸®½ºÆ®°¡ Á¦°ÅµÇÁö ¾Ê´Â ÀÌÀ¯´Â ±×°ÍÀÌ Á¢±ÙÇÒ ¼ö ¾ø°Ô µÊ¿¡µµ ºÒ±¸ÇÏ°í ±× ¸®½ºÆ®´Â ±× ÀÚü¿¡ ÂüÁ¶¸¦ °¡Áö°í ÀÖ°í, ÂüÁ¶ Ƚ¼ö ¼¼±â´Â ÇÑ °´Ã¼¸¦ ¸ðµç ÂüÁ¶°¡ ÆÄ±«µÉ ¶§¿¡¸¸ ¾ø¾Ö±â ¶§¹®ÀÔ´Ï´Ù. ¼øÈ¯ ÂüÁ¶ °æ·Î¸¦ ²÷À¸·Á¸é ±× ÂüÁ¶¸¦ ´ÙÀ½°ú °°ÀÌ ÆÄ±«ÇØ¾ß ÇÕ´Ï´Ù.
List[0] = None±×·¡¼, ¸¸¾à ÇÁ·Î±×·¥ÀÌ ¼øÈ¯ ÂüÁ¶¸¦ »ý¼ºÇϸé (±×¸®°í Àå½Ã°£ ½ÇÇàµÇ°í ȤÀº ¸¹Àº ¸Þ¸ð¸®¸¦ ¼ÒºñÇÑ´Ù¸é) ¼øÈ¯ ±¸Á¶¸¦ ¸íÈ®ÇÏ°Ô °ü¸®ÇؾßÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¸¹Àº ¾îÇø®ÄÉÀÌ¼Ç ¿µ¿ª¿¡¼, Ȥ½Ã ÀÖÀ»Áö´Â ¸ð¸£Áö¸¸, À̰ÍÀº ±ØÈ÷ µå¹°°Ô ÇÊ¿äÇÕ´Ï´Ù.
CPython 2.0¿¡¼´Â ÀÌ ¹®Á¦¸¦ ÇØ°á Çߴµ¥ ÁÖ±âÀûÀ¸·Î ¼øÈ¯ Ž»ö ¾Ë°í¸®ÁòÀ» ½ÇÇà½ÃÄѼ Á¢±ÙÇÒ ¼ö ¾ø´Â ¼øÈ¯À» ã¾Æ °ü·ÃµÈ °´Ã¼µéÀ» »èÁ¦ÇÕ´Ï´Ù. »õ·Î¿î gc ¸ðµâÀº ¾²·¹±â ¼öÁýÀ» ¼öÇàÇϰí, µð¹ö±ë Á¤º¸¸¦ ȹµæÇϸç, ±×¸®°í ±× ¾²·¹±â ¼öÁý±âÀÇ ¸Å°³º¯¼ö¸¦ Á¶À²ÇÏ´Â ÇÔ¼öµéÀ» Á¦°øÇÕ´Ï´Ù.
±× ¼øÈ¯ Ž»ö ¾Ë°í¸®ÁòÀ» ¼öÇàÇÏ´Â °ÍÀº ¾à°£ ½Ã°£À» ÇÊ¿ä·Î ÇϹǷÎ, °á°úÀûÀ¸·Î ¾à°£ÀÇ ºÎ´ãÀÌ ÀÖ½À´Ï´Ù. ÆÄÀ̽ã 2.0¿¡¼ ±× ¼øÈ¯ ¼öÁýÀ» °æÇèÇØ º» ÈÄ¿¡, ÆÄÀ̽ã 2.1Àº ±× ºÎ´ãÀ» Á¶½É½º·´°Ô Á¶À²ÇÏ¿© ÃÖ¼ÒÈ ÇÒ ¼ö Àֱ⸦ ¹Ù¶ó°í ÀÖ½À´Ï´Ù. ¾ÆÁ÷±îÁö´Â ¾ó¸¶³ª ¸¹Àº ¼º´ÉÀÌ ÀúÇϵǾú´ÂÁö ¸í¹éÇÏÁö ¾Ê½À´Ï´Ù, ¿Ö³ÄÇϸé À̰ÍÀ» º¥Ä¡¸¶Å·ÇÏ´Â °ÍÀº ²Ä¼öÀûÀÌ°í ±× ÇÁ·Î±×·¥ÀÌ ¾ó¸¶³ª ÀÚÁÖ °´Ã¼¸¦ »ý¼ºÇÏ°í ÆÄ±«ÇÏ´ÂÁö¿¡ Àý´ëÀûÀ¸·Î ÀÇÁ¸Çϱ⠶§¹®ÀÔ´Ï´Ù. ¼øÈ¯À» ŽÁöÇÏ´Â °ÍÀº ÆÄÀ̽ãÀÌ ÄÄÆÄÀÏ µÉ ¶§ »ç¿ëÇÏÁö ¸øÇÏ°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù, ¸¸¾à ¾à°£ÀÇ ¼Óµµ ÀúÇϵµ Çã¿ëÇÒ ¼ö ¾øÀ¸¸ç ±× ¼øÈ¯ ¼öÁýÀÌ ¹®Á¦°¡ ÀÖ´Ù°í ÀǽɵǽŴٸé, ¼³Á¤ ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÒ ¶§¿¡ "-without-cycle-gc" ½ºÀ§Ä¡¸¦ ÁöÁ¤Çϼ¼¿ä.
2) ¶§·Î´Â °´Ã¼°¡ "¿ªÃßÀû(tracebacks)"¿¡ ÀϽÃÀûÀ¸·Î °íÂøµË´Ï´Ù ±×·¯¹Ç·Î ¿¹»ó´ë·Î Á¦°ÅµÇÁö ¾Ê½À´Ï´Ù. ±× ¿ªÃßÀûÀ» ´ÙÀ½°ú °°ÀÌ Á¦°ÅÇϼ¼¿ä
import sys sys.exc_traceback = sys.last_traceback = None¿ªÃßÀûÀº ¿¡·¯¸¦ º¸°íÇÏ°í µð¹ö°Å¸¦ ±¸ÇöÇÏ°í µîµîÀÇ °ü·ÃµÈ °ÍµéÀ» À§ÇÏ¿© »ç¿ëµË´Ï´Ù. ¿ªÃßÀû¿¡´Â ¿¹¿Ü(º¸ÅëÀº °¡Àå ÃÖ±ÙÀÇ ¿¹¿Ü)¸¦ ´Ù·ç´Â µµÁß¿¡ ÃßÃâµÈ ¾à°£ÀÇ ÇÁ·Î±×·¥ Á¤º¸°¡ ÀúÀåµË´Ï´Ù.
¼øÈ¯ ÂüÁ¶¿Í modulo ¿ªÃßÀûÀÌ ¾ø´Ù¸é, ÆÄÀ̽ã ÇÁ·Î±×·¥Àº ¸í½ÃÀûÀ¸·Î ¸Þ¸ð¸®¸¦ °ü¸®ÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù.
¶§·Î Á¦¾È µÇ´Â °ÍÀº ÆÄÀ̽ãÀÌ ÀϹÝÀûÀÎ ¿ÏÀüÇÑ ¾²·¹±â ¼öÁýÀ¸·Î ÇýÅÃÀ» º¼ ¼ö ÀÖ´Ù´Â °ÍÀε¥, ±×·¯¸é ´õ¿í ´õ ÆÄÀ̽ãÀº "ÀÚµ¿ÀûÀÎ" ¾²·¹±â ¼öÁý (GC)À» ȹµæÇÒ °¡´É¼ºÀÌ ¾ø°Ô µÇ¸®¶ó°í º¾´Ï´Ù. ÇÑ ÀÌÀ¯·Î, À̰ÍÀÌ C ¿¡ Ç¥ÁØ »ç¾çÀ¸·Î Ãß°¡µÇÁö ¾Ê´Â ÇÑ, ±×°ÍÀº ¹ßµîÀ§¿¡ ¶³¾îÁø À̽ļºÀ» À§ÇÑ °íÅëÀÔ´Ï´Ù. ³× ¹°·Ð, Àúµµ Xerox ¶óÀ̺귯¸®¿¡ ´ëÇÏ¿© ¾Ð´Ï´Ù. ±×°ÍÀº °¡Àå ÀϹÝÀûÀÎ Ç÷§ÆûµéÀ» À§ÇÑ ¾î¼Àºí·¯ Äڵ带 °¡Áý´Ï´Ù. ¸ðµç °ÍÀº ¾Æ´Õ´Ï´Ù. ±×¸®°í ±×°ÍÀÌ ´ë´ÜÈ÷ Åõ¸íÇϱâ´Â ÇÏÁö¸¸, ÀüÀûÀ¸·Î Åõ¸íÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù (ÇÑ ¶§ ÆÄÀ̽ãÀ» ±×°Í°ú ¿¬°áÇÏ¿© º¸´Ï, ±×°ÍÀº ³»ºÎÀÇ ºñ¹ÐÀ» ½ñ¾Æ³»¾ú½À´Ï´Ù).
"ÀûÀýÇÑ" GC´Â ¶ÇÇÑ ÆÄÀ̽ãÀÌ ´Ù¸¥ ¾îÇø®ÄÉÀ̼ǿ¡ ³»ÀåµÇ¸é ¹®Á¦°¡ µË´Ï´Ù. µ¶-¸³ ÆÄÀ̽㿡¼´Â Ç¥ÁØ malloc()°ú free()¸¦ GC ¶óÀ̺귯¸®°¡ Á¦°øÇÑ ¹öÀüÀ¸·Î ¹Ù²Ù¾îµµ ±¦ÂúÀº ¹Ý¸é¿¡, ÆÄÀ̽ãÀ» ³»ÀåÇÑ ¾îÇø®ÄÉÀ̼ÇÀº ÆÄÀ̽ãÀÇ °ÍÀÌ ¾Æ´Ñ, ÀڽŸ¸ÀÇ malloc()°ú free() ´ëü¹°À» °¡Áö±â¸¦ ¿øÇÒ ¼ö ÀÖ½À´Ï´Ù. Áö±Ý ÇöÀç·Î¼´Â, ÆÄÀ̽ãÀº malloc()°ú free()¸¦ ÀûÀýÇÏ°Ô ±¸ÇöÇÏ´Â ¾î¶² °Í°úµµ Àß ÀÛµ¿ÇÕ´Ï´Ù.
¾²·¹±â ¼öÁýÀ» °¡Áö°í ÀÖ´Â, JPython¿¡¼, ´ÙÀ½ÀÇ ÄÚµå´Â (C ÆÄÀ̽㿡¼´Â ÀÌ»ó¾øÀ½) ¸Þ¸ð¸®¸¦ ´Ù ¼ÒºñÇϱâ Àü¿¡ ¾Æ¸¶µµ ÆÄÀÏ ±â¼úÀÚ¸¦ ´Ù ¼ÒºñÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù:
for file in <very long list of files>: f = open(file) c = f.read(1)ÇöÀçÀÇ ÂüÁ¶ Ƚ¼ö ¼¼±â¿Í ÆÄ±« Àü·«¸¦ »ç¿ëÇϸé, f¿¡ ´ëÇØ »õ·Ó°Ô ÇÒ´çÇÒ ¶§ ¸¶´Ù ±× ÀüÀÇ ÆÄÀÏÀ» ´Ý½À´Ï´Ù. GC¸¦ »ç¿ëÇϸé, À̰ÍÀ» º¸ÁõÇÒ ¼ö ¾ø½À´Ï´Ù. ¹°·Ð, ¿©·¯ºÐÀº ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ »ý°¢ÇØ º¼ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ±×°ÍÀº ±¸Çü(off-the-shelf) ±â¼úÀÌ ¾Æ´Õ´Ï´Ù. ¸¸¾à ¾î¶² ÆÄÀ̽㠱¸Çö°úµµ Àß ÀÛµ¿ÇÒ Äڵ带 ÀÛ¼ºÇϱ⸦ ¿øÇÑ´Ù¸é, ¸í·áÇÏ°Ô ±× ÆÄÀÏÀ» ´Ý¾Æ¾ß¸¸ ÇÕ´Ï´Ù; À̰ÍÀº GC¿Í »ó°ü¾øÀÌ Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù:
for file in <very long list of files>: f = open(file) c = f.read(1) f.close()
»ó¼úÇÑ ¸ðµç °Í¿¡µµ ºÒ±¸Çϰí, ¾î¶² »ç¶÷ÀÌ GC¸¦ ÆÄÀ̽㿡 XeroxÀÇ GC ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ¿© Ãß°¡ÇÏ¿´½À´Ï´Ù, ±×·¡¼ ¸ö¼Ò ã¾Æ º¸½Ç ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½À» º¸¼¼¿ä
http://starship.python.net/crew/gandalf/gc-ss.htmlÈçÇÑ ¸Þ¸ð¸® ´©¼öÇö»óÀ» ¼öµ¿À¸·Î Âó¾î ³»´Â ¹æ¹ý¿¡ ´ëÇÑ °ÍÀº Áú¹® 4.17À» ÂüÁ¶Çϼ¼¿ä.
¿©±â¿¡¼ÀÇ ´äº¯¿¡ ¸¸Á·ÇÏ½Ç ¼ö ¾ø´Ù¸é, ´º½º±×·ì¿¡ ±ÛÀ» ¿Ã¸®±â Àü¿¡, GC¿¡ °üÇÑ Áö³ ³íÀǸ¦ Moshe Zadka°¡ ¿ä¾àÇØ ³õÀº °ÍÀ» ÀÐ¾î º¸¼¼¿ä:
http://www.geocities.com/TheTropics/Island/2932/gcpy.html
º¯°æºÒ°¡´ÉÇÑ ÆÛÇÃÀº ¾à°£ÀÇ Ç׸ñµéÀ» ÇÔ¼ö¿¡ °Ç³Ú Çʿ䰡 ÀÖ°í ±× ÇÔ¼ö°¡ °Ç³×Áø ÅÍÇÃÀ» º¯°æÇϱ⸦ ¿øÇÏÁö ¾ÊÀ» °æ¿ì¿¡ À¯¿ëÇÕ´Ï´Ù; ¿¹¸¦ µé¾î,
point1 = (120, 140) point2 = (200, 300) record(point1, point2) draw(point1, point2)¿©·¯ºÐÀº record()°¡ ±× ÁÂÇ¥µéÀ» º¯°æÇÑ´Ù¸é ¹«½¼ÀÏÀÌ ÀϾÁö »ý°¢ÇÒ Çʿ䰡 Àֱ⸦ ¿øÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. -- º¯°æÇÒ ¼ö´Â ¾øÀ» ÅÙµ¥, ¿Ö³ÄÇÏ¸é ±× ÅÍÇõéÀº º¯°æºÒ°¡´ÉÇϱ⠶§¹®ÀÔ´Ï´Ù.
¹Ý¸é¿¡, °Å´ëÇÑ ¸®½ºÆ®¸¦ µ¿ÀûÀ¸·Î ¸¸µé¶§¿¡´Â, º¯°æ°¡´ÉÇÏ´Ù´Â °ÍÀÌ Àý´ëÀûÀ¸·Î Áß¿äÇÕ´Ï´Ù. -- ¿ä¼ÒµéÀ» ÅÍÇÿ¡ Çϳª¾¿ Ãß°¡ÇÏ´Â °ÍÀº ¿¬°á ¿¬»êÀÚÀÇ »ç¿ëÀ» ¿ä±¸Çϰí, ±×°Í¶§¹®¿¡ Á¦°ö½Ã°£ÀÌ ¼Ò¿äµË´Ï´Ù.
ÀϹÝÀûÀÎ ÇѰ輱À¸·Î¼, ÅÍÇÃÀº C¿¡¼ ±¸Á¶Çü ȤÀº ÆÄ½ºÄ®¿¡¼ ·¹ÄÚµåÇüÀ» »ç¿ëÇÏ´Â °Íó·³ »ç¿ëÇϽðí, ¸®½ºÆ®´Â (°¡º¯ ±æÀÌ) ¹è¿ ó·³ »ç¿ëÇϼ¼¿ä.
À̰ÍÀ¸·Î ¸®½ºÆ®¸¦ ÁöÇ¥ÈÇÏ´Â ¿¬»êÀÇ ºñ¿ëÀº ÁöÇ¥ÀÇ °ª ȤÀº ¸®½ºÆ®ÀÇ Å©±â¿¡ µ¶¸³ÀûÀÌ µË´Ï´Ù.
Ç׸ñµéÀÌ Ãß°¡µÇ°Å³ª »ðÀԵǸé, ±× ÂüÁ¶ ¹è¿Àº Å©±â°¡ º¯ÇÕ´Ï´Ù. Ç׸ñÀ» ¹Ýº¹ÀûÀ¸·Î Ãß°¡ÇÏ´Â ¼º´ÉÀ» °³¼±Çϴµ¥ ¾à°£ÀÇ ÁöÇý¸¦ Àû¿ëÇÏ¿´½À´Ï´Ù; ±× ¹è¿ÀÌ Ä¿Á®¾ß¸¸ ÇÑ´Ù¸é, ¿©ºÐÀÇ °ø°£ÀÌ ÇÒ´çµÇ¾î ´ÙÀ½ ¸î ¹øµ¿¾ÈÀº ½ÇÁ¦ÀûÀÎ Å©±â º¯°æÀ» ¿ä±¸ÇÏÁö ¾Ê°ÔµË´Ï´Ù.
B-Æ®¸®¿Í ºñ±³ÇÏ¿©, À̰ÍÀº ´ëºÎºÐÀÇ È¯°æÇÏ¿¡¼ ´õ ÁÁÀº Ž»ö(³Ê¹«³ªµµ °¡Àå ÈçÇÑ ¿¬»ê) ¼º´ÉÀ» º¸¿© ÁÖ¸ç, ±× ±¸ÇöÀÌ ´õ °£´ÜÇÕ´Ï´Ù.
¸®½ºÆ®·Î »öÀÎµÈ »çÀüÀÌ ÇÊ¿äÇÏ´Ù°í »ý°¢ÇϽŴٸé, ´ë½Å¿¡ ÅÍÇÃÀ» »ç¿ëÇϼ¼¿ä. ÇÔ¼ö tuple(l)Àº ¸®½ºÆ® l°ú ¶È °°Àº Ç׸ñµéÀ» °¡Áö´Â ÅÍÇÃÀÔ´Ï´Ù.
¹Þ¾ÆµéÀÏ ¼ö ¾ø´Â ÇØ°áÃ¥µéµµ Á¦½ÃµÇ¾ú´Âµ¥:
- ÁÖ¼Ò °ª( °´Ã¼ ½ÅºÐ¹øÈ£(object ID))¿¡ ÀÇÇÑ ÇØ½¬ ¸®½ºÆ®. °°Àº °ªÀ¸·Î »õ·Î¿î ¸®½ºÆ®¸¦ ±¸¼ºÇÏ¸é ¹ß°ßµÇÁö ¾ÊÀ» °ÍÀ̱⠶§¹®¿¡ À̰ÍÀº ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù; ¿¹¸¦ µé¾î,
d = {[1,2]: '12'} print d[[1,2]]KeyError ¿¹¿Ü¸¦ ÀÏÀ¸Å³ °ÍÀÔ´Ï´Ù. µÎ¹øÂ° ¶óÀο¡¼ »ç¿ëµÈ [1,2]ÀÇ id°¡ ù ¹øÂ° ¶óÀÎÀÇ id¿Í ´Ù¸£±â ¶§¹®ÀÔ´Ï´Ù. ´Ù¸¥ ¸»·Î Çϸé, »çÀüÀÇ Å°µéÀº 'is'¸¦ »ç¿ëÇÏÁö ¸»°í, '=='¸¦ »ç¿ëÇÏ¿© ºñ±³µÇ¾î¾ß¸¸ ÇÕ´Ï´Ù.
- ¸®½ºÆ®¸¦ Ű·Î »ç¿ëÇÒ ¶§´Â º¹»çº»À» ¸¸µé±â. À̰ÍÀº ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ±× ¸®½ºÆ®´Â (º¯°æ°¡´ÉÇÑ °´Ã¼À̹ǷÎ) Àڽſ¡ ´ëÇÑ ÂüÁ¶Á¡À» Æ÷ÇÔÇÒ ¼ö ÀÖ°í, ±×¸®°í ±× º¹»ç ÄÚµå´Â ½ÇÇàµÇ¾î ¹«ÇÑ È¸µ¹ÀÌ¿¡ ºüÁúÁöµµ ¸ð¸£±â ¶§¹®ÀÔ´Ï´Ù.
- ¸®½ºÆ®¸¦ Ű·Î Çã¿ëÇÏÁö¸¸ »ç¿ëÀÚ°¡ ±×°ÍµéÀ» º¯°æÇÏÁö ¸øÇϵµ·Ï ÇÑ´Ù. À̰ÍÀº ÇÁ·Î±×·¥¿¡¼ ÃßÀû-Çϱâ-¾î·Á¿î ¹ö±×¸¦ °¡Áö´Â Ŭ·¡½º¸¦ Çã¿ëÇϴµ¥ ³ª´Â À̰ÍÀ» ¿ë¼ÇÒ ¼ö ¾ø½À´Ï´Ù; ±×°ÍÀº »çÀüÀÇ Áß¿äÇÑ »ó¼ö¸¦ ¹«È¿ÇÏ°Ô ¸¸µì´Ï´Ù. (d.keys()¿¡ ÀÖ´Â ¸ðµç °ªÀº ±× »çÀüÀÇ Å°·Î »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù).
- ¸®½ºÆ®°¡ »çÀüÀÇ Å°·Î »ç¿ëµÇ¸é Àбâ-Àü¿ëÀ¸·Î Ç¥½ÃÇØ ³õ±â. ¹®Á¦´Â ´ÜÁö ÃÖ»óÀ§-°´Ã¼ ¸¸ÀÌ ±× °ªÀ» º¯°æÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï¶ó´Â °ÍÀÔ´Ï´Ù; ¸®½ºÆ®¸¦ ´ã°í ÀÖ´Â ÅÍÇÃÀ» Ű·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹«¾ð°¡¸¦ »çÀü¿¡ Ű·Î ÀÔ·ÂÇÏ·Á¸é °Å±â·ÎºÎÅÍ µµ´ÞÇÒ ¼ö ÀÖ´Â ¸ðµç °´Ã¼¸¦ Àбâ-Àü¿ëÀ¸·Î Ç¥½ÃÇØ¾ßÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÔ´Ï´Ù -- ±×¸®°í ¶Ç, ÀÚ±â-ÂüÁ¶ÀûÀÎ °´Ã¼´Â ¹«ÇÑ È¸µ¹À̸¦ ´Ù½Ã (¶Ç ´Ù½Ã °è¼ÓÇÏ¿©) ¾ß±âÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÇÊ¿äÇÏ´Ù¸é À̰ÍÀ» ÇÇÇÏ´Â ²Ä¼ö°¡ ÀÖ½À´Ï´Ù, ±×·¯³ª ¿©·¯ºÐÀÇ Ã¥ÀÓÇÏ¿¡ ±×°ÍÀ» »ç¿ëÇϼ¼¿ä: º¯°æ°¡´É ±¸Á¶¸¦ __cmp__¿Í __hash__ ¸Þ½îµå µÑ ´Ù¸¦ °¡Áö´Â Ŭ·¡½º ½Çü ¾È¿¡ Æ÷ÀåÇØ ³ÖÀ» ¼ö ÀÖ½À´Ï´Ù.
class listwrapper: def __init__(self, the_list): self.the_list = the_list def __cmp__(self, other): return self.the_list == other.the_list def __hash__(self): l = self.the_list result = 98767 - len(l)*555 for i in range(len(l)): try: result = result + (hash(l[i]) % 9999999) * 1001 + i except: result = (result % 7777777) + i * 333 return resultÁÖ¸ñÇÒ °ÍÀº ±× ¸®½ºÆ®ÀÇ ¾î¶² ±¸¼º¿øµéÀº ÇØ½¬µÉ ¼ö ¾øÀ» ¼öµµ ÀÖ´Ù´Â °¡´É¼º ±×¸®°í ¶Ç »ê¼úÀûÀÎ ¹ü¶÷ÀÇ °¡´É¼ºÀ¸·Î ÀÎÇÏ¿© ÇØ½¬ °è»êÀÌ º¹ÀâÇÏ´Ù´Â °ÍÀÔ´Ï´Ù.
¹Ýµå½Ã È®ÀÎÇØ¾ß ÇÏ´Â °ÍÀº, ÇÑ »çÀü(¶Ç´Â ÇØ½¬¿¡ ±âÃÊÇÑ ´Ù¸¥ ±¸Á¶)¿¡ Á¸ÀçÇÏ´Â ±×·¯ÇÑ ¸ðµç Æ÷Àå °´Ã¼¸¦ À§ÇÑ ÇØ½¬ °ªÀº, ±× °´Ã¼°¡ ±× »çÀü(¶Ç´Â ´Ù¸¥ ±¸Á¶)¿¡ ÀÖ´Â µ¿¾È¿¡´Â, °íÁ¤µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
°Ô´Ù°¡ Ç×»ó ´ÙÀ½°ú °°ÀÌ ¸¸¾à o1 == o2 (Áï o1.__cmp__(o2)==0)À̶ó¸é, ±× °´Ã¼°¡ »çÀü¿¡ ÀÖ´ÂÁö ¾ø´ÂÁö¿¡ »ó°ü¾øÀÌ, hash(o1)==hash(o2) (Áï, o1.__hash__() == o2.__hash__())À̾î¾ß ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ Á¦ÇÑ»çÇ×µéÀ» ¸¸Á·½ÃŰÁö ¸øÇÑ´Ù¸é »çÀü°ú ÇØ½¬¿¡ ±âÃÊÇÑ ´Ù¸¥ ±¸Á¶µéÀº ¾û¶×ÇÏ°Ô ÇൿÇÒÁöµµ ¸ð¸¨´Ï´Ù!
»ó¼úÇÑ ¸®½ºÆ®Æ÷ÀåÀÚÀÇ °æ¿ì¿¡ ÀÖ¾î¼ ±× Æ÷Àå °´Ã¼°¡ »çÀü¿¡ Á¸ÀçÇÒ ¶§¸¶´Ù ±× Æ÷ÀåµÈ ¸®½ºÆ®´Â ÀÌ»óÁõ»óÀ» ÇÇÇϱâ À§ÇÏ¿© º¯°æµÇ¾î¼´Â ¾ÈµË´Ï´Ù. ±×°ÍµéÀÌ Á¤È®ÇÏ°Ô ÀÏÄ¡µÇÁö ¾ÊÀ» ¶§ÀÇ °á°ú¿Í ±× Çʿ伺¿¡ °üÇÏ¿© ½É°¢ÇÏ°Ô ÀçÂ÷ °í·ÁÇØº¸Áö ¾Ê´ÂÇÑ ÀÌ·¸°Ô ÇÏÁö ¸¶¼¼¿ä. °æ°í ¹Þ½À´Ï´Ù!
¸®½ºÆ®´Â C ³ª ÆÄ½ºÄ® ¼¼°èÀÇ °üÁ¡¿¡¼ ¹è¿ÀÔ´Ï´Ù (Áú¹® 6.16 ÂüÁ¶). ¹è¿ ¸ðµâÀº ¶ÇÇÑ °íÁ¤ ÇüÀÇ ¹è¿À» °£°áÇÑ Ç¥ÇöÀ¸·Î »ý¼ºÇϱâ À§ÇÑ ¸Þ½îµåµéÀ» Á¦°øÇÕ´Ï´Ù (±×·¯³ª ±×°ÍµéÀº À妽º¿¡ ´ëÇÏ¿© ¸®½ºÆ®º¸´Ù ´À¸³´Ï´Ù). ¶Ç ÁÖ¸ñÇÒ °ÍÀº Numerics È®Àå°ú ´Ù¸¥ È®ÀåµéÀº ´Ù¾çÇÑ Æ¯Â¡ ¿ª½Ã °¡Áö´Â À¯»ç-¹è¿ ±¸Á¶¸¦ Á¤ÀÇÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
¸®½ºÇÁ-·ùÀÇ ¸®½ºÆ®¸¦ ȹµæÇϰí, cons cells¸¦ Èä³»³»·Á¸é
lisp_list = ("like", ("this", ("example", None) ) )ÅÍÇÃÀ» »ç¿ëÇϰí (ȤÀº º¯°æ°¡´ÉÀ» ¿øÇϸé, ¸®½ºÆ®¸¦ »ç¿ëÇϼ¼¿ä). ¿©±â¿¡¼ lispÀÇ car°ú À¯»çÇÑ °ÍÀº lisp_list[0]À̰í cdr°ú À¯»çÇÑ °ÍÀº lisp_list[1]ÀÔ´Ï´Ù. ½ÇÁ¦·Î ÇÊ¿äÇÏ´Ù°í È®½ÅÇÒ ¶§¸¸ ÀÌ·¸°Ô Çϼ¼¿ä (±×°ÍÀº º¸Åë ÆÄÀ̽ãÀÇ ¸®½ºÆ®¸¦ »ç¿ëÇÏ´Â °Íº¸´Ù ¸¹ÀÌ ´À¸³´Ï´Ù).
ÆÄÀ̽㠰´Ã¼¸¦ ´ãÀº º¯°æ°¡´ÉÇÑ ÀÌÁúÀûÀÎ ¹è¿·Î¼ ÆÄÀ̽ãÀÇ ¸®½ºÆ®¸¦ °í·ÁÇϼ¼¿ä (¿¹¸¦ µé¾î 10 ¹è ºü¸¨´Ï´Ù :) ).
°á°úÀûÀ¸·Î, Á¤·ÄµÈ ¼ø¼·Î Á¸ÀçÇÏ´Â »çÀüÀÇ Å°µé¿¡ °üÇÏ¿© ¿©±â¿¡ ¹Ýº¹ÇؾßÇÒ °ü¿ë±¸°¡ ÀÖ½À´Ï´Ù:
keys = dict.keys() keys.sort() for key in keys: ...do whatever with dict[key]...
¸ðµâÀ» À§ÇÑ ÈǸ¢ÇÑ Å×½ºÆ® ¸ðµÒÀº ȸ±Í Å×½ºÆ®¸¦ Á¦°øÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ¸ðµâ ÀÎÅÍÆäÀ̽º »ç¾çÀ¸·Î ±â´ÉÇÒ ¼öµµ ÀÖ½À´Ï´Ù (´õ ÁÁÀº °ÍÀº ±×°ÍÀÌ ¿¹Á¦ »ç¿ë¹ýÀ» Á¦°øÇϱ⵵ Çϱ⠶§¹®ÀÔ´Ï´Ù). ¸¹Àº Ç¥ÁØ ¶óÀ̺귯¸®¸¦ »ìÆì º¸¸é ¶§·Î´Â "½ºÅ©¸³Æ® ¹ø¿ª(script interpretation)"À» °¡Áö°í Àִµ¥ °£´ÜÇÑ "ÀÚ±â Å×½ºÆ®(self test)"¸¦ Á¦°øÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. º¹ÀâÇÑ ¿ÜºÎ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ´Â ¸ðµâÁ¶Â÷µµ ¶§·Î´Â ±× ¿ÜºÎ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ, ¾ÆÁÖ ÀÛÀº "±×·çÅͱâ(stub)-Àӽà Å×½ºÆ® ¸ðµâ" Èä³»¸¦ »ç¿ëÇÏ¿© µ¶¸³ÀûÀ¸·Î Å×½ºÆ®µÉ ¼ö ÀÖ½À´Ï´Ù.
ÀûÀýÇÑ Å×½ºÆ® ±ÔÀ²Àº (°Á¦ µÇ¸é) ÆÄÀ̽ãÀ¸·Î °Å´ëÇÏ°í º¹ÀâÇÑ ¾îÇø®ÄÉÀ̼ÇÀ» ±¸ÃàÇÏ´Â °ÍÀ» µµ¿ï ¼ö ÀÖ½À´Ï´Ù »Ó¸¸ ¾Æ´Ï¶ó ÀÎÅÍÆäÀ̽º »ç¾çÀ» °¡Áö´Â °Íµµ ±×·² °ÍÀÔ´Ï´Ù (¶Ç´Â ´õ ÁÁÀ» ¼öµµÀÖ½À´Ï´Ù). ¹°·Ð ÆÄÀ̽㿡 ¿©·¯ºÐÀº ³ª¾àÇØÁö°í ±×·¸°Ô ÇÏÁö ¸ø ÇÕ´Ï´Ù. ¶ÇÇÑ ½±°Ô Å×½ºÆ®Çϱâ À§ÇÏ¿© ´«À¸·Î Äڵ带 µðÀÚÀÎÇϱ⸦ ¿øÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
±â¾ïÇÒ °ÍÀº ÆÄÀ̽㿡¼ÀÇ "type" »ç¿ëÀÌ ÇÑ °´Ã¼ÀÇ C ±¸ÇöÀ» ÂüÁ¶ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¼·Î ´Ù¸¥ Ŭ·¡½ºÀÇ ½Çüµé »çÀ̸¦ ±¸º°ÇÏ·Á¸é Instance.__class__¸¦ »ç¿ëÇϽðí, ¶Ç 4.47À» ÂüÁ¶Çϼ¼¿ä. ¿ë¾î»óÀÇ È¥µ¿¿¡ ´ëÇÏ¿© À¯°¨ÀÔ´Ï´Ù¸¸, ÆÄÀ̽ãÀÇ ¹ßÀü ´Ü°èÀÇ ÀÌ ½ÃÁ¡¿¡¼´Â, ¹¹¶ó°í ¸»ÇÒ ¼ö ¾ø½À´Ï´Ù!
À̰ÍÀº ¼øÈ¯ ÂüÁ¶°¡ ÀÖÀ» °æ¿ì¿¡(Áú¹® 4.17 ÂüÁ¶) ÀϾ´Ï´Ù. Ç®±â ºÒ°¡´ÉÇÑ C ¶óÀ̺귯¸®¿¡ ÀÇÇÏ¿© ÇÒ´çµÈ ¸Þ¸ð¸®µµ ÀÖ½À´Ï´Ù (¿¹¸¦ µé¾î Purify¿Í °°Àº µµ±¸´Â À̰Ϳ¡ °üÇÏ¿© ºÒÆòÀ» ÇÒ °ÍÀÔ´Ï´Ù).
±×·¯³ª ÀϹÝÀûÀ¸·Î, ÆÄÀ̽ã 1.5 À̻󿡼´Â (ÀÌÀüÀÇ ¹öÀü°ú ´ëÁ¶ÀûÀ¸·Î) Á¾·á½Ã¿¡ ´ë´ÜÈ÷ °ø°ÝÀûÀ¸·Î ¸Þ¸ð¸®¸¦ û¼ÒÇÕ´Ï´Ù.
°Á¦ÀûÀ¸·Î ÆÄÀ̽ãÀÌ ÇÒ´ç Ãë¼Ò½Ã¿¡ ¾î¶² °ÍµéÀ» »èÁ¦Çϵµ·Ï Çϱ⸦ ¿øÇÑ´Ù¸é, sys.exitfunc ³¬¾ÆÃ¤±â¸¦ »ç¿ëÇÏ¿© ±×·¯ÇÑ »èÁ¦¸¦ °Á¦Çϼ¼¿ä. ¿¹¸¦ µé¾î ¸¸¾à ¸Þ¸ð¸® ºÐ¼® µµ±¸¸¦ »ç¿ëÇÏ¿© È®Àå ¸ðµâÀ» µð¹ö±ëÇϰí ÀÖ°í ÆÄÀ̽ãÀÌ °ÅÀÇ ¸ðµç °ÍµéÀ» ÇÒ´çÃë¼ÒÇϵµ·Ï °Á¦Çϱ⸦ ¿øÇÑ´Ù¸é ´ÙÀ½°ú °°Àº exitfunc¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù:
import sys
def my_exitfunc(): print "cleaning up" import sys # do order dependant deletions here ... # now delete everything else in arbitrary order for x in sys.modules.values(): d = x.__dict__ for name in d.keys(): del d[name]
sys.exitfunc = my_exitfunc¹°·Ð, ´Ù¸¥ exitfuncs´Â ´ú °·ÄÇÒ ¼ö ÀÖ½À´Ï´Ù.
(»ç½Ç, ÀÌ ÇÔ¼ö´Â ÆÄÀ̽ãÀÌ ÇöÀç ÀÌ¹Ì ÀÚüÀûÀ¸·Î Çϰí ÀÖ´Â °ÍÀ» ¼öÇàÇϰí ÀÖ½À´Ï´Ù; ±×·¯³ª sys.exitfunc¸¦ »ç¿ëÇÏ¿© °Á¦·Î û¼Ò¸¦ ÇÏ´Â ¿¹Á¦´Â ¿©ÀüÈ÷ À¯¿ëÇÕ´Ï´Ù.)
instance.attribute(arg1, arg2)º¸Åë ´ÙÀ½°ú °°ÀÌ µ¿µîÇÏ°Ô ¹ø¿ªµË´Ï´Ù
Class.attribute(instance, arg1, arg2)¿©±â¿¡¼ Class´Â ½ÇüÀÇ (»óÀ§)Ŭ·¡½º ÀÔ´Ï´Ù. ºñ½ÁÇÏ°Ô ´ÙÀ½Àº
instance.attribute = value½ÇüÀÇ ¼Ó¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù (½Çü°¡ »ó¼Ó¹ÞÀº Ŭ·¡½ºÀÇ ¾î¶² ¼Ó¼ºÀÌ¶óµµ µ¤¾î½á¼).
°¡²û ÇÁ·Î±×·¡¸ÓµéÀº ´Ù¸¥ ÇàÀ§¸¦ °¡Áö±â¸¦ ¿øÇÕ´Ï´Ù -- ½Çü¿¡ ¿«¿©ÀÖÁö ¾Ê´Â ¸Þ½îµå ±×¸®°í ÀûÀýÇÏ°Ô º¯°æµÇ´Â Ŭ·¡½º ¼Ó¼ºÀ» ¿øÇÕ´Ï´Ù. ÆÄÀ̽ãÀº ÀÌ·¯ÇÑ ÇàÀ§µéÀ» ¸·Áö ¾Ê½À´Ï´Ù, ±×·¯³ª °ü·ÊÀûÀ¸·Î ±×°ÍµéÀ» ±¸ÇöÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. À̰ÍÀ» ´Þ¼ºÇÏ´Â ÇÑ °¡Áö ¹æ¹ýÀº "¸®½ºÆ® Æ÷ÀåÀÚ(list wrappers)"¿Í Àü¿ª ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.
def C_hello(): print "hello"
class C: hello = [C_hello] counter = [0]
I = C()¿©±â¿¡¼ I.hello[0]()´Â "class method"¿Í ¾ÆÁÖ ¶È °°ÀÌ ÇൿÇÕ´Ï´Ù ±×¸®°í I.counter[0] = 2 ´Â C.counter¸¦ º¯°æÇÕ´Ï´Ù (±×¸®°í ±×°ÍÀ» µ¤¾î¾²Áö ¾Ê½À´Ï´Ù). µµ´ëü ¿Ö ÀÌ·¸°Ô ÇØ¾ß ÇÏ´ÂÁö¸¦ ÀÌÇØ ¸øÇϰڴٸé, ±×°ÍÀº ¿©·¯ºÐÀÌ ¼ø¼öÇϱ⠶§¹®ÀÔ´Ï´Ù, ±×¸®°í ¾Æ¸¶µµ Àý´ë·Î ±×·¸°Ô Çϱ⸦ ¿øÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù! À̰ÍÀº À§ÇèÇÑ ²Ä¼öÀÔ´Ï´Ù, °¡´ÉÇÏ´Ù¸é ÃßõÇÏÁö ¾Ê½À´Ï´Ù. (Tim PeterÀÇ Åä·Ð¿¡¼ ¿µ°¨À» ¾òÀ½.)
ÆÄÀ̽ã 2.2¿¡¼´Â, »õ·ÎÀÌ ³»ÀåµÈ ¿¬»êÀÎ classmethod¿Í staticmethod¸¦ »ç¿ëÇÏ¿© ÀÌ·¸°Ô ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶: http://www.python.org/2.2/descrintro.html#staticmethods
ÀÌ·¯ÇÑ »ç¾ç ¶§¹®¿¡ º¯°æ°¡´É °´Ã¼¸¦ ±âº» °ªÀ¸·Î »ç¿ëÇÏÁö ¾Ê°í, ¿ÀÈ÷·Á ±×°ÍµéÀ» ±× ÇÔ¼ö¿¡ µµÀÔÇÏ´Â °ÍÀÌ ÁÁÀº ÇÁ·Î±×·¡¹Ö °ü½ÀÀÔ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏÁö ¸¶¼¼¿ä:
def foo(dict={}): # XXX shared reference to one dict for all calls ...±×·¯³ª:
def foo(dict=None): if dict is None: dict = {} # create a new dict for local namespaceÀÌ·¯ÇÑ »ç¾ç¿¡ ´ëÇÑ ³íÀǸ¦ º¸·Á¸é "ÆÄÀ̽ãÀ¸·Î ÇÏ´Â ÀÎÅÍ³Ý ÇÁ·Î±×·¡¹Ö(Internet Programming with Python)"ÀÇ 182 ÆäÀÌÁö¸¦ º¸¼¼¿ä. ȤÀº ¶Ç ´Ù¸¥ ³íÀǸ¦ º¸·Á¸é "ÆÄÀ̽ã ÇÁ·Î±×·¡¹ÖÇϱâ(Programming Python)"ÀÇ 144 ÆäÀÌÁö »ó´Ü ¶Ç´Â 277 ÆäÀÌÁö ÇÏ´ÜÀ» º¸¼¼¿ä.
class label: pass # declare a label try: ... if (condition): raise label() # goto label ... except label: # where to goto pass ...À̰ÍÀ¸·Î ȸµ¹ÀÇ Áß¾Ó¿¡ ¶Ù¾î µé ¼ö´Â ¾ø½À´Ï´Ù, ±×·¯³ª º¸Åë ±×°ÍÀº ¾î¶µç gotoÀÇ ³²¿ëÀ̶ó°í °£Áֵ˴ϴÙ. ¾Æ²¸¼ »ç¿ëÇϼ¼¿ä.
±âº» ÀμöµéÀ» »ç¿ëÇϱâ:
def linear(a,b): def result(x, a=a, b=b): return a*x + b return resultȤÀº È£Ãâ°¡´É °´Ã¼¸¦ »ç¿ëÇϱâ:
class linear: def __init__(self, a, b): self.a, self.b = a,b def __call__(self, x): return self.a * x + self.bµÑ ¸ðµÎÀÇ °æ¿ì¿¡:
taxes = linear(0.3,2)¶ó°í Çϸé È£Ãâ°¡´ÉÇÑ °´Ã¼¸¦ ¾ò´Âµ¥ ¿©±â¿¡¼ taxes(10e6) == 0.3 * 10e6 + 2 ÀÔ´Ï´Ù.
±âº» °ª Àü·«Àº ¾àÁ¡ÀÌ Àִµ¥ ±âº» ÀμöµéÀÌ ¿ì¿¬ÇÏ°Ô È¤Àº ¾ÇÀÇÀûÀ¸·Î µ¤¾î¾º¿©Áú ¼ö ÀÖ½À´Ï´Ù. È£Ãâ°¡´É °´Ã¼ Á¢±Ù¹ýÀÇ ¾àÁ¡Àº ¾à°£ ´À¸®°í ¾à°£ ´õ ±æ´Ù´Â °ÍÀÔ´Ï´Ù. ±×·¸Áö¸¸ ÁÖ¸ñÇÒ °ÍÀº È£Ãâ°¡´É °´Ã¼µéÀÇ ¸ðÀÓÀÌ »ó¼ÓÀ» ÅëÇÏ¿© ÀÎÁõÀ» °øÀ¯ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î:
class exponential(linear): # __init__ inherited def __call__(self, x): return self.a * (x ** self.b)comp.lang.python¿¡¼, zenin@bawdycaste.orgÀÌ ÁöÀûÇÑ ¹Ù¿¡ ÀÇÇÏ¸é °´Ã¼´Â ´Ù¼öÀÇ ¸Þ½îµåµéÀ» À§ÇÑ »óÅÂÁ¤º¸¸¦ ĸ½¶È ÇÒ ¼ö ÀÖ¾î¼ ±â´ÉÀû ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡¼ ºô·Á¿Â "¿ïŸ¸®(closure)"ÀÇ °³³äÀ» Èä³»³¾ ¼ö ÀÖ½À´Ï´Ù, ¿¹¸¦ µé¾î:
class counter: value = 0 def set(self, x): self.value = x def up(self): self.value=self.value+1 def down(self): self.value=self.value-1
count = counter() inc, dec, reset = count.up, count.down, count.set¿©±â¿¡¼ inc, dec ±×¸®°í resetÀº (±×·± ½ÄÀ¸·Î »ý°¢ÇϰíÀÚ ÇÑ´Ù¸é) "º¯¼ö count.value¸¦ ´ã°í ÀÖ´Â, °°Àº ¿ïŸ¸®¸¦ °øÀ¯ÇÏ´Â ÇÔ¼öó·³ ÇൿÇÕ´Ï´Ù".
ÁÖ¸ñÇÒ °ÍÀº JPythonÀº ÀÌ·¯ÇÑ Á¦ÇÑÀ» °¡ÁöÁö ¾Ê´Â´Ù´Â °ÍÀÔ´Ï´Ù!
ÀڽŸ¸ÀÇ ¿ª»ç¼± Å»Ãâ 󸮸¦ °¡Áö°íÀÚ Çϴ ó¸®±â(ÁÖ·Î Á¤±Ô Ç¥Çö½Ä ¿£Áø)¿¡ ´ëÇÏ¿©, ÀÔ·ÂÀ» ½±°Ô »ý¼ºÇÒ ¼ö ÀÖµµ·Ï ¹Ì°¡°ø ¹®ÀÚ¿Àº µðÀÚÀÎ µÇ¾ú½À´Ï´Ù. ¾î·µç ±×·¯ÇÑ Ã³¸®±â´Â ÈĹÌÀÇ Â¦ÀÌ ¾ø´Â ¿ª»ç¼±À» ¿¡·¯¶ó°í °£ÁÖÇÕ´Ï´Ù, ±×·¡¼ ¹Ì°¡°ø ¹®ÀÚ¿Àº ±×°ÍÀ» Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù. º¸»óÀ¸·Î, ¿©·¯ºÐÀº ¿ª»ç¼±À¸·Î Å»Ãâ½ÃÅ´À¸·Î½á, ±× ¹®ÀÚ¿¿¡ ÀÎ¿ë ¹®ÀÚ¸¦ ³Ñ°Ü ÁÙ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ±ÔÄ¢Àº ¹Ì°¡°ø ¹®ÀÚ¿(r-strings)ÀÌ ÀǵµÇÑ ¸ñÀû¿¡ »ç¿ëµÉ ¶§´Â Àß ÀÛµ¿ÇÕ´Ï´Ù .
¸¸¾à À©µµ¿ì¿¡¼ °æ·ÎÀ̸§À» ±¸ÃàÇϰíÀÚ ÇÑ´Ù¸é, ÁÖ¸ñÇÒ °ÍÀº ¸ðµç À©µµ¿ì ½Ã½ºÅÛ È£ÃâÀº Á¤»ç¼±µµ ¿ª½Ã ¹Þ¾ÆµéÀδٴ °ÍÀÔ´Ï´Ù:
f = open("/mydir/file.txt") # works fine!µµ½º ¸í·É¾î¿¡ ´ëÇÑ °æ·Î À̸§À» ±¸ÃàÇϰíÀÚ ÇÑ´Ù¸é, ¿¹¸¦ µé¾î ´ÙÀ½ ÁßÀÇ Çϳª¸¦ ½ÃµµÇØ º¸¼¼¿ä
dir = r"\this\is\my\dos\dir" "\\" dir = r"\this\is\my\dos\dir\ "[:-1] dir = "\\this\\is\\my\\dos\\dir\\"
while (line = readline(f)) { ...do something with line... }À̰Ϳ¡ ´ëÇÏ¿© ÆÄÀ̽ãÀ¸·Î´Â ÀÌ·¸°Ô ÀÛ¼ºµÇ¾î¾ß ÇÕ´Ï´Ù:
while 1: line = f.readline() if not line: break ...do something with line...ÀÌ ¹®Á¦´Â ÆÄÀ̽㠴º½º ±×·ì¿¡ ³î¶ó¿ï Á¤µµ·Î ÀÚÁÖ ¿Ã¶ó¿É´Ï´Ù -- µ¥ÀÚ ´º½º¸¦ Ž»öÇÏ¿© ÇÒ´ç Ç¥Çö½Ä¿¡ ´ëÇÑ Áö³ ¸Þ½ÃÁöµéÀ» ã¾Æº¸¼¼¿ä. ÆÄÀ̽ã Ç¥Çö½Ä¿¡¼ ÇÒ´çÀÌ Çã¿ëµÇÁö ¾Ê´Â ÀÌÀ¯´Â ´Ù¸¥ ¾ð¾î¿¡¼ ÀÌ ±¸Á¶¿¡ ÀÇÇØ¼ ¾ß±âµÇ´Â, ÀÚÁÖÀÖ´Â, ã±â-³Ê¹«-¾î·Á¿î ¹ö±× ¶§¹®ÀÔ´Ï´Ù:
if (x = 0) { ...error handling... } else { ...code that only works for nonzero x... }¸¹Àº ´ë¾ÈµéÀÌ Á¦¾ÈµÇ¾ú½À´Ï´Ù. ´ëºÎºÐÀº ÇØÅ· ¼öÁØÀ¸·Î ¾à°£ÀÇ Å¸ÀÚ ¼ö°í¸¦ Àý¾àÇØÁÖ±â´Â ÇÏÁö¸¸ ÀÓÀÇÀûÀÌ°í ºñ¹Ð½º·± ±¸¹® ȤÀº Ű¿öµå¸¦ »ç¿ëÇϱ⠶§¹®¿¡, ¾ð¾î º¯°æ Á¦¾È¿¡ ´ëÇÏ¿© ³»°¡ »ç¿ëÇÑ, °£°áÇÑ ±âÁØ¿¡ ¸ÂÁö ¾Ê½À´Ï´Ù: ±× ±âÁØÀº ¾ÆÁ÷±îÁö ±×·¯ÇÑ ±¸Á¶¸¦ Á¢ÇØ º»ÀûÀÌ ¾ø´Â Àΰ£ µ¶ÀÚ¿¡°Ô ÀûÀýÇÑ Àǹ̸¦ Á¦°øÇؾ߸¸ ÇÕ´Ï´Ù.
À̰Ϳ¡ ´ëÇÏ¿© ¹«¾ð°¡¸¦ ÇÒ ¼ö ÀÖ´Ù¸é ½Å¼ÓÇÏ°Ô ÆÄÀ̽ã 2.0¿¡ ±¸ÇöµÉ °ÍÀÔ´Ï´Ù. -- °íÃľ߸¸ ÇÒ °¡Ä¡°¡ ÀÖ´Ù¸é. Àç¹ÌÀÖ´Â Çö»óÀº ´ëºÎºÐÀÇ °æ·Â ÆÄÀ̽ã ÇÁ·Î±×·¡¸ÓµéÀº "while 1" °ü¿ë±¸¸¦ ÀνÄÇϰí ÀÖ°í Ç¥Çö ±¸Á¶¿¡¼ ±×·¸°Ô ¸¹ÀÌ ÇÒ´çÀ» »©¸Ô´Â °Í °°Áö´Â ¾Ê´Ù´Â °ÍÀÔ´Ï´Ù; ¿À·ÎÁö Ãʺ¸ÀÚ¸¸ÀÌ À̰ÍÀ» ¾ð¾î¿¡ Ãß°¡ÇÏ·Á´Â °·ÄÇÑ ¿å¸ÁÀ» Ç¥ÃâÇÕ´Ï´Ù.
ÇϳªÀÇ ¾ÆÁÖ ¿ì¾ÆÇÑ ÇØ°áÃ¥À̶ó¸é ":="·Î öÀڵǴÂ, Ç¥Çö½Ä¿¡¼ÀÇ ÇÒ´çÀ» À§ÇÑ »õ·Î¿î ¿¬»êÀÚ¸¦ µµÀÔÇÏ´Â °ÍÀÏ °Ì´Ï´Ù. -- À̰ÍÀº "=="¹®Á¦°¡ ¾Æ´Ï¶ó "=" ¹®Á¦¸¦ ÇÇÇϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. this avoids the "=" instead of "==" problem. ±×°ÍÀº ºñ±³ ¿¬»êÀڷμ °°Àº ¿ì¼± ¼øÀ§¸¦ °¡Áú °ÍÀÔ´Ï´Ù ±×·¯³ª ÇØ¼®±â´Â ´Ù¸¥ ºñ±³ ¿¬»êÀÚ¿ÍÀÇ Á¶ÇÕÀ» (°ýÈ£¸¦ °í·Áµµ ÇÏÁö ¾Ê°í) ¿¡·¯·Î ¼±¾ðÇÒ °ÍÀÔ´Ï´Ù.
¸¶Áö¸·À¸·Î -- À̰ÍÀ» öÀÚÇÑ´Ù´Â ´ë¾ÈÀûÀÎ ¹æ½ÄÀº ¸Å·ÂÀûÀ¸·Î º¸ÀÌÁö¸¸ ÀϹÝÀûÀ¸·Î "while 1" ÇØ°áÃ¥º¸´Ù´Â ´ú ưưÇÕ´Ï´Ù:
line = f.readline() while line: ...do something with line... line = f.readline()À̰Ϳ¡ °üÇÑ ¹®Á¦´Â, ¸¸¾à Á¤È®ÇÏ°Ô ¾î¶»°Ô ´ÙÀ½ ¶óÀÎÀ» ¾ò´ÂÁö¿¡ °üÇÏ¿© »ý°¢À» ¹Ù²Û´Ù¸é (¿¹¸¦ µé¾î. ±×°ÍÀ» sys.stdin.readline() ¾ÈÀ¸·Î º¯°æÇϱ⸦ ¿øÇÑ´Ù¸é) ÇÁ·Î±×·¥¿¡¼ µÎ ±ºµ¥¸¦ º¯°æÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ±â¾ïÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù -- µÎ¹øÂ°´Â ±× ȸµ¹ÀÌÀÇ ¾Æ·¡ºÎºÐ¿¡ ¼û¾î ÀÖ½À´Ï´Ù.
°´Ã¼ ÆÄ½ºÄ®, µ¨ÆÄÀÌ, ±×¸®°í C++ °°Àº, ¾î¶² ¾ð¾îµéÀº Á¤Àû ÇüÀ» »ç¿ëÇÕ´Ï´Ù. ±×·¡¼ ¾î¶² ±¸¼º¿øÀÌ "with"Àý¿¡¼ ÇÒ´çµÇ¾ú´ÂÁö¸¦ ¸í·áÇÏ°Ô ¾Ë ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀÌ ÁÖ¿ä ³íÁ¡ÀÔ´Ï´Ù - ±× ÄÄÆÄÀÏ·¯´Â Ç×»ó ÄÄÆÄÀÏ ½Ã°£¿¡ °¢ º¯¼öµéÀÇ ¿µ¿ªÀ» ¾Ë°í ÀÖ½À´Ï´Ù.
ÆÄÀ̽ãÀº µ¿Àû ÇüÀ» »ç¿ëÇÕ´Ï´Ù. ¾î¶² ¼Ó¼ºµéÀÌ ½ÇÇà½Ã°£¿¡ ÂüÁ¶µÉÁö¸¦ ¹Ì¸® ¾Æ´Â °ÍÀº ºÒ°¡´ÉÇÕ´Ï´Ù. ±¸¼º¿ø ¼Ó¼ºµéÀº Ãß°¡µÉ ¼öµµ ÀÖ°í ȤÀº °´Ã¼·ÎºÎÅÍ ºÐÁÖÇÏ°Ô Á¦°Å µÉ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ·± Á¡ ¶§¹®¿¡, ´Ü¼øÇÑ Àбâ·Î´Â, ¾î¶² ¼Ó¼ºÀÌ ÂüÁ¶µÇ°í ÀÖ´ÂÁö - Áö¿ª ¼Ó¼º, Àü¿ª ¼Ó¼º, ȤÀº ±¸¼º¿ø ¼Ó¼ºÀÎÁö¸¦ ¾Ë ¼ö ¾øÀ» °ÍÀÔ´Ï´Ù.
¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ Á¶°¢Äڵ带 ¿¹·Î µé¾î º¾½Ã´Ù (±×·±µ¥ À̰ÍÀº ¹Ì¿Ï¼ºÀ̸ç, ´ÜÁö ±× ¾ÆÀ̵ð¾î¸¦ º¸¿©ÁÖ±â À§ÇÑ °ÍÀÔ´Ï´Ù):
def with_is_broken(a): with a: print xÁ¶°¢ÄÚµå´Â "a"°¡ "x"¶ó°í ºÎ¸£´Â ±¸¼º¿ø ¼Ó¼ºÀ» °¡Á®¾ß¸¸ ÇÑ´Ù°í °¡Á¤ÇÕ´Ï´Ù. ±×·¸Áö¸¸, ÆÄÀ̽㿡¼´Â ¾Æ¹«°Íµµ ±×°ÍÀ» º¸ÀåÇÏÁö ¾Ê½À´Ï´Ù. ¸¸¾à "a"°¡, ¿¹¸¦ µé¾î, Á¤¼ö¶ó¸é ¹«½¼ÀÏÀÌ ÀϾ °ÍÀΰ¡? ±×¸®°í "x"¶ó´Â À̸§ÀÇ Àü¿ª º¯¼ö¸¦ °¡Áö°í ÀÖ´Ù¸é, ±×°ÍÀº ºí·Ï ¾È¿¡¼ »ç¿ëµÇ´Â °ÍÀ¸·Î ³¡³¯ °ÍÀΰ¡? º¸½Ã´Ù½ÃÇÇ, ÆÄÀ̽ãÀÇ µ¿Àû Ư¼ºÀº ±×·¯ÇÑ ¼±ÅÃÀ» ´õ¿í ¾î·Æ°Ô Çϰí ÀÖ½À´Ï´Ù.