¶Ç ÆÄÀ̽ãÀ©Àº GUI µð¹ö°Åµµ »ç¿ë°¡´ÉÇѵ¥, bdb¿¡ ±âÃÊÇϰí ÀÖÀ¸¸ç, Á¤ÁöÁ¡¿¡ »ö»óÀ» Ç¥ÇöÇÏ¿© ÁÖ°í (ºñ-ÆÄÀ̽ãÀ© ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ´Â °ÍÀ» Æ÷ÇÔÇÏ¿©) »ó´çÈ÷ ÈǸ¢ÇÑ »ç¾çÀ» °¡Áö°í ÀÖ½À´Ï´Ù. ÀÎÅÍÆäÀ̽º¿¡ Àͼ÷ÇØÁö·Á¸é ¾à°£ ¼ö°í¸¦ ÇØ¾ß ÇÏÁö¸¸, ±×·³¿¡µµ ºÒ±¸Çϰí Èï¹Ì ÀÖ½À´Ï´Ù. ÂüÁ¶Á¡Àº ´ÙÀ½¿¡¼ ã¾Æ º¸½Ç ¼ö ÀÖ½À´Ï´Ù
http://www.python.org/ftp/python/pythonwin/pwindex.htmlÃÖ±ÙÀÇ ÆÄÀ̽ãÀ© ¹öÀüÀº ¾×ƼºêÆÄÀ̽ãÀÇ ÀϺημ »ç¿ë°¡´ÉÇÕ´Ï´Ù. ´ÙÀ½À» ÂüÁ¶ Çϼ¼¿ä
http://www.activestate.com/Products/ActivePython/index.html¸®Â÷µå ¿ïÇÁ(Richard Wolff)´Â pdbÀÇ º¯°æµÈ ¹öÀüÀ» ¸¸µé¾ú´Âµ¥, Pydb¶ó°í ºÒ¸®¿ì¸ç, Àαâ ÀÖ´Â µ¥ÀÌŸ Ç¥½Ã µð¹ö°Å(Data Display Debugger (DDD))¿¡ »ç¿ëµÇ°í ÀÖ½À´Ï´Ù. Pydb´Â ´ÙÀ½ http://daikon.tuc.noao.edu/python/¿¡¼ ãÀ» ¼ö ÀÖ°í, ±×¸®°í DDD´Â ´ÙÀ½ http://www.cs.tu-bs.de/softech/ddd/¿¡¼ ¹ß°ßÇÒ ¼ö ÀÖ½À´Ï´Ù.
IDLEÀÇ »óÈ£´ëÈÀûÀÎ °³¹ß ȯ°æÀº, º¸ÅëÀº Ç¥ÁØ ¹èÆ÷º»ÀÇ Tools/idle¿¡¼ »ç¿ë°¡´ÉÇѵ¥, ¶ÇÇÑ ±×·¡ÇÈ µð¹ö°Å¸¦ Æ÷ÇÔÇÕ´Ï´Ù.
# A user-defined class behaving almost identical # to a built-in dictionary. class UserDict: def __init__(self): self.data = {} def __repr__(self): return repr(self.data) def __cmp__(self, dict): if type(dict) == type(self.data): return cmp(self.data, dict) else: return cmp(self.data, dict.data) def __len__(self): return len(self.data) def __getitem__(self, key): return self.data[key] def __setitem__(self, key, item): self.data[key] = item def __delitem__(self, key): del self.data[key] def keys(self): return self.data.keys() def items(self): return self.data.items() def values(self): return self.data.values() def has_key(self, key): return self.data.has_key(key)A2. Áü Ǯư(Jim Fulton)ÀÇ ExtensionClass¸¦ º¸½Ã¸é ½´ÆÛ Ŭ·¡½º¸¦ °¡Áöµµ·Ï Çã¿ëÇÏ´Â ¸ÞÄ«´ÏÁòÀÇ ¿¹¸¦ º¸½Ç ¼ö Àִµ¥ ÆÄÀ̽㿡¼ ±× ½´ÆÛ Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù -- ±×·±½ÄÀ¸·Î ¾î¶² ¸Þ½îµå´Â C ½´ÆÛŬ·¡½º·ÎºÎÅÍ °¡Áú ¼ö ÀÖÀ¸¸ç (À̰ÍÀ» ¼¯¾î³Ö±â(mixin)À̶ó°í ºÎ¸¨´Ï´Ù) ¶Ç ¾î¶² ¸Þ½îµå´Â ÆÄÀ̽ãÀÇ ½´ÆÛŬ·¡½º ȤÀº ¿©·¯ºÐÀÇ ÇϺÎŬ·¡½º·ÎºÎÅÍ °¡Áú ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä http://www.digicool.co m/papers/ExtensionClass.html.
A3. ºÎ½ºÆ® ÆÄÀ̽㠶óÀ̺귯¸® (BPL, http://www.boost.org/libs/python/doc/index.html)¿¡¼´Â C++À¸·ÎºÎÅÍ ÀÌ·¸°Ô ÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù (Áï. BPLÀ» »ç¿ëÇØ¼ C++·Î ÀÛ¼ºµÇ¾îÁø È®Àå Ŭ·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù).
ÆÄÀ̽ã 2.0¿¡¼, curses ¸ðµâÀº ±ØÀûÀ¸·Î È®´ëµÇ¾î¼, ¿Ã¸®¹ö ¾Èµå¸®È÷(Oliver Andrich)ÀÇ °³¼±µÈ ¹öÀüÀ¸·ÎºÎÅÍ ½ÃÀÛÇÏ¿©, ncurses¿Í SYSV curses·ÎºÎÅÍ ¿Â ¸¹Àº ºÎ°¡ÀûÀÎ ±â´ÉµéÀ» Á¦°øÇÕ´Ï´Ù. »ö»ó, ´ëüÀûÀÎ ¹®ÀÚ ¸ðÀ½ Áö¿ø, µ¡´ë±â, ±×¸®°í ¸¶¿ì½º Áö¿ø°ú °°Àº ±â´ÉµéÀ» Á¦°øÇÕ´Ï´Ù. À̰ÍÀº °ð ±× ¸ðµâÀÌ BSD curses¸¸À» °¡Áö´Â ¿î¿µÃ¼Á¦¿Í ´õÀÌ»ó ȣȯµÇÁö ¾Ê´Â´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù, ±×·¯³ª ÀÌ ¹üÁÖ¿¡ µé¾î°¥ ¸¸ÇÑ ¿î¿µÃ¼Á¦µéÀÌ ÇöÀç À¯ÁöµÇ°í ÀÖ´Â °Í °°Áö´Â ¾Ê½À´Ï´Ù
ÆÄÀ̽ã 1.5.2¿¡´Â: sys¸¦ ¼öÀÔÇϰí ÇÔ¼ö¸¦ sys.exitfunc¿¡ ÇÒ´çÇÒ Çʿ䰡 Àִµ¥, ±×°ÍÀº ÇÁ·Î±×·¥ÀÌ Á¾·áÇÒ ¶§, 󸮵ÇÁö ¾ÊÀº ¿¹¿Ü¿¡ ÀÇÇÏ¿© »ç¸ÁÇÒ¶§, ȤÀº (À¯´Ð½º¿¡¼) SIGHUP ¶Ç´Â SIGTERMit ½ÅÈ£¸¦ Á¢¼öÇÒ ¶§ È£ÃâµÉ °ÍÀÔ´Ï´Ù.
class MultiplierClass: def __init__(self, factor): self.factor = factor def multiplier(self, argument): return argument * self.factor
def generate_multiplier(factor): return MultiplierClass(factor).multiplier
twice = generate_multiplier(2) print twice(10) # Output: 20¶Ç ´Ù¸¥ ÇØ°áÃ¥Àº ±âº» Àμö°ªÀ» »ç¿ëÇÕ´Ï´Ù, ¿¹¸¦ µé¾î:
def generate_multiplier(factor): def multiplier(arg, fact = factor): return arg*fact return multiplier
twice = generate_multiplier(2) print twice(10) # Output: 20
list.reverse() try: for x in list: "do something with x" finally: list.reverse()À̰ÍÀº ´ÜÁ¡ÀÌ Àִµ¥ ±× ȸµ¹ÀÌ ¾È¿¡ ÀÖ´Â µ¿¾È¿¡ ±× ¸®½ºÆ®´Â ÀÓ½ÃÀûÀ¸·Î ¿ªÀ¸·Î µË´Ï´Ù. À̰ÍÀÌ ½È´Ù¸é, º¹»çº»À» ¸¸µé ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ´ë°¡°¡ ºñ½Ñ °Í °°ÀÌ º¸ÀÌÁö¸¸ ½ÇÁ¦ÀûÀ¸·Î´Â ´Ù¸¥ ¾î¶² ÇØ°áÃ¥µéº¸´Ù ºü¸¨´Ï´Ù:
rev = list[:] rev.reverse() for x in rev: <do something with x>¸¸¾à ¸®½ºÆ®°¡ ¾Æ´Ï¶ó¸é, ´õ¿í ÀϹÝÀûÀ̱ä ÇÏÁö¸¸ ´õ ´À¸° ÇØ°áÃ¥Àº ´ÙÀ½°ú °°½À´Ï´Ù:
for i in range(len(sequence)-1, -1, -1): x = sequence[i] <do something with x>´õ¿í ¿ì¾ÆÇÑ ÇØ°áÃ¥Àº, ¿¬¼Ó¿Ã³·³ ÇൿÇÏ°í ±× ¿ä¼ÒµéÀ» ¿ªÀÇ ¼ø¼·Î »êÃâÇϴ Ŭ·¡½º¸¦ Á¤ÀÇÇÏ´Â °ÍÀÔ´Ï´Ù (½ºÆ¼ºê ¸ÓÁ¦½ºÅ°(Steve Majewski)ÀÇ ¹è·Á¿¡ ÀÇÇÑ ÇØ°áÃ¥):
class Rev: def __init__(self, seq): self.forw = seq def __len__(self): return len(self.forw) def __getitem__(self, i): return self.forw[-(i + 1)]ÀÌÁ¦ °£°áÇÏ°Ô ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù:
for x in Rev(list): <do something with x>ºÒÇàÇϰԵµ, ÀÌ ÇØ°áÃ¥Àº ÀÌ ¸ðµç °ÍÁß °¡Àå ´À¸³´Ï´Ù, ¸Þ½îµå È£Ã⠺δ㶧¹®¿¡...
±â¾ïÇÏ½Ç °ÍÀº ´Ù¸¥ ÇÁ·Î±×·¡¹Ö °æÇèÀ¸·ÎºÎÅÍ ¾Ë°í ÀÖ´Â, ¸¹Àº Ç¥ÁØ ÃÖÀûÈ °æÇèµéÀÌ ÆÄÀ̽㿡µµ Àß Àû¿ëµÉ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î Ä¿³Î ½Ã½ºÅÛ È£ÃâÀÇ ºÎ´ãÀ» ÇÇÇϱâ À§ÇÏ¿© ÀÛÀº Ãâ·Â±â¸¦ »ç¿ëÇÏ´Â °Íº¸´Ù ´õ Å« Ãâ·Â±â¸¦ »ç¿ëÇÏ¿© Ãâ·Â ÀåÄ¡¿¡ Ãâ·ÂÀ» º¸³»´Â °ÍÀÌ ´õ ºü¸¦ ¼öµµ ÀÖ½À´Ï´Ù. ±×·±½ÄÀ¸·Î "ÇÑ ¹ø¿¡" ¸ðµç Ãâ·ÂÀ» ½á³»´Â CGI ½ºÅ©¸³Æ®°¡ ¸¹Àº Á¶°¢ÀÇ Ãâ·ÂÀ» ½á ³»´Â ½ºÅ©¸³Æ®º¸´Ù ÇöÀúÇÏ°Ô ´õ ºü¸¦ ¼öµµ ÀÖ½À´Ï´Ù.
¶ÇÇÑ, ÀûÀýÇÑ °÷¿¡ È®½ÇÇÏ°Ô "ÁýÇÕ(aggregate)" ¿¬»êÀ» »ç¿ëÇϼ¼¿ä. ¿¹¸¦ µé¾î "Á¶°¢ ½ä±â(slicing)" »ç¾çÀ¸·Î ÇÁ·Î±×·¥Àº, °íµµ·Î ÃÖÀûÈµÈ C ±¸ÇöÀ» »ç¿ëÇÏ¿©, ¸®½ºÆ®¿Í ´Ù¸¥ ¿¬¼Ó¿ °´Ã¼µéÀ» ÀÎÅÍÇÁ¸®ÅÍÀÇ ÁÖȸµ¹ÀÌÀÇ ÇÑ ¼ø°£¿¡ ½ä ¼ö ÀÖ½À´Ï´Ù. ±×¸®ÇÏ¿© °°Àº È¿°ú¸¦ ´ÙÀ½°ú °°ÀÌ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
L2 = [] for i in range[3]: L2.append(L1[i])À̰ÍÀÌ »ç¿ëÇϱ⿡ ÈξÀ ´õ ª°í ºü¸¨´Ï´Ù
L2 = list(L1[:3]) # "list" is redundant if L1 is a list.ÁÖ¸ñÇÒ °ÍÀº map() ÇÔ¼ö°¡, ƯÈ÷ ³»Àå ¸Þ½îµå ȤÀº ³»Àå ÇÔ¼öµé°ú »ç¿ëµÇ¸é, Æí¸®ÇÑ °¡¼Ó±â°¡ µÉ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î µÎ °³ÀÇ ¸®½ºÆ®¿¡ ÀÖ´Â ¿ä¼ÒµéÀ» ÇÔ²² ¦ÁöÀ¸·Á¸é:
>>> map(None, [1,2,3], [4,5,6]) [(1, 4), (2, 5), (3, 6)]¶Ç´Â »çÀÎÀÇ ¼öÄ¡¸¦ °è»êÇÏ·Á¸é:
>>> map( math.sin, (1,2,3,4)) [0.841470984808, 0.909297426826, 0.14112000806, -0.756802495308]¦Áþ±â ¿¬»êÀº ÀÌ·¯ÇÑ °æ¿ì¿¡ ´ë´ÜÈ÷ ºü¸£°Ô ¿Ï°áµË´Ï´Ù.
ÁýÇÕ ¿¬»êÀÇ ¿¹Á¦¿¡´Â ¹®ÀÚ¿ °´Ã¼ÀÇ join°ú split ¸Þ½îµå°¡ Æ÷ÇԵ˴ϴÙ. ¿¹¸¦ µé¾î ¸¸¾à s1..s7 ÀÌ °Å´ëÇÑ (10K+) ¹®ÀÚ¿À̶ó¸é "".join([s1,s2,s3,s4,s5,s6,s7])Àº ´õ ¸íÈ®ÇØ º¸ÀÌ´Â s1+s2+s3+s4+s5+s6+s7º¸´Ù ÈξÀ ´õ ºü¸¦ ¼ö ÀÖ½À´Ï´Ù, ¿Ö³ÄÇϸé "µ¡¼À"Àº ¸¹Àº ÇϺΠǥÇö½ÄÀ» °è»êÇÏ´Â ¹Ý¸é¿¡ joinÀº ´Ü Çѹø¿¡ ¸ðµç °ÍÀ» º¹»çÇϱ⠶§¹®ÀÔ´Ï´Ù. ¹®ÀÚ¿À» ´Ù·ç·Á¸é ¶ÇÇÑ Á¤±Ô Ç¥Çö½Ä ¶óÀ̺귯¸®¸¦ °í·ÁÇØ º¸¼¼¿ä. ±×¸®°í "´ëü(substitution)" ¿¬»ê String % tuple °ú String % dictionary¸¦ °í·ÁÇØ º¸¼¼¿ä. ¶ÇÇÑ Á¤·ÄÇϱâ À§Çؼ´Â È®½ÇÇÏ°Ô list.sort ³»Àå ¸Þ½îµå¸¦ »ç¿ëÇϼ¼¿ä, ±×¸®°í FAQÀÇ 4.51°ú 4.59¸¦ º¸½Ã¸é ¾Ë¸Â°Ô °³¼±µÈ »ç¿ë¹ýÀÇ ¿¹µéÀ» º¸½Ç ¼ö ÀÖ½À´Ï´Ù -- list.sort´Â Á¤·Ä¿¡ °üÇÑÇÑ ´Ù¸¥ ¾î¶² Å×Å©´Ðº¸´Ù ¶Ù¾î³ªÁö¸¸, ´ë´ÜÈ÷ ±Ø´ÜÀûÀΠȯ°æÀ» ¿ä±¸ÇÕ´Ï´Ù.
Ç¥ÁØ ¶óÀ̺귯¸®¿Í °øÇåµÈ ¶óÀ̺귯¸® ±×¸®°í È®Àå¿¡´Â, ´Ù¸¥ ¸¹Àº ÁýÇÕ ¿¬»êÀÌ ÀÖ½À´Ï´Ù.
¶Ç ´Ù¸¥ ÀϹÝÀûÀÎ ²Ä¼ö´Â "ȸµ¹À̸¦ ÇÔ¼ö ȤÀº ¸Þ½îµå ¾ÈÀ¸·Î Áý¾î ³Ö´Â °Í"ÀÔ´Ï´Ù. ¿¹¸¦ µé¾î ´À¸®°Ô ½ÇÇàµÇ´Â ÇÁ·Î±×·¥ÀÌ ÀÖ°í ¼º´ÉÃÖÀûȱâ(profiler)¸¦ »ç¿ëÇÏ¿© (profile.run) ÆÄÀ̽ã ÇÔ¼ö ff°¡ ¾ó¸¶³ª ÀÚÁÖ È£ÃâµÇ°í Àִ°¡ °áÁ¤ÇÑ´Ù°í °¡Á¤ÇØ º¾½Ã´Ù. ¸¸¾à ff°¡ ´ÙÀ½°ú °°ÀÌ
def ff(x): ...do something with x computing result... return resultȸµ¹ÀÌ ¾È¿¡¼ (A)¿Í °°ÀÌ È£ÃâµÈ´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¸é
list = map(ff, oldlist)ȤÀº (B)¿Í °°ÀÌ È£ÃâµÈ´Ù´Â °ÍÀ» ±ú´Ý°Ô µÇ¸é
for x in sequence: value = ff(x) ...do something with value...±×·¯¸é ´ÙÀ½°ú °°ÀÌ ff¸¦ ÀçÀÛ¼º ÇÔÀ¸·Î½á, ÇÔ¼ö È£Ã⠺δãÀ» Á¦°ÅÇÒ ¼ö ÀÖ½À´Ï´Ù.
def ffseq(seq): resultseq = [] for x in seq: ...do something with x computing result... resultseq.append(result) return resultseq±×¸®°í (A)¸¦ ´ÙÀ½°ú °°ÀÌ ÀçÀÛ¼ºÇϰųª
list = ffseq(oldlist)(B)¸¦ ´ÙÀ½°ú °°ÀÌ ÀçÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
for value in ffseq(sequence): ...do something with value...´Ù¸¥ ´Ü¼ø È£Ãâ ff(x)´Â ¾Æ¹«·± ºÎ´ã¾øÀÌ ffseq([x])[0]À¸·Î ¹ø¿ªµË´Ï´Ù. ¹°·Ð ÀÌ Å×Å©´ÐÀº Ç×»ó ÀûÀýÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù ±×¸®°í ´Ù¸¥ º¯Á¾µéÀÌ ÀÖÁö¸¸, ¿©·¯ºÐÀº ÀÌÇØ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Áö¿ª º¯¼ö¿¡ ´ëÇÑ ÇÔ¼ö³ª ¸Þ½îµåÀÇ ÂüÁ¶ °á°ú¸¦ ¸í½ÃÀûÀ¸·Î ÀúÀåÇÏ¸é ¼º´ÉÁõ°¡¸¦ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°Àº ȸµ¹ÀÌ´Â
for key in token: dict[key] = dict.get(key, 0) + 1¸Å ¹Ýº¹¸¶´Ù dict.getÀ» °áÁ¤ÇÕ´Ï´Ù. ¸¸¾à ±× ¸Þ½îµå°¡ º¯°æµÇÁö ¾Ê´Â´Ù¸é, ´õ ºü¸¥ ±¸ÇöÀº ´ÙÀ½°ú °°½À´Ï´Ù.
dict_get = dict.get # look up the method once for key in token: dict[key] = dict_get(key, 0) + 1±âº» ÀμöµéÀº ½ÇÇà½Ã°£ ´ë½Å¿¡ ÄÄÆÄÀÏ ½Ã°£¿¡ °ªµéÀ», °áÁ¤Çϴµ¥ Çѹø »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡ º¯°æµÇÁö ¾ÊÀ» °´Ã¼ ȤÀº ÇÔ¼öµé¿¡ ´ëÇØ¼´Â Àû¿ëµÉ ¼ö ÀÖ½À´Ï´Ù, ´ÙÀ½°ú °°ÀÌ ´ëüÇÑ´Ù¸é
def degree_sin(deg): return math.sin(deg * math.pi / 180.0)
def degree_sin(deg, factor = math.pi/180.0, sin = math.sin): return sin(deg * factor)ÀÌ ²Ä¼ö´Â ±âº» ÀμöµéÀ» º¯°æµÇ¾î¼´Â ¾ÈµÈ´Ù´Â Á¶°ÇÇÏ¿¡ »ç¿ëÇϱ⠶§¹®¿¡, ±×°ÍÀº »ç¿ëÀÚ¿¡°Ô È¥¶õ½º·± API¸¦ Á¦°øÇÒ °¡´É¼º¿¡ ´ëÇÏ¿© ¿°·ÁµÇÁö ¾ÊÀ» ¶§¸¸ »ç¿ëµÇ¾îÁ®¾ß ÇÕ´Ï´Ù.
ÃÖÀûÈ¿¡ °ü·ÃµÈ ÀÏȸ¦ º¸½Ã·Á¸é, ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä
essays/list2str.html
import modname reload(modname)°æ°í: ÀÌ Å×Å©´ÐÀº 100% ¿ÏÀüÇϰÔ-Áõ¸íµÈ °ÍÀº ¾Æ´Õ´Ï´Ù. ƯÈ÷, ´ÙÀ½°ú °°Àº ¼¼ú¹®À» ´ã°í ÀÖ´Â ¸ðµâµéÀº
from modname import some_objects±× ¼öÀÔµÈ °´Ã¼µéÀÇ ±¸Çü ¹öÀü°úµµ °è¼ÓÇÏ¿© Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù.
if __name__ == '__main__': main()
ÁÖÀÇ: ¸¸¾à ºÒÆòÀÌ "Tkinter" (´ë¹®ÀÚ T)¿¡ °üÇÑ °ÍÀ̰í ÀÌ¹Ì "tkinter" (¼Ò¹®ÀÚ t) ¸ðµâÀ» ¼³Á¤ÇÏ¿´´Ù¸é, ÇØ°áÃ¥Àº tkinter¸¦ TkinterÀ¸·Î ȤÀº ±× ¹Ý´ë·Î À̸§À» ¹Ù²ÙÁö ¾Ê´Â °ÍÀÔ´Ï´Ù. ºÐ¸íÈ÷ ¸ðµâ Ž»ö °æ·Î¿¡ ¹«¾ùÀΰ¡ À߸øÀÌ ÀÖ½À´Ï´Ù. sys.pathÀÇ °ªÀ» Á¡°ËÇØ º¸¼¼¿ä.
X-°ü·Ã ¸ðµâ (Xt¿Í Xm)¿¡ ´ëÇØ¼´Â, ´õ ¸¹Àº ÀÛ¾÷ÀÌ ÇÊ¿äÇÒ °ÍÀÔ´Ï´Ù: ±× ¸ðµâµéÀº ÇöÀç·Î Ç¥ÁØ ÆÄÀ̽㠹èÆ÷º»¿¡ Æ÷ÇÔµÇÁö ¾Ê½À´Ï´Ù. ftp·Î ±× È®Àå tar ÆÄÀÏÀ» ³»·Á ¹ÞÀ» Çʿ䰡 ÀÖ½À´Ï´Ù, Áï. ´ÙÀ½¿¡¼ ftp://ftp.python.org/pub/python/src/X-extension.tar.gz ³»·Á¹Þ°í ±×¸®°í °Å±â¿¡ ÀÖ´Â Áö½Ã»çÇ×À» µû¸£¼¼¿ä.
´ÙÀ½ Áú¹®µµ ÂüÁ¶Çϼ¼¿ä.
ÇöÀç Áö¿øµÇ´Â ÇØ°áÃ¥µéÀº:
Å©·Î½º-Ç÷§Æû(Cross-platform):
Tcl/Tk À§Á¬ ¸ðµÒ¿¡ ´ëÇÑ »ê¶æÇÑ °´Ã¼-ÁöÇâ ÀÎÅÍÆäÀ̽º°¡ Àִµ¥, Tkinter¶ó°í ºÎ¸¨´Ï´Ù. À̰ÍÀº Ç¥ÁØ ÆÄÀ̽㠹èÆ÷º»ÀÇ ÀϺημ Àß-Áö¿øµÇ°í ÀÖ½À´Ï´Ù -- ¿©·¯ºÐÀÌ ÇØ¾ßÇÒ Çʿ䰡 ÀÖ´Â ¸ðµç °ÍÀº Tcl/Tk¸¦ ±¸ÃàÇÏ°í ¼³Ä¡ÇÏ°í ±×¸®°í ÆÄÀ̽ãÀ» ±¸ÃàÇÒ ¶§ _tkinter ¸ðµâ°ú Modules/Setup¿¡ ÀÖ´Â TKPATH Á¤ÀǸ¦ »ç¿ë°¡´ÉÇÏ°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. À̰ÍÀÌ ¾Æ¸¶µµ ¼³Ä¡ÇÏ°í »ç¿ëÇϱ⿡ °¡Àå ½¬¿ì¸ç °¡Àå ¿Ïº®ÇÑ À§Á¬ ¸ðµÒÀÏ °ÍÀÔ´Ï´Ù. ¾Æ¸¶µµ ¹Ì·¡¿¡ Ç¥ÁØ ÆÄÀ̽㠱¸ÀÌ API°¡ ±âº»À¸·Î Çϰųª Àû¾îµµ Tkinter ÀÎÅÍÆäÀ̽º¿Í ´ë´ÜÈ÷ ºñ½ÁÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù. Tk¿¡ °üÇÏ¿©, ¼Ò½º¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÏ¿©, ´õ ¸¹Àº Á¤º¸°¡ ÇÊ¿äÇϽøé, http://www.scriptics.com/¿¡ ÀÖ´Â Tcl/Tk ȨÆäÀÌÁö¸¦ ÂüÁ¶Çϼ¼¿ä. Tcl/TkÀº ÀÌÁ¦ Mac°ú À©µµ¿ì Ç÷§Æû (NT¿Í 95¿¡¸¸)¿¡ ´ëÇÏ¿© ¿ÏÀüÇÑ À̽ļºÀÌ ÀÖ½À´Ï´Ù; ÇÊ¿äÇÑ °ÍÀº ÆÄÀ̽ã 1.4beta3 ÀÌ»ó ±×¸®°í Tk 4.1patch1 ÀÌ»óÀÌ ÇÊ¿äÇÕ´Ï´Ù.
wxPythonÀ̶ó°í ºÒ¸®¿ì´Â wxWindows¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ½À´Ï´Ù. wxWindows´Â C++À¸·Î ÀÛ¼ºµÈ À̽ļº ÀÖ´Â ±¸ÀÌ Å¬·¡½º ¶óÀ̺귯¸®ÀÔ´Ï´Ù. GTK, Motif, MS-Windows ±×¸®°í MacÀ» ¸ñÇ¥·Î Áö¿øÇÕ´Ï´Ù. ´Ù¸¥ Ç÷§Æû¿¡ ´ëÇÑ À̽ÄÀº °í·ÁµÇ°í Àְųª ÀÌ¹Ì ¾à°£ÀÇ ÀÛ¾÷ÀÌ ÀÌ·ç¾îÁö°í ÀÖ½À´Ï´Ù. wxWindows´Â ±×·¡ÇÈ µµ±¸¸ðÀ½¿¡ ÀáÀçÇÏ´Â ½Ã°¢´À³¦À» ±×´ë·Î º¸Á¸ÇÕ´Ï´Ù, ±×¸®°í ´ë´ÜÈ÷ dzºÎÇÑ À§Á¬ ¸ðµÒ°ú GDI Ŭ·¡½º ¸ðµÒÀÌ ÀÖ½À´Ï´Ù. ´õ ¸¹Àº Á¤º¸¸¦ À§Çؼ´Â http://www.wxwindows.org// wxWindows ÆäÀÌÁö¸¦ ÂüÁ¶Çϼ¼¿ä. wxPython´Â ÆÄÀ̽ã È®Àå ¸ðµâ·Î¼ ¸¹Àº wxWindows C++ Ŭ·¡½ºµéÀ» Æ÷ÀåÇØÁÖ¸ç, ±×¸®°í ÆÄÀ̽㠰³¹ßÀÚµé »çÀÌ¿¡ ºü¸£°Ô Àα⸦ ¾ò°í ÀÖ½À´Ï´Ù. wxPythonÀ» ¼Ò½ºÀÇ ÇüÅ·ΠȤÀº wxWindowsÀÇ CVS ¹èÆ÷º»À¸·Î, ¶Ç´Â Á÷Á¢ http://alldunn.com/wxPython/ ȨÆäÀÌÁö¿¡¼ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
Á¦ÀÓ½º ÇƮ¸®Áö(James Henstridge)¿¡ ÀÇÇÑ Gnome°ú GIMP µµ±¸ ¸ðÀ½¿¡ ´ëÇÑ ¿«±â°¡ Á¸ÀçÇÕ´Ï´Ù; ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä ftp://ftp.daa.com.au/pub/james/python/.
KDE ¿«±â¸¦ À§Çؼ´Â, ftp://ftp.kde.org/pub/kde/devel/kde-bindingsÀ» ÂüÁ¶ÇϽðųª ¶Ç´Â http://www.river-bank.demon.co.uk/software/¸¦ ÂüÁ¶Çϼ¼¿ä.
OpenGL ¿«±â¸¦ À§Çؼ´Â, http://starship.python.net/~da/PyOpenGL¸¦ ÂüÁ¶Çϼ¼¿ä.
Ç÷§Æû Á¾¼ÓÀû:
¸Æ¿¡ ´ëÇÑ À̽ÄÀº º»·¡ÀÇ ¸Æ µµ±¸»óÀÚ È£ÃâÀ» Áö¿øÇϰí ÀÖ´Â ¸ðµâÀÇ ¸ðÀ½ÀÌ Ç³ºÎÇÏ¸ç °è¼ÓÇØ¼-Ä¿Áö°í ÀÖ½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä ftp://ftp.python.org/pub/python/mac. Àè ¾á¼¾(Jack Jansen) jack@cwi.nlÀÌ Áö¿øÇÕ´Ï´Ù.
¸¶Å© ÇØ¸óµå(Mark Hammond)¿¡ ÀÇÇÑ ÆÄÀ̽ãÀ© (MHammond@skippinet.com.au)¿¡´Â ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ±âÃÊ Å¬·¡½º(Microsoft Foundation Classes)¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¿Í ÆÄÀ̽ã ÇÁ·Î±×·¡¹Ö ȯ°æÀÌ Æ÷ÇԵǾî Àִµ¥ °ÅÀÇ ´ëºÎºÐ ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÇ¾ú½À´Ï´Ù. ´ÙÀ½À» ÂüÁ¶Çϼ¼¿ä http://www.python.org/windows/.
¸¶ÀÌÅ©·Î ¼ÒÇÁÆ® ±âÃÊ Å¬·¡½º ¸ðµ¨(MFC)¿¡ Åä´ë¸¦ µÎ´Â °´Ã¼-ÁöÇâ ±¸À̵µ Àִµ¥, WPY¶ó°í ºÎ¸£¸ç, Áü ¾Ë½ºÆ®·Ò(Jim Ahlstrom)jim@interet.comÀÌ Áö¿øÇÕ´Ï´Ù. WPY·Î ÀÛ¼ºµÈ ÇÁ·Î±×·¥Àº º¯°æ¾øÀÌ °íÀ¯ÀÇ ½Ã°¢´À³¦À» °¡Áö°í (win32s¸¦ »ç¿ëÇÏ¿©) À©µµ¿ì NT/95, À©µµ¿ì 3.1, ±×¸®°í À¯´Ð½º¿¡¼ (Tk¸¦ »ç¿ëÇÏ¿©) ½ÇÇàµË´Ï´Ù. À©µµ¿ì¿Í ¸®´ª½º¸¦ À§ÇÑ ¼Ò½º¿Í ÀÌÁø ÆÄÀϵéÀº ftp://ftp.python.org/pub/python/wpy/¿¡¼ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
Æó±âµÇ°Å³ª ȤÀº ¼Ò¼öÀÇ ÇØ°áÃ¥:
X11¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽ºµµ Àִµ¥, ¾Æµ¥³ª(Athena)¿Í ¸ðƼÇÁ(Motif) À§Á¬ ¸ðµÒÀ» Æ÷ÇÔÇϸç (¸ðÀÚÀÌÅ©ÀÇ HTML À§Á¬°ú SGIÀÇ GL À§Á¬°ú °°Àº, ¾à°£ÀÇ °³ÀÎÀûÀÎ À§Á¬µé) ´ÙÀ½ÀÇ ftp://ftp.python.org/pub/python/src/X-extension.tar.gz¿¡¼ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù. ¼Åµå ¸Ö·»ÅÍ(Sjoerd Mullender)sjoerd@cwi.nl°¡ Áö¿øÇϰí ÀÖ½À´Ï´Ù.
X11 ÀÎÅÍÆäÀ̽º À§¿¡ ÆÞ ½ºÇʸµ(Per Spilling)¿¡ ÀÇÇÑ vpApp µµ±¸¸ðÀ½ÀÌ Àִµ¥, ÀÌÁ¦´Â ¼Åµå ¸Ö·»´õ(Sjoerd Mullender)sjoerd@cwi.nl°¡ À¯ÁöÇϰí ÀÖ½À´Ï´Ù. ´ÙÀ½ ftp://ftp.cwi.nl/pub/sjoerd/vpApp.tar.gzÀ» ÂüÁ¶Çϼ¼¿ä.
SGI IRIX ¸¸À» À§Çؼ¶ó¸é, Áö¿øµÇÁö ¾Ê°í ÀÖ´Â ¿Ïº®ÇÑ GL°ú FORMS¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ ÀÖ½À´Ï´Ù. (GL : ±×·¡ÇÈ ¶óÀ̺귯¸® -- Àú ¼öÁØÀÌÁö¸¸ ´ë´ÜÈ÷ ÈǸ¢ÇÑ 3D ´É·ÂÀ» °¡Áý´Ï´Ù) (FORMS : ¸¶Å© ¿À¹ö¸¶½º(Mark Overmars)¿¡ ÀÇÇÏ¿© GLÀ§¿¡ ±¸ÃàµÈ ¹öư-°ú-½½¶óÀÌ´õ-µîµîÀÇ ÆÐŰÁö·Î¼ -- ´ÙÀ½ÀÇ ftp://ftp.cs.ruu.nl/pub/SGI/FORMS/·ÎºÎÅÍ ³»·Á ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù). ÀÌ°Í ¿ª½Ã ¾Æ¸¶µµ Æó±âµÇ¾î °¡°í ÀÖ´Â ÁßÀÏ °ÍÀÔ´Ï´Ù, ÀÌÁ¦´Â OpenGLÀÌ ³Ñ°Ü ¹Þ¾Ò½À´Ï´Ù (À§¸¦ ÂüÁ¶Çϼ¼¿ä).
STDWIN¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ Àִµ¥, Mac°ú X11À» À§ÇÑ Ç÷§Æû µ¶¸³ÀûÀÎ Àú-¼öÁØ À©µµ¿ì ÀÎÅÍÆäÀ̽º ÀÔ´Ï´Ù. À̰ÍÀº ¿ÏÀüÇÏ°Ô Áö¿øµÇÁö ¾Ê°í ÀÖÀ¸¸ç, ºü¸£°Ô Æó±âµÇ¾î °¡°í ÀÖ´Â ÁßÀÔ´Ï´Ù. STDWIN ¼Ò½º´Â ´ÙÀ½ ftp://ftp.cwi.nl/pub/stdwin/¿¡ ÀÖ½À´Ï´Ù.
WAFE¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º°¡ Àִµ¥, X11 ¸ðƼÇÁ¿Í ¾Æµ¥³ª À§Á¬ ¸ðµÒ¿¡ ´ëÇÑ Tcl ÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù. WAFE´Â ´ÙÀ½ http://www.wu-wien.ac.at/wafe/wafe.html¿¡ ÀÖ½À´Ï´Ù.
# Primes < 1000 print filter(None,map(lambda y:y*reduce(lambda x,y:x*y!=0, map(lambda x,y=y:y%x,range(2,int(pow(y,0.5)+1))),1),range(2,1000)))
# First 10 Fibonacci numbers print map(lambda x,f=lambda x,f:(x<=1) or (f(x-1,f)+f(x-2,f)): f(x,f) , range(10))
# Mandelbrot set print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y, Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,Sy=Sy,L=lambda yc,Iu=Iu,Io=Io,Ru=Ru,Ro=Ro,i=IM, Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro, i=i,Sx=Sx,F=lambda xc,yc,x,y,k,f=lambda xc,yc,x,y,k,f:(k<=0)or (x*x+y *y >=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr ( 64+F(Ru+x*(Ro-Ru)/Sx,yc,0,0,i)),range(Sx))):L(Iu+y*(Io-Iu)/Sy),range(Sy ))))(-2.1, 0.7, -1.2, 1.2, 30, 80, 24) # \___ ___/ \___ ___/ | | |__ lines on screen # V V | |______ columns on screen # | | |__________ maximum of "iterations" # | |_________________ range on y axis # |____________________________ range on x axisÀ̰ÍÀ» ½±°Ô ½ÃµµÇØ º¸Áö´Â ¸¶¼¼¿ä, ¿©·¯ºÐ!
ÆÀ ÇÇÅͽº(Tim Peters)°¡ ´ÙÀ½ÀÇ ÇØ°áÃ¥À» Á¦½ÃÇÏ¿´½À´Ï´Ù: (a and [b] or [c])[0]. [b]´Â ½Ì±ÛÅÏ(ÇѰ³ÀÇ ¿ä¼Ò¸¦ °¡Áö´Â) ¸®½ºÆ®À̹ǷΠÀý´ë·Î °ÅÁþÀÌ ¾Æ´Õ´Ï´Ù, ±×·¡¼ À߸øµÈ °æ·Î´Â Àý´ë·Î ¼±ÅõÇÁö ¾Ê½À´Ï´Ù; ±×·¯¸é [0]¸¦ Àüü¿¡ Àû¿ëÇÏ¸é ½ÇÁ¦·Î ¿øÇÏ´Â b ¶Ç´Â c ¸¦ ȹµæÇÕ´Ï´Ù. ±×·¸Áö¸¸, ¾ÈŸ±õ°Ôµµ 'if'¸¦ »ç¿ëÇÏ¿© Äڵ带 ÀçÀÛ¼ºÇÏ´Â °ÍÀÌ ÁøÂ¥·Î ºÒÆíÇÏ°Ô µÇ´Â Èñ±ÍÇÑ »óȲÀ» ¸Â°Ô µË´Ï´Ù.
del ¼¼ú¹®Àº ÇʼöÀûÀ¸·Î __del__À» È£ÃâÇÏÁö´Â ¾Ê½À´Ï´Ù -- ±×Àú ±× °´Ã¼ÀÇ ÂüÁ¶ Ƚ¼ö¸¦ °¨¼Ò½Ãų »ÓÀÔ´Ï´Ù, ±×¸®°í ¸¸¾à ±× Ƚ¼ö°¡ 0¿¡ µµ´ÞÇϸé __del__ÀÌ È£ÃâµË´Ï´Ù.
¸¸¾à µ¥ÀÌŸ ±¸Á¶°¡ ¼øÈ¯ ¿¬°áÀ» Æ÷ÇÔÇϰí ÀÖ´Ù¸é (¿¹¸¦ µé¾î. °¢ ÀÚ¼ÕÀÌ ÇϳªÀÇ ºÎ¸ð Æ÷ÀÎÅ͸¦ °¡Áö°í ÀÖ°í °¢ ºÎ¸ð´Â ÀÚ¼Õ ¸ñ·ÏÀ» °¡Áö°í ÀÖ´Â Æ®¸® ±¸Á¶ÀÇ °æ¿ì¶ó¸é) ±× ÂüÁ¶ Ƚ¼ö´Â Àý´ë·Î 0À¸·Î µÇµ¹¾Æ °¡Áö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ¸í½ÃÀûÀ¸·Î close() ¸Þ½îµå¸¦ Á¤ÀÇÇÏ¿© ±×·¯ÇÑ Æ÷ÀÎÅ͵éÀ» Á¦°ÅÇØ¾ß¸¸ ÇÒ °ÍÀÔ´Ï´Ù. Á¦¹ß __del__À» Á÷Á¢ÀûÀ¸·Î È£ÃâÇÏÁö ¸¶¼¼¿ä -- __del__Àº close()¸¦ È£ÃâÇØ¾ß¸¸ Çϰí close()´Â ÀÚ½ÅÀÌ °°Àº °´Ã¼¿¡ ´ëÇÏ¿© ÇÑ ¹ø ÀÌ»ó È£ÃâµÉ ¼ö ÀÖµµ·Ï È®ÀÎÇÏ¿©¾ß¸¸ ÇÕ´Ï´Ù.
¸¸¾à ±× °´Ã¼°¡ except Àý¿¡¼ Ç¥Çö½ÄÀ» ³ªÆ÷ÇÏ´Â ÇÔ¼ö¿¡ ´ëÇÑ Áö¿ª º¯¼ö¿´´Ù¸é (ȤÀº Àμö¶ó¸é, À̰ÍÀº ½ÇÁ¦ÀûÀ¸·Î °°Àº °ÍÀÔ´Ï´Ù), °¡´É¼ºÀº ±× °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶°¡ ½ºÅà ÃßÀû¿¡¼ ´ã°Ü ÀÖ´Â ±×´ë·Î ¿©ÀüÈ÷ ±× ÇÔ¼öÀÇ ½ºÅà ÇÁ·¹ÀÓ¿¡ Á¸ÀçÇÏ´Â °ÍÀÔ´Ï´Ù. º¸Åë, (´õ ÁÁÀº °ÍÀº: NoneÀ» ÇÒ´çÇÏ´Â °Í) sys.exc_traceback À» »èÁ¦Çϸé À̰ÍÀ» ÇØ°áÇØ ÁÙ °ÍÀÔ´Ï´Ù. ¸¸¾à »óÈ£´ëÈÀûÀÎ ÀÎÅÍÇÁ¸®ÅÍ »óÅ¿¡¼ 󸮵ÇÁö ¾ÊÀº ¿¹¿Ü¿¡ ´ëÇÏ¿© ½ºÅÃÀÌ Ãâ·ÂµÇ¸é, ´ë½Å¿¡ sys.last_tracebackÀ» Áö¿ì¼¼¿ä.
ÀÎÅÍÇÁ¸®ÅͰ¡ Á¾·áÇÒ ¶§ ¸ðµç °´Ã¼¸¦ »èÁ¦ÇÏ´Â Äڵ尡 ÀÖÁö¸¸, ÆÄÀ̽ãÀÌ ¾²·¹µå¸¦ Áö¿øÇϵµ·Ï ȯ°æ¼³Á¤µÇ¾î ÀÖ´Ù¸é È£ÃâµÇÁö ¾Ê½À´Ï´Ù (¿Ö³ÄÇÏ¸é ´Ù¸¥ ¾²·¹µåµéÀÌ ¿©ÀüÈ÷ »ì¾ÆÀÖÀ»Áöµµ ¸ð¸£±â ¶§¹®ÀÔ´Ï´Ù). ÀڽŸ¸ÀÇ Ã»¼Ò ÇÔ¼ö¸¦ sys.exitfunc¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù (Áú¹® 4.4 ÂüÁ¶).
¸¶Áö¸·À¸·Î, __del__ ¸Þ½îµå°¡ ¿¹¿Ü¸¦ ÀÏÀ¸Å°¸é, °æ°í ¸Þ½ÃÁö°¡ sys.stderr¿¡ Ãâ·ÂµË´Ï´Ù.
ÆÄÀ̽ã 2.0ºÎÅÍ´Â, ¾²·¹±â ¼öÁý±â´Â ¸¹Àº ¼øÈ¯°í¸®°¡ ¿ÜºÎ ÂüÁ¶¾øÀÌ »ç¿ëÇÑ °ø°£À» Àç¿ä±¸ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸, ½ÇÆÐ°¡ ¿¹»óµÇ´Â º´¸®Àû »ç·Ê°¡ Á¸ÀçÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù, ±×·¡¼ ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ÀÌ ±×·¯ÇÑ ¼øÈ¯°í¸®¸¦ ±ü´Ù´Â °ÍÀ» È®ÀÎÇÏ´Â °ÍÀÌ Ç×»ó °¡Àå ¾ÈÀüÇÕ´Ï´Ù.
Áú¹® 6.14ÀÇ ¸ñÀûÀº »õ·Î¿î ¾²·¹±â ¼öÁý ¾Ë°í¸®ÁòÀ» ¼³¸íÇÏ´Â °ÍÀÔ´Ï´Ù.
ÆÄÀ̽ã 1.4 ÀÌÀü¿¡¼´Â, ÇϺν©·Î °Ç³×Áö´Â ȯ°æÀ» º¯°æÇÏ´Â °ÍÀÌ ±× ÀÎÅÍÇÁ¸®ÅÍ¿¡¼´Â »ý·«µÇ¾ú½À´Ï´Ù. ±×·¸°Ô ÇϱâÀ§ÇÑ Àß-±¸ÃàµÈ ÀÌ½Ä ¹æ¹ýÀÌ ¾ø´Ù°í ÆÇ´Ü µÇ¾ú±â ¶§¹®ÀÔ´Ï´Ù (ƯÈ÷, ¾î¶² ½Ã½ºÅÛÀº, putenv()¸¦ °¡Áö°í, ´Ù¸¥ ½Ã½ºÅÛµéÀº setenv()¸¦ °¡Áö¸ç, ±×¸®°í ¾î¶² ½Ã½ºÅÛµéÀº ÀüÇô °¡ÁöÁö ¾Ê½À´Ï´Ù). ÆÄÀ̽ã 1.4 ÇöÀçºÎ·Î, °ÅÀÇ ¸ðµç À¯´Ð½º ½Ã½ºÅÛÀº putenv()¸¦ °¡Áö°í ÀÖ½À´Ï´Ù ±×¸®°í Win32 APIµµ °¡Áö°í ÀÖ°í, ±×·±½ÄÀ¸·Î os ¸ðµâÀº º¯°æµÇ¾î os.environ¿¡ ´ëÇÑ º¯°æÀº ³ªÆ÷µÇ°í ±× »óÀÀÇÏ´Â putenv() È£ÃâÀÌ ÀÌ·ç¾îÁý´Ï´Ù.
¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¿¡ °üÇÑ ¾à°£ÀÇ ÁÖÀÇ»çÇ×: ƯÁ¤ÇÑ °´Ã¼ÀÇ ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå¸¦ ÂüÁ¶ÇÒ ¶§¸¶´Ù ¿«¿©ÁöÁö ¾ÊÀº ¸Þ½îµå °´Ã¼¸¦ ¸¸µé¾î ³À´Ï´Ù. ¸¸¾à ´ÙÀ½°ú °°ÀÌ ÂüÁ¶ÇÑ´Ù¸é (a = inst.meth; b = inst.meth), ±×µéÀº µ¿µîÇϱâ´Â ÇÏÁö¸¸ (a == b) µ¿ÀÏÇÏÁö´Â ¾ÊÀ» °ÍÀÔ´Ï´Ù (a is not b).
ÀÌ·¸°Ô Çϱ⸦ ¿øÇÒ ¶§ °¡²û ¿©·¯ºÐÀº Ŭ·¡½ºµéÀÌ ÆÄÀ̽㿡¼ Á¦ÀÏ Å¬·¡½º¶ó´Â °ÍÀ» Àؾî¹ö¸³´Ï´Ù. ½Çü ¼öÁØ È¤Àº ÇϺÎŬ·¡½º ¼öÁØ¿¡¼, Ŭ·¡½º¸¦ ÁöÁ¤ÇÏ¿© ¿¬»êÀ» À§ÀÓÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î superclassÀÇ "glorp" ¿¬»êÀ» »ç¿ëÇÏ·Á¸é Á¤È®ÇÑ superclass¸¦ ÁöÀûÇØ¼ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
class subclass(superclass1, superclass2, superclass3): delegate_glorp = superclass2 ... def glorp(self, arg1, arg2): ... subclass specific stuff ... self.delegate_glorp.glorp(self, arg1, arg2) ...
class subsubclass(subclass): delegate_glorp = superclass3 ...±×·¸Áö¸¸, ÁÖÀÇÇϼ¼¿ä. subsubclass¿¡¼ ÇϺÎŬ·¡½ºÈ Çϱâ À§Çؼ delegate_glorp¸¦ ¼³Á¤Çϸé subclass.delegate_glorp¿¡ ´ëÇÏ¿© ¹«ÇÑ Àç±Í¸¦ ¾ß±âÇÒ °ÍÀÔ´Ï´Ù. ÁÖÀÇ Çϼ¼¿ä! ¾Æ¸¶µµ ÀڽŸ¸ÀÇ ¸ñÀûÀ» À§ÇØ ³Ê¹« ±âºÐÀ» ³»°í ÀÖ´ÂÁöµµ ¸ð¸¨´Ï´Ù. µðÀÚÀÎÀ» °£°áÇÏ°Ô ÇÏ´Â °ÍÀ» °í·ÁÇØ º¸¼¼¿ä (?).
BaseAlias = <real base class> class Derived(BaseAlias): def meth(self): BaseAlias.meth(self) ...
»ç¿ëÀÚ-Á¤ÀÇ Å¬·¡½ºÀÇ ½Çü x¿¡ ´ëÇÏ¿©, ½Çü ¼Ó¼ºÀº »çÀü x.__dict__¿¡¼ ¹ß°ßÇÒ ¼ö ÀÖÀ¸¸ç, ±×¸®°í ±×ÀÇ Å¬·¡½º¿¡ ÀÇÇØ¼ Á¤ÀÇµÈ ¸Þ½îµå¿Í ¼Ó¼ºµéÀº x.__class__.__bases__[i].__dict__¿¡¼ ¹ß°ßµË´Ï´Ù (for i in range(len(x.__class__.__bases__))). ¸ðµç Ŭ·¡½º ¸Þ½îµå¿Í ¼Ó¼ºµéÀ» ãÀ¸·Á¸é ±âº» Ŭ·¡½ºµéÀÇ Æ®¸®¸¦ Ž»öÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
´Ù¼öÀ̱â´Â ÇÏÁö¸¸, ¸ðµç ³»Àå ÇüµéÀÌ ¸Þ½îµå À̸§µéÀ» x.__methods__¿¡ Á¤ÀÇÇÏ´Â °ÍÀº ¾Æ´Õ´Ï´Ù, ±×¸®°í ¸¸¾à µ¥ÀÌŸ ¼Ó¼ºµéÀ» °¡Áö¸é, ±× À̸§µéÀº x.__members__¿¡¼ ¹ß°ßµÉ ¼ö ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸ À̰ÍÀº °ü·ÊÀÏ µû¸§ÀÔ´Ï´Ù.
Á¤º¸°¡ ´õ ÇÊ¿äÇϽøé, Ç¥ÁØ (±×·¯³ª ¹®¼ÈµÇÁö ¾ÊÀº) ¸ðµâ newdirÀÇ ¼Ò½º¸¦ ÀÐ¾î º¸¼¼¿ä.
À̰ÍÀº ´ÙÀ½°ú °°ÀÌ ÀÛµ¿ÇÕ´Ï´Ù. ¼Ò½º¸¦ Àç±ÍÀûÀ¸·Î Äf¾î¼ ¼öÀÔ ¼¼ú¹®µéÀ» Ž»öÇÏ°í ±×¸®°í Ç¥ÁØ ÆÄÀ̽㠰æ·Î¿¡ ÀÖ´Â ¸ðµâµé°ú (³»Àå ¸ðµâÀ» À§ÇÑ) ¼Ò½º µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµâµéÀ» ã½À´Ï´Ù. ±×¸®°í³ª¼ ±×°ÍÀº ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÈ ¸ðµâÀ» C ÄÚµå·Î ( marshal ¸ðµâÀ» »ç¿ëÇÏ¿© ÄÚµå °´Ã¼·Î º¯°æµÉ ¼ö ÀÖ´Â ¹è¿ ÃʱâÈÀÚ·Î) "ÄÄÆÄÀÏ ÇÕ´Ï´Ù" ±×¸®°í °í°´-¸ÂÃã ȯ°æ¼³Á¤ ÆÄÀÏÀ» ¸¸µå´Âµ¥ ±× ÇÁ·Î±×·¥¿¡¼ ½ÇÁ¦ÀûÀ¸·Î »ç¿ëµÇ´Â ³»Àå ÇÔ¼öµé ¸¸À» ´ã°í ÀÖ½À´Ï´Ù. ±×¸®°í ³ª¼ »ý¼ºµÈ C Äڵ带 ÄÄÆÄÀÏÇÏ°í ±×°ÍÀ» ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍÀÇ ³ª¸ÓÁö¿Í ¿¬°áÇÏ¿© ½ºÅ©¸³Æ®¿Í Á¤È®ÇÏ°Ô ¶È °°ÀÌ ÇൿÇÏ´Â, ÀÚ½ÅÀÌ-´ã°ÜÁø ÀÌÁø ÆÄÀÏÀ» Çü¼ºÇÕ´Ï´Ù.
ÈùÆ®: freeze ÇÁ·Î±×·¥Àº ½ºÅ©¸³Æ®ÀÌ ÆÄÀÏÀ̸§ÀÌ ".py"·Î ³¡³¯ ¶§¸¸ ÀÛµ¿ÇÕ´Ï´Ù.
À©µµ¿ì¿¡¼ ÀÌ·¸°Ô Çϱ⸦ ¿øÇÑ´Ù¸é, µÎ °³ÀÇ À¯Æ¿¸®Æ¼°¡ µµ¿òÀÌ µÉ °ÍÀÔ´Ï´Ù. ù°´Â ´ÙÀ½ÀÇ °íµç ¸Æ¹Ð¶õ(Gordon McMillan)ÀÇ ¼³Ä¡±â ÀÔ´Ï´Ù.
http://starship.python.net/crew/gmcm/install.html±×¸®°í µÑ °´Â ´ÙÀ½ÀÇ Å丶½º Çï·¯(Thomas Heller)ÀÇ py2exeÀÔ´Ï´Ù
http://starship.python.net/crew/theller/py2exe/ÈÄÀÚÀÇ µµ±¸´Â ¿©ÀüÈ÷ °³¹ßÁßÀÔ´Ï´Ù, ±×·¯³ª ÀÌ¹Ì ÆÄÀ̽ã COM ¼¹ö¸¦ À§Çؼ µ¶¸³ÀûÀÎ .exe ÆÄÀÏÀ» ¸¸µå´Âµ¥ »ç¿ëµÇ¾î ¿Ô½À´Ï´Ù.
ÆÄÀ̽ãÀÇ À¥ ÇÁ·¹ÀÓ¿öÅ©¿¡ °ü½ÉÀÌ ÀÖÀ¸½Ã¸é, ´ÙÀ½ÀÇ ÈǸ¢ÇÑ »çÀÌÆ®¸¦ ¹æ¹®ÇØ º¸¼¼¿ä
http://groups.yahoo.com/group/python-web-modules.ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÈ À¥ ºê¶ó¿ìÀúµµ Àִµ¥, GrailÀ̶ó°í ºÎ¸¨´Ï´Ù -- ´ÙÀ½ http://grail.cnri.reston.va.us/grail/À» ÂüÁ¶Çϼ¼¿ä. ±×·¸Áö¸¸, ÃÖ±Ù ¸î³âµ¿¾È¿¡ ÀÌ Äڵ尡 ¾ó¸¶³ª ¸¹ÀÌ À¯Áö º¸¼ö µÇ¾ú´ÂÁö´Â ¸ð¸£°Ú½À´Ï´Ù.
import popen2 fromchild, tochild = popen2.popen2("command") tochild.write("input\n") tochild.flush() output = fromchild.readline()°æ°í: ÀϹÝÀûÀ¸·Î, ÀÌ·¸°Ô ÇÏ´Â °ÍÀº Çö¸íÇÏÁö ¸øÇÕ´Ï´Ù, ¿Ö³ÄÇÏ¸é ½±°Ô µ¥µå¶ôÀ» ¾ß±âÇÒ ¼ö Àֱ⠶§¹®Àε¥ ¿©·¯ºÐÀº ÀÚ¼Õ ÇÁ·Î¼¼½º·ÎºÎÅÍ Ãâ·ÂÀ» ±â´Ù¸®¸é¼ Á¤ÁöÇϰí ÀÖ´Â µ¿¾È¿¡, ÀÚ¼Õ ÇÁ·Î¼¼½º´Â ¿©·¯ºÐÀ¸·ÎºÎÅÍ ÀÔ·ÂÀ» ±â´Ù¸®¸é¼ Á¤ÁöÇϰí ÀÖ°Ô µË´Ï´Ù. À̰ÍÀº ÀÚ¼Õ ÇÁ·Î¼¼½º°¡ Ãâ·ÂÇÏ´Â °Íº¸´Ù ´õ ¸¹Àº ÅØ½ºÆ®¸¦ Ãâ·ÂÇϱ⸦ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ¿¹»óÇϰí Àֱ⠶§¹®¿¡ ¾ß±âµÉ ¼ö µµ ÀÖ°í, ¶Ç´Â µ¥ÀÌŸ°¡ °Á¦ ¾²±â(flushing)°¡ °á¿©µÇ¾î, stdio ¹öÆÛ¿¡ °íÂøµÇ¾î Àֱ⠶§¹®¿¡ ¾ß±âµÉ ¼öµµ ÀÖ½À´Ï´Ù. ¹°·Ð ÆÄÀ̽㠺θð ÇÁ·Î¼¼½º´Â ¸ðµç ¾î¶² Ãâ·ÂÀ̵çÁö Àбâ Àü¿¡ ÀÚ¼Õ¿¡°Ô º¸³»´Â µ¥ÀÌŸ¸¦ ¸í½ÃÀûÀ¸·Î °Á¦¾²±âÇÒ ¼ö ÀÖ½À´Ï´Ù, ±×·¯³ª ÀÚ¼Õ ÇÁ·Î¼¼½º°¡ ¿ø·¡ C ÇÁ·Î±×·¥À̶ó¸é, °Á¦¾²±â´Â º¸Åë ÀÚµ¿ÀûÀ̹ǷÎ, »óÈ£´ëÈÀûÀÏ Áö¶óµµ, ¸í½ÃÀûÀ¸·Î ±× Ãâ·ÂÀ» °Á¦¾²±â ÇÏÁö ¾Êµµ·Ï ½±°Ô ÀÛ¼ºµÇ¾îÁú ¼ö ÀÖ½À´Ï´Ù
popen2¿¡ ÀÖ´Â ¹ö±×¿¡ ´ëÇÑ ÁÖÀÇ»çÇ×: ¿©·¯ºÐÀÇ ÇÁ·Î±×·¥ÀÌ wait() ȤÀº waitpid()¸¦ È£ÃâÇÏÁö ¾Ê´Â ÇÑ, ¿Ï°áµÈ ÀÚ¼Õ ÇÁ·Î¼¼½º´Â Àý´ë·Î Á¦°ÅµÇÁö ¾Ê½À´Ï´Ù, ±×¸®°í °á±¹ popen2¸¦ È£ÃâÇÏ´Â °ÍÀº ÀÚ¼Õ ÇÁ·Î¼¼½ºÀÇ °³¼ö Á¦ÇÑ ¶§¹®¿¡ ½ÇÆÐÇÒ °ÍÀÔ´Ï´Ù. os.WNOHANG ¼±ÅûçÇ×À» °¡Áö°í os.waitpid¸¦ È£ÃâÇϸé À̰ÍÀ» ¹æÁöÇÒ ¼ö ÀÖ½À´Ï´Ù; ±×·¯ÇÑ È£ÃâÀ» »ðÀÔÇϱâ À§ÇÑ ÃÖÀû Àå¼Ò´Â popen2¸¦ ´Ù½Ã È£ÃâÇϱâ ÀüÀÔ´Ï´Ù.
¸¹Àº °æ¿ì¿¡, ¿©·¯ºÐÀÌ ½ÇÁ¦·Î ÇÊ¿äÇÑ ¸ðµç °ÍÀº ¾î¶² µ¥ÀÌŸ¸¦ ¸í·É¾î·Î ½ÇÇà½ÃÄѼ ±× °á°ú¸¦ µ¹·Á ¹Þ´Â °ÍÀÔ´Ï´Ù. ±× µ¥ÀÌŸÀÇ Å©±â°¡ ¹«ÇÑ ÇÏÁö ¾Ê´ÂÇÑ, ÀÌ·¸°Ô Çϱâ À§ÇÑ °¡Àå ½¬¿î (±×¸®°í ¶§·Î´Â °¡Àå È¿À²ÀûÀÎ!) ¹æ¹ýÀº ±×°ÍÀ» Àӽà ÆÄÀÏ¿¡ ½á ³Ö°í ±× Àӽà ÆÄÀÏÀ» ÀÔ·ÂÀ¸·Î ÇØ¼ ¸í·É¾î¸¦ ½ÇÇàÇÏ´Â °ÍÀÔ´Ï´Ù. Ç¥ÁØ ¸ðµâ tempfileÀº ÇÔ¼ö mktemp()¸¦ ¼öÃâÇϴµ¥ À¯ÀÏÇÑ Àӽà ÆÄÀÏÀ̸§À» »ý¼ºÇÕ´Ï´Ù.
ÁÖÀÇÇÒ °ÍÀº ¸¹Àº »óÈ£´ëÈÀû ÇÁ·Î±×·¥µéÀÌ (¿¹. vi) Ç¥ÁØ ÀԷ°ú Ãâ·ÂÀ» ´ë½ÅÇÏ´Â ÆÄÀÌÇÁ¿Í Àß ÀÛµ¿ÇÏÁö ¾Ê½À´Ï´Ù. ÆÄÀÌÇÁ ´ë½Å¿¡ À¯»ç ttys ("ptys")¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÔ´Ï´Ù. ¶óÀ̺귯¸® ¸ðµâ pty.py¿¡´Â ÀÌ·¯ÇÑ °ÍÀ» »ç¿ëÇÏ´Â ¹®¼ÈµÇÁö ¾ÊÀº Äڵ尡 ÀÖ½À´Ï´Ù -- ¾ÈŸ±õ°Ôµµ ¿©±â´Â ½º½º·Î ÇØ°áÇØ¾ß Çϰڱº¿ä.
´Ù¸¥ ÇØ´äÀº µ· ¸®ºê(Don Libe)ÀÇ "expect" ¶óÀ̺귯¸®¿¡ ´ëÇÑ ÆÄÀ̽ã ÀÎÅÍÆäÀ̽º ÀÔ´Ï´Ù. expect¿Í Á¢¼Ó½ÃÄÑ ÁÖ´Â ÆÄÀ̽ã È®ÀåÀº "expy"¶ó°í ºÒ¸®¿ì¸ç ´ÙÀ½ http://expectpy.sourceforge.net//¿¡¼ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
expect¿Í ºñ½ÁÇÏ°Ô ÀÛµ¿ÇÏ´Â ¼ø¼öÇÑ ÆÄÀ̽ãÀû ÇØ°áÃ¥Àº Á¸ Å©·ÎÀÌ(John Croix)¿¡ ÀÇÇÑ PIPEÀÔ´Ï´Ù. PIPEÀÇ º£Å¸ÆÇÀº ´ÙÀ½ ftp://ftp.python.org/pub/python/contrib/System/¿¡¼ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
func(1, 2, 3)´ÙÀ½°ú µ¿ÀÏÇÕ´Ï´Ù.
args = (1, 2, 3) apply(func, args)À̰ÍÀº func(args)¿Í °°Àº °ÍÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» ÁÖ¸ñÇϼ¼¿ä -- ±×°ÍÀº func()¸¦ ¼¼°³ÀÇ Àμö(Á¤¼ö 1,2 ±×¸®°í 3) ´ë½Å¿¡, Á¤È®ÇÏ°Ô ÇϳªÀÇ Àμö(ÅÍÇà args)·Î È£ÃâÇÕ´Ï´Ù.
ÆÄÀ̽ã 2.0¿¡¼´Â, È®ÀåµÈ È£Ãâ ±¸¹®À» »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù:
f(*args)´Â apply(f, args)¿Í µ¿µîÇÕ´Ï´Ù.
ÀÌÀüÀÇ XEmacs ¶Ç´Â Emacs¸¦ »ç¿ëÇÏ°í °è½Ã¸é ´ÙÀ½À» .emacs ÆÄÀÏ¿¡ »ðÀÔÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÔ´Ï´Ù:
(defun my-python-mode-hook () (setq font-lock-keywords python-font-lock-keywords) (font-lock-mode 1)) (add-hook 'python-mode-hook 'my-python-mode-hook)
°£´ÜÇÑ ÀÔ·Â ÇØ¼®À» À§Çؼ´Â, °¡Àå °£´ÜÇÑ Á¢±Ù¹ýÀº º¸Åë ±× ¶óÀÎÀ» °ø¹éÀ¸·Î-±¸ºÐµÈ ´Ü¾î·Î string.split()¸¦ »ç¿ëÇÏ¿© ³ª´©±¸, ½ÊÁø ¹®ÀÚ¿À» ¼öÄ¡ °ªÀ¸·Î string.atoi(), string.atol() ¶Ç´Â string.atof()¸¦ »ç¿ëÇÏ¿© º¯È¯ÇÏ´Â °ÍÀÔ´Ï´Ù. (ÆÄÀ̽ãÀÇ atoi()´Â 32-ºñÆ®À̰í atol()Àº ¹«ÇÑ Á¤¹ÐµµÀÔ´Ï´Ù.) string.split´Â ¼±ÅÃÀûÀÎ "sep" ¸Å°³º¯¼ö¸¦ Á¦°øÇϴµ¥ ±× ¶óÀÎÀÌ °ø¹éÀÌ ¾Æ´Ñ ´Ù¸¥ ¾î¶² °ÍÀ¸·Î ±¸ºÐÀÚ¸¦ »ç¿ëÇϰíÀÚ ÇÒ ¶§ À¯¿ëÇÕ´Ï´Ù.
´õ º¹ÀâÇÑ ÀÔ·Â ÇØ¼®À» À§Çؼ´Â, Á¤±Ô Ç¥Çö½Ä(re¸ðµâ ÂüÁ¶)ÀÌ CÀÇ sscanf()º¸´Ù ´õ °·ÂÇϰí ÀûÇÕÇÕ´Ï´Ù.
sscanf()¸¦ Èä³»³»´Â, ½ºÆ¼ºê Ŭ¸®ÇÁÆ®(Steve Clift)°¡ Á¦°øÇÑ ¸ðµâÀÌ ÀÖ½À´Ï´Ù; ´ÙÀ½ ftp »çÀÌÆ®ÀÇ contrib/Misc/sscanfmodule.c¸¦ ÂüÁ¶Çϼ¼¿ä:
http://www.python.org/ftp/python/contrib-09-Dec-1999/Misc/
from Tkinter import tkinter tkinter.createfilehandler(file, mask, callback)±× ÆÄÀÏÀº ÆÄÀÌ½ã ÆÄÀÏ È¤Àº ¼ÒÄÏ °´Ã¼(½ÇÁ¦·Î, fileno() ¸Þ½îµå¸¦ °¡Áø ¸ðµç °Í), ȤÀº Á¤¼ö ÆÄÀÏ ±â¼úÀÚÀÏ ¼ö ÀÖ½À´Ï´Ù. mask´Â tkinter.READABLE ¶Ç´Â tkinter.WRITABLE »ó¼öÁßÀÇ ÇϳªÀÔ´Ï´Ù. ¿ªÈ£ÃâÀº ´ÙÀ½°ú °°ÀÌ È£ÃâµË´Ï´Ù:
callback(file, mask)ÀÛ¾÷ÀÌ ³¡³ª¸é, ´ÙÀ½À» »ç¿ëÇÏ¿© ¹Ýµå½Ã ±× ¿ªÈ£Ãâ ÇÔ¼ö¸¦ µî·Ï Ãë¼ÒÇØ¾ß ÇÕ´Ï´Ù.
tkinter.deletefilehandler(file)ÁÖÀÇ: Àб⸦ À§ÇØ *¾ó¸¶³ª ¸¹Àº ¹ÙÀÌÆ®°¡* »ç¿ë°¡´ÉÇÑÁö¸¦ ¾Ë ¼ö ¾øÀ¸¹Ç·Î, ÆÄÀÌ½ã ÆÄÀÏ °´Ã¼ÀÇ read ¶Ç´Â readline ¸Þ½îµå¸¦ »ç¿ëÇÒ ¼ö ¾ø´Âµ¥, ¿Ö³ÄÇϸé À̰͵éÀº °è¼ÓÇÏ¿© ¹Ì¸® Á¤ÀÇµÈ °³¼öÀÇ ¹ÙÀÌÆ®¸¦ ÀÐÀ¸·Á°í ½ÃµµÇϱ⠶§¹®ÀÔ´Ï´Ù. ¼ÒÄÏ¿¡ ´ëÇØ¼, recv() ȤÀº recvfrom() ¸Þ½îµå´Â Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù; ´Ù¸¥ ÆÄÀϵ鿡 ´ëÇØ¼´Â, os.read(file.fileno(), maxbytecount)¸¦ »ç¿ëÇϼ¼¿ä.
1) Àü¿ª º¯¼ö¸¦ »ç¿ëÇÔÀ¸·Î½á; ±×·¯³ª ¾Æ¸¶µµ ±×·¡¼´Â ¾ÈµÇ°ÚÁö¿ä :-)
2) º¯°æ°¡´É(ÀûÀýÇÑ °÷¿¡¼ º¯°æ°¡´É)ÇÑ °´Ã¼¸¦ °Ç³× ÁÜÀ¸·Î½á:
def func1(a): a[0] = 'new-value' # 'a' references a mutable list a[1] = a[1] + 1 # changes a shared object
args = ['old-value', 99] func1(args) print args[0], args[1] # output: new-value 1003) ÀμöµéÀÇ ¸¶Áö¸· °ªÀ» À¯ÁöÇϰí, ÅÍÇÃÀ» ¹ÝȯÇÔÀ¸·Î½á:
def func2(a, b): a = 'new-value' # a and b are local names b = b + 1 # assigned to new objects return a, b # return new values
x, y = 'old-value', 99 x, y = func2(x, y) print x, y # output: new-value 1004) ±×¸®°í ÆÄÀ̽ãÀÇ °´Ã¼ ¸ðµ¨À¸·ÎºÎÅÍ ÆÄ»ýµÈ ´Ù¸¥ ¾ÆÀ̵ð¾î. ¿¹¸¦ µé¾î, º¯°æ°¡´ÉÇÑ »çÀü¿¡ °Ç³×ÁÖ´Â °ÍÀÌ ´õ ¸í·áÇÒ ¼öµµ ÀÖ½À´Ï´Ù:
def func3(args): args['a'] = 'new-value' # args is a mutable dictionary args['b'] = args['b'] + 1 # change it in-place
args = {'a':' old-value', 'b': 99} func3(args) print args['a'], args['b']5) ¶Ç´Â Ŭ·¡½º ½Çü¿¡ °ªµéÀ» ÇÔ²² ½Î-³Ö¾î¼:
class callByRef: def __init__(self, **args): for (key, value) in args.items(): setattr(self, key, value)
def func4(args): args.a = 'new-value' # args is a mutable callByRef args.b = args.b + 1 # change object in-place
args = callByRef(a='old-value', b=99) func4(args) print args.a, args.b
±×·¯³ª À̰ÍÀ» º¹ÀâÇÏ°Ô ÇØ¾ßÇÒ ¾î¶² Á¤´çÇÑ ÀÌÀ¯µµ ¾ø½À´Ï´Ù :-).[ÆÄÀ̽ãÀÇ ÀúÀÚ´Â ¼¼¹øÂ° ÇØ°áÃ¥À» ´ëºÎºÐÀÇ °æ¿ì¿¡ ¼±È£ÇÕ´Ï´Ù.]
óÀ½¿¡´Â ¾à°£ ³î¶ó°ÚÁö¸¸, Àá½Ã »ý°¢ÇØ º¸¸é ÀÌÇØ°¡ µË´Ï´Ù. ÇÑ ÆíÀ¸·Î´Â, ÇÒ´çµÈ º¯¼öµé¿¡ ´ëÇØ 'global'À» ¿ä±¸ÇÔÀ¸·Î½á ÀǵµÇÏÁö ¾ÊÀº ºÎ-ÀÛ¿ëÀ¸·ÎºÎÅÍ ¹æ¾î¸·À» Á¦°øÇÕ´Ï´Ù. ´Ù¸¥ ÇÑÆíÀ¸·Î, ¸¸¾à globalÀÌ ¸ðµç Àü¿ª ÂüÁ¶¿¡ ´ëÇÏ¿© ÇÊ¿äÇÏ´Ù¸é, Ç×»ó globalÀ» »ç¿ëÇÏ´Â ÆíÀÌ ÁÁÀ» °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, ³»Àå ÇÔ¼ö ȤÀº ¼öÀÔµÈ ¸ðµâÀÇ ÄÄÆ÷³ÍÆ®¿¡ ´ëÇÑ ¸ðµç ÂüÁ¶Á¡µéÀ» global·Î ¼±¾ðÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ È¥¶õ¶§¹®¿¡ ºÎ-ÀÛ¿ëÀ» ±¸º°ÇØ ³»´Â 'Àü¿ª'¼±¾ðÀÇ À¯¿ëÇÔÀÌ ºûÀ» ÀÒ¾î ¹ö¸± °ÍÀÔ´Ï´Ù.
¸ÕÀú: ¸ðµç ¼öÃâ¹® (Àü¿ª º¯¼ö, ÇÔ¼ö, ±×¸®°í Ŭ·¡½º¿Í °°Àº, ¼öÀÔµÈ ±âº» Ŭ·¡½º¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â °Íµé).
±×¸®°í ³ª¼: ¸ðµç ¼öÀÔ ¼¼ú¹®.
¸¶Áö¸·À¸·Î: ¸ðµç ÀÛµ¿ ÄÚµå (¼öÀÔµÈ °ªÀ¸·ÎºÎÅÍ ÃʱâÈµÈ Àü¿ª º¯¼öµéÀ» Æ÷ÇÔÇÑ´Ù).
¼öÀÔ¹®µéÀÌ ÀÌ»óÇÑ °÷¿¡ ³ªÅ¸³ª±â ¶§¹®¿¡ ÆÄÀ̽ãÀÇ ÀúÀÚ´Â ÀÌ·¯ÇÑ Á¢±Ù¹ýÀ» º°·Î ÁÁ¾ÆÇÏÁö ¾Ê½À´Ï´Ù, ±×·¯³ª ±×°ÍÀÌ ÀÛµ¿ÇÑ´Ù´Â °ÍÀº ÀÎÁ¤ÇØ¾ß ÇÕ´Ï´Ù. ±×°¡ ±ÇÀåÇÑ Àü·«Àº ¸ðµç "from <module> import *"ÀÇ »ç¿ëÀ» ÇÇÇϰí (±×·¡¼ ¼öÀÔµÈ ¸ðµâÀÇ ¸ðµç °ÍÀº <module>.<name>À¸·Î ÂüÁ¶µË´Ï´Ù.) ±×¸®°í ¸ðµç Äڵ带 ÇÔ¼ö ¾ÈÂÊ¿¡ ¹èÄ¡È÷´Â °ÍÀÔ´Ï´Ù. Àü¿ª º¯¼ö¿Í Ŭ·¡½º º¯¼ö¸¦ ÃʱâÈ ÇÏ·Á¸é »ó¼ö ȤÀº ³»Àå ÇÔ¼ö¸¸À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.
º¯°æºÒ°¡ °´Ã¼(¼ýÀÚ, ¹®ÀÚ¿, ÅÍÇÃ)¿¡ ´ëÇØ¼´Â, º¹Á¦°¡ ºÒÇÊ¿äÇѵ¥ ±×µéÀÇ °ªÀÌ º¯°æÀÌ ºÒ°¡´ÉÇϱ⠶§¹®ÀÔ´Ï´Ù. ¸®½ºÆ® (±×¸®°í ÀϹÝÀûÀ¸·Î º¯°æ°¡´ÉÇÑ ¿¬¼Ó¿ Çüµé)¿¡ ´ëÇØ¼´Â, º¹Á¦´Â Ç¥Çö½Ä l[:]¿¡ ÀÇÇØ¼ »ý¼ºµË´Ï´Ù. »çÀüÀ» À§Çؼ´Â, ´ÙÀ½ÀÇ ÇÔ¼ö°¡ º¹Á¦¹°À» ¹ÝȯÇÕ´Ï´Ù:
def dictclone(o): n = {} for k in o.keys(): n[k] = o[k] return n¸¶Áö¸·À¸·Î, ÀϹÝÀûÀÎ °´Ã¼¿¡ ´ëÇØ¼´Â, "copy" ¸ðµâÀº °´Ã¼¸¦ º¹»çÇϱâ À§ÇØ µÎ °³ÀÇ ÇÔ¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù. copy.copy(x)´Â À§¿¡ ¾ð±ÞÇÑ ±ÔÄ¢¿¡ ÀÇÇÏ¿© º¸¿©Áø´ë·Î º¹»çº»À» ¹ÝȯÇÕ´Ï´Ù. copy.deepcopy(x)´Â º¹ÇÕÀûÀÎ °´Ã¼ÀÇ ¿ä¼Òµéµµ º¹»çÇÕ´Ï´Ù. ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó¿¡ ÀÖ´Â ÀÌ ¸ðµâ¿¡ °üÇÑ ¼½¼ÇÀ» »ìÆìº¸¼¼¿ä.
¾à°£Àº ¾î»öÇÑ Ã³¸® ¹æ¹ýÀº pickleÀÇ ±Í¿©¿î ¿©µ¿»ý, marshalÀ» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. marshal ¸ðµâÀº ºñ¼øÈ¯Àû ±âº» ÆÄÀ̽ã ÇüµéÀ» ÆÄÀϰú ¹®ÀÚ¿·Î, ±×¸®°í ±× ¹Ý´ë·Î ÀúÀåÇÏ´Â ´ë´ÜÈ÷ ºü¸¥ ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù. marshalÀÌ ½ÇüµéÀ» ÀúÀåÇϰųª °øÀ¯ ÂüÁ¶Á¡µéÀ» ÀûÀýÇÏ°Ô Ã³¸®ÇÏ´Â ÀÛ¾÷µî¿¡´Â ºÎÀûÀýÇϱâ´Â ÇÏÁö¸¸, ±×°ÍÀº ¾öû³ª°Ô ºü¸£°Ô ½ÇÇàµË´Ï´Ù. ¿¹¸¦ µé¾î ¹Ý ¸Þ°¡ÀÇ µ¥ÀÌŸ¸¦ ÀûÀçÇϴµ¥ (¾î¶² ¸Ó½Å¿¡¼´Â) 3ºÐÀÇ 1ÃÊ ÀÌÇϰ¡ ¼Ò¿äµË´Ï´Ù. ¶§·Î´Â À̰Ͷ§¹®¿¡ gdbmÀ» pickle/shelve¿Í »ç¿ëÇÏ´Â °Í°ú °°Àº Á» ´õ º¹ÀâÇϰí ÀϹÝÀûÀÎ ÀÛ¾÷À» ÇÏ´Â °ÍÀÌ ºûÀ» ÀÒ½À´Ï´Ù.
µð·ºÅ丮¸¦ Á¦°ÅÇϱâ À§Çؼ´Â, os.rmdir()À» »ç¿ëÇϰí; os.mkdir()À» »ç¿ëÇØ¼ µð·ºÅ丮¸¦ ¸¸µå¼¼¿ä.
ÆÄÀÏÀÇ À̸§À» ¹Ù²Ù·Á¸é, os.rename()À» »ç¿ëÇϼ¼¿ä.
ÆÄÀÏÀ» ÀÚ¸£·Á¸é, ±×°ÍÀ» f = open(filename, "r+")À» »ç¿ëÇÏ¿© ¿°í, ±×¸®°í f.truncate(offset)À» »ç¿ëÇϼ¼¿ä; offsetÀº ÇöÀçÀÇ Å½»öÀ§Ä¡°¡ ±âº»°ªÀÔ´Ï´Ù. ("r+" ¸ðµå´Â ±× ÆÄÀÏÀ» Àбâ¿Í ¾²±â¿ëÀ¸·Î °³¹æÇÕ´Ï´Ù.) os.open()À¸·Î ¿·ÁÁø ÆÄÀϵ鿡 ´ëÇØ¼´Â os.ftruncate(fd, offset)µµ ÀÖ½À´Ï´Ù -- À¯´Ð½º Àü¹®°¡¿ë.
shutil ¸ðµâÀº ¶ÇÇÑ ÆÄÀϵ鿡 ´ëÇÑ ÀÛ¾÷À» ÇÏ´Â ¸¹Àº ¼öÀÇ ÇÔ¼öµéÀ» ´ã°í Àִµ¥ copyfile, copytree, ±×¸®°í rmtree µîµîÀ» Æ÷ÇÔÇÕ´Ï´Ù.
ÁÖÀÇÇÒ °ÍÀº ÀÌ·¯ÇÑ °ÍµéÀº ½ÊÁø ¹ø¿ªÀ¸·Î Á¦Çѵȴٴ °ÍÀÔ´Ï´Ù, ±×·¡¼ int('0144') == 144 ±×¸®°í int('0x144')´Â ValueError¸¦ ÀÏÀ¸Åµ´Ï´Ù. ÆÄÀ̽ã 2.0¿¡¼ int´Â º¯È¯Çϱâ À§Çؼ ¹Ø¼ö(base)¸¦ ¼±ÅÃÀûÀÎ µÎ ¹øÂ° Àμö·Î ÃëÇϴµ¥, ±×·¡¼ int('0x144', 16) == 324.
´õ¿í À¯¿¬ÇÏ°Ô »ç¿ëÇÏ°í ½Í°Å³ª, ȤÀº ÆÄÀ̽ã 1.5 ÀÌÀüÀ̶ó¸é, string ¸ðµâÀ» ¼öÀÔÇØ¼ Á¤¼ö¿¡ ´ëÇØ¼´Â string.atoi() ÇÔ¼ö¸¦ »ç¿ëÇϰí, ¹èÁ¤µµ Á¤¼ö¿¡ ´ëÇØ¼´Â string.atol()¸¦ »ç¿ëÇϰųª, ȤÀº ºÎµ¿¼Ò¼öÁ¡¼ö¿¡ ´ëÇØ¼´Â string.atof()¸¦ »ç¿ëÇϼ¼¿ä. ¿¹¸¦ µé¾î, string.atoi('100', 16) == string.atoi('0x100', 0) == 256. string ¸ðµâ¿¡ °üÇÏ¿© ´õ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸¸é ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó ¼½¼ÇÀ» ÂüÁ¶Çϼ¼¿ä.
±×·¯ÇÑ ¸ðµç °Íµé ´ë½Å¿¡ ³»Àå ÇÔ¼ö eval()À» »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸, ±ÇÀåµÇÁö ¾Ê½À´Ï´Ù, ¿Ö³ÄÇÏ¸é ¾î¶²À̰¡ (µð½ºÅ©¸¦ Æ÷¸ËÇÏ´Â °Í°ú °°Àº) ¿øÇÏÁö ¾Ê´Â ºÎÀÛ¿ëÀ» °¡Áö´Â ÆÄÀ̽ã Ç¥Çö½ÄÀ» ³Ñ°ÜÁÙ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ¶ÇÇÑ ¼ýÀÚ¸¦ ÆÄÀ̽ãÀÇ Ç¥Çö½ÄÀ¸·Î ¹ø¿ªÇعö¸®´Â È¿°úµµ °¡Áö´Âµ¥, ¿¹¸¦ µé¾î eval('09')´Â ÆÄÀ̽ãÀÌ '0'À¸·Î ½ÃÀÛÇÏ´Â ¼ýÀÚµéÀ» 8Áø¼ö(base 8)·Î °£ÁÖÇϱ⠶§¹®¿¡ ±¸¹®¿¡·¯¸¦ ¹ß»ý½Ãŵ´Ï´Ù.
±×·¸Áö¸¸, ¾î¶² °íÁ¤µÈ »óȲ¿¡¼´Â Ŭ·¡½º ±¸¼º¿øÀ» Å×½ºÆ®ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
ÆÄÀ̽ã 1.5¿¡¼, ³»Àå ÇÔ¼ö isinstance(obj, cls)¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
´ÙÀ½ÀÇ Á¢±Ù¹ýÀº ÀÌÀüÀÇ ÆÄÀ̽㠹öÀü°ú »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù:
ºÒ¸íÈ®ÇÑ ¹æ½ÄÀº ±× °´Ã¼¸¦ ¿¹¿Ü·Î ÀÏÀ¸Å°°í, Å×½ºÆ® Çϱ⸦ ¿øÇϴ Ŭ·¡½º·Î ±× ¿¹¿Ü¸¦ ³ªÆ÷ÇÏ´Â °ÍÀÔ´Ï´Ù:
def is_instance_of(the_instance, the_class): try: raise the_instance except the_class: return 1 except: return 0ÀÌ Å×Å©´ÐÀº "subclassness"¸¦ Ŭ·¡½ºÀÇ ¸ðÀ½°ú ±¸º°ÇÏ´Â µ¥¿¡ ¿ª½Ã »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.
try: raise the_instance except Audible: the_instance.play(largo) except Visual: the_instance.display(gaudy) except Olfactory: sniff(the_instance) except: raise ValueError, "dunno what to do with this!"À̰ÍÀº ¿¹¿Ü ³ªÆ÷°¡ Ŭ·¡½º ȤÀº ÇϺÎŬ·¡½º ±¸¼º¿øÀ» Å×½ºÆ®ÇÑ´Ù´Â »ç½ÇÀ» ÀÌ¿ëÇÕ´Ï´Ù.
´Ù¸¥ Á¢±Ù¹ýÀº ÁÖ¾îÁø Ŭ·¡½º¿¡ ´ëÇÏ¿© ¾Æ¸¶µµ À¯ÀÏÇÑ Å¬·¡½º ¼Ó¼ºÀÇ Á¸À縦 Å×½ºÆ®ÇÏ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î:
class MyClass: ThisIsMyClass = 1 ...
def is_a_MyClass(the_instance): return hasattr(the_instance, 'ThisIsMyClass')ÀÌ ¹öÀüÀº ¶óÀγ»Àå(inline)ÇϱⰡ ´õ ½¬¿ì¸ç, ´õ¿í ºü¸¦ °ÍÀÔ´Ï´Ù (¶óÀγ»ÀåµÇ¸é(inlined) È®½ÇÈ÷ ´õ ºü¸¨´Ï´Ù). ´ÜÁ¡Àº ´Ù¸¥ ¾î¶² »ç¶÷ÀÌ ´ÙÀ½°ú °°ÀÌ ¼ÓÀÏ ¼ö°¡ ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù:
class IntruderClass: ThisIsMyClass = 1 # Masquerade as MyClass ...±×·¯³ª À̰ÍÀº ÇϳªÀÇ »ç¾çÀ¸·Î¼ °£ÁÖµÉ ¼ö ÀÖ½À´Ï´Ù (¾î¶µç, ÆÄÀ̽㿡´Â ¼ÓÀÏ ¼ö ÀÖ´Â ¼ö ¸¹Àº ´Ù¸¥ ¹æ¹ýµéÀÌ ÀÖ½À´Ï´Ù). ¶Ç ´Ù¸¥ ´ÜÁ¡Àº ±× Ŭ·¡½º°¡ ±¸¼º¿ø(membership) Å×½ºÆ®¸¦ À§ÇØ ¹Ì¸® ÁغñµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¸¸¾à ±× Ŭ·¡½º¸¦ À§ÇØ "¼Ò½º Äڵ带 Á¦¾îÇÏÁö ¾Ê´Â´Ù¸é" ±× Ŭ·¡½º¸¦ º¯°æÇÏ¿© Å×½ºÆ®°¡´ÉÇϵµ·Ï Áö¿øÇÏ´Â °ÍÀº ±ÇÀåÇÒ ¼ö ¾ø½À´Ï´Ù.
from string import upper
class UpperOut: def __init__(self, outfile): self.__outfile = outfile def write(self, str): self.__outfile.write( upper(str) ) def __getattr__(self, name): return getattr(self.__outfile, name)¿©±â¿¡¼ UpperOut Ŭ·¡½º´Â write ¸Þ½îµå¸¦ ÀçÁ¤ÀÇÇÏ¿© ¾Æ·¡ÀÇ self.__outfile.write ¸Þ½îµå¸¦ È£ÃâÇϱâ Àü¿¡ Àμö ¹®ÀÚ¿À» ´ë¹®ÀÚ·Î º¯È¯ÇÕ´Ï´Ù, ±×·¯³ª ¸ðµç ´Ù¸¥ ¸Þ½îµåµéÀº ¾Æ·¡ÀÇ self.__outfile °´Ã¼¿¡ À§Àӵ˴ϴÙ. À§ÀÓ(delegation)Àº "¸¶¹ýÀÇ" __getattr__ ¸Þ½îµå·Î ´Þ¼ºµË´Ï´Ù. ÀÌ ¸Þ½îµåÀÇ »ç¿ë¹ý¿¡ °üÇÏ¿© ´õ ¸¹Àº Á¤º¸¸¦ ¿øÇÏ½Ã¸é ¾ð¾î ÂüÁ¶¼¸¦ º¸¼¼¿ä.
´õ¿í ÀϹÝÀûÀÎ °æ¿ì¿¡ ´ëÇØ¼´Â À§ÀÓ(delegation)Àº ²Ä¼öÀûÀÏ ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ¼Ó¼ºÀ» ¼³Á¤Çϰųª ȹµæÇؾ߸¸ ÇÒ ¶§´Â, ±× Ŭ·¡½º´Â ¹Ýµå½Ã __settattr__ ¸Þ½îµåµµ ¿ª½Ã Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù, ±×¸®°í ´ë´ÜÈ÷ ÁÖÀDZí°Ô ±×·¸°Ô ÇØ¾ß¸¸ ÇÕ´Ï´Ù.
__setattr__ÀÇ ±âº»ÀûÀÎ ±¸ÇöÀº ´ÙÀ½°ú ´ëüÀûÀ¸·Î µ¿µîÇÕ´Ï´Ù:
class X: ... def __setattr__(self, name, value): self.__dict__[name] = value ...´ëºÎºÐÀÇ __setattr__ ±¸ÇöÀº self.__dict__¸¦ º¯°æÇÏ¿© ¹«ÇÑ Àç±Í¸¦ ¾ß±âÇÏÁö ¾Ê°í¼ self¿¡ ´ëÇÑ Áö¿ª »óŸ¦ ÀúÀåÇÏ¿©¾ß ÇÕ´Ï´Ù.
http://pyunit.sourceforge.net//µ¶¸³ÀûÀÎ Å×½ºÆ®¸¦ À§Çؼ´Â, ÈǸ¢ÇÑ ¸ðµâ µðÀÚÀÎÀ» »ç¿ëÇÏ¿©, ½±°Ô Å×½ºÆ® µÉ ¼ö ÀÖµµ·Ï, ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀÌ µµ¿òÀÌ µË´Ï´Ù. ƯÈ÷ ÇÁ·Î±×·¥Àº °ÅÀÇ ¸ðµç ±â´ÉÀ» ÇÔ¼ö³ª ȤÀº Ŭ·¡½º ¸Þ½îµå¿¡ ĸ½¶ÈÇØ¾ß ÇÕ´Ï´Ù -- ±×¸®°í À̰ÍÀº ¶§·Î ±× ÇÁ·Î±×·¥À» ´õ ºü¸£°Ô ¸¸µå´Â ³î¶ó¿î ±×¸®°í ±â»Ý ³ÑÄ¡´Â È¿°ú¸¦ °¡Áý´Ï´Ù. (¿Ö³ÄÇϸé Áö¿ª º¯¼ö´Â Àü¿ª º¯¼öº¸´Ù ´õ ºü¸£±â ¶§¹®ÀÔ´Ï´Ù). °Ô´Ù°¡ ÇÁ·Î±×·¥Àº º¯°æµÇ´Â Àü¿ª º¯¼ö¿¡ ÀÇÁ¸ÇÏ´Â °ÍÀ» ÇÇÇØ¾ß ÇÕ´Ï´Ù, ¿Ö³ÄÇϸé À̰ÍÀº Å×½ºÆ®¸¦ ´õ¿í ´õ ¾î·Æ°Ô Çϱ⠶§¹®ÀÔ´Ï´Ù.
ÇÁ·Î±×·¥ÀÇ "Àü¿ªÀû ÁÖ ³í¸®±¸¼º(global main logic)"Àº ´ÙÀ½°ú °°ÀÌ °£°áÇÕ´Ï´Ù.
if __name__=="__main__": main_logic()ÇÁ·Î±×·¥ÀÇ ÁÖ ¸ðµâÀÌ ÃÖÇÏÀ§¿¡ ÀÖ½À´Ï´Ù.
ÇÁ·Î±×·¥ÀÌ ÇÔ¼ö¿Í Ŭ·¡½º ÇàÀ§µéÀÇ °¡½ÃÀûÀÎ ¸ðÀÓÀ¸·Î Á¶Á÷µÇ°í ³ª¸é ±× ÇàÀ§µéÀ» ¿¬½À½ÃÄÑ º¸´Â Å×½ºÆ® ÇÔ¼ö¸¦ ÀÛ¼ºÇÏ¿©¾ß ÇÕ´Ï´Ù. Å×½ºÆ® ¸ðµÒÀº ÀÏ·ÃÀÇ Å×½ºÆ®¸¦ ÀÚµ¿ÈÇÏ´Â °¢ ¸ðµâ°ú °áÇÕµÉ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ¾öû ¸¹Àº ÀÛ¾÷°°ÀÌ µé¸®Áö¸¸, ÆÄÀ̽ãÀº °£°áÇϰí À¯¿¬ÇϹǷΠ³î¶øµµ·Ï ½±½À´Ï´Ù. Å×½ºÆ® ÇÔ¼ö¸¦ "»ý»ê ÄÚµå(production code)"¿Í µ¿½Ã¿¡ ÀÛ¼ºÇÏ°Ô µÇ¸é ´õ¿í ½±°í Àç¹ÌÀÖ°Ô ÄÚµùÇÒ ¼ö ÀÖ½À´Ï´Ù, ¿Ö³ÄÇϸé ÀÌ·¸°Ô ÇÏ¸é ¹ö±×¸¦ ½±°Ô ¹ß°ßÇÒ ¼ö ÀÖ°í ½ÉÁö¾î´Â µðÀÚÀÎ °áÇÔÀ» Á¶±â¿¡ ¹ß°ßÇÒ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù.
ÇÁ·Î±×·¥ÀÇ ÁÖ ¸ðµâ·Î ¾²ÀÌÁö ¾ÊÀ» "Áö¿ø ¸ðµâ(Support modules)"Àº ±× ¸ðµâÀÇ ÀÚü Å×½ºÆ®¸¦ ¿äûÇÏ´Â "Å×½ºÆ® ½ºÅ©¸³Æ® ¹ø¿ª(test script interpretation)"À» Æ÷ÇÔÇÒ ¼ö ÀÖ½À´Ï´Ù.
if __name__ == "__main__": self_test()½ÉÁö¾î´Â º¹ÀâÇÑ ¿ÜºÎ ÀÎÅÍÆäÀ̽º¿Í ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥Á¶Â÷µµ, ±× ¿ÜºÎ ÀÎÅÍÆäÀ̽º°¡ »ç¿ëºÒ°¡´ÉÇÒ ¶§, ÆÄÀ̽ãÀ¸·Î ±¸ÇöµÈ "¸ðÁ¶" ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ¿© Å×½ºÆ® µÉ ¼ö ÀÖ½À´Ï´Ù, ´ÙÀ½ Ŭ·¡½º´Â (ºÎºÐÀûÀÎ) "¸ðÁ¶(fake)" ÆÄÀÏ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù:
import string testdata = "just a random sequence of characters"
class FakeInputFile: data = testdata position = 0 closed = 0
def read(self, n=None): self.testclosed() p = self.position if n is None: result= self.data[p:] else: result= self.data[p: p+n] self.position = p + len(result) return result
def seek(self, n, m=0): self.testclosed() last = len(self.data) p = self.position if m==0: final=n elif m==1: final=n+p elif m==2: final=len(self.data)+n else: raise ValueError, "bad m" if final<0: raise IOError, "negative seek" self.position = final
def isatty(self): return 0
def tell(self): return self.position
def close(self): self.closed = 1
def testclosed(self): if self.closed: raise IOError, "file closed"f=FakeInputFile()À» ½ÃµµÇØ º¸°í ±× ¿¬»êÀ» Å×½ºÆ® ÇØ º¸¼¼¿ä.
A = [[None] * 2] * 3À̰ÍÀº ±æÀÌ 2ÀÎ °°Àº ¸®½ºÆ®¿¡ ´ëÇÑ ¼¼°³ÀÇ ÂüÁ¶Á¡À» Æ÷ÇÔÇÏ´Â ¸®½ºÆ®¸¦ »ý¼ºÇÕ´Ï´Ù. ÇÑ ÁÙ¿¡ ´ëÇÑ º¯°æÀº ¸ðµç ÁÙ¿¡¼ º¸¿©Áú °ÍÀÔ´Ï´Ù, ¾Æ¸¶µµ ¿øÇϽô ¹Ù°¡ ¾Æ´Ò °ÍÀÔ´Ï´Ù. ´ÙÀ½ÀÌ ÈξÀ ´õ Àß ÀÛµ¿ÇÕ´Ï´Ù:
A = [None]*3 for i in range(3): A[i] = [None] * 2À̰ÍÀº ±æÀÌ 2ÀÎ 3 °³ÀÇ ¼·Î ´Ù¸¥ ¸®½ºÆ®¸¦ Æ÷ÇÔÇÏ´Â ¸®½ºÆ®¸¦ ¸¸µé¾î ³À´Ï´Ù.
±«ÀÌÇÏ´Ù°í ´À³¤´Ù¸é, ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÇØ º¼ ¼öµµ ÀÖ½À´Ï´Ù:
w, h = 2, 3 A = map(lambda i,w=w: [None] * w, range(h))ÆÄÀ̽ã 2.0¿¡¼´Â À§ÀÇ ¶óÀÎÀº ¸®½ºÆ® ¹ø¿ªÀ» »ç¿ëÇÏ¿© Ç¥±âµÉ ¼öµµ ÀÖ½À´Ï´Ù:
w,h = 2,3 A = [ [None]*w for i in range(h) ]
def st(List, Metric): def pairing(element, M = Metric): return (M(element), element) paired = map(pairing, List) paired.sort() return map(stripit, paired)
def stripit(pair): return pair[1]ÀÌ Å×Å©´ÐÀº, ·£µé ½´¹Ù¸£Âê(Randal Schwartz)ÀÇ ´öºÐÀ¸·Î, °¢ ¿ä¼Ò¸¦ ±×ÀÇ "Á¤·Ä °ª(sort value)"¿¡ ¦Áö¾îÁÖ´Â ¹æ½ÄÀ¸·Î ¸®½ºÆ®ÀÇ ¿ä¼ÒµéÀ» Á¤·ÄÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ¸¸¾à LÀÌ ¹®ÀÚ¿À» ´ãÀº ¸®½ºÆ®¶ó¸é
import string Usorted = st(L, string.upper)
def intfield(s): return string.atoi( string.strip(s[10:15] ) )
Isorted = st(L, intfield)Usorted´Â LÀÇ ¿ä¼ÒµéÀ» ¸¶Ä¡ ´ë¹®ÀÚÀÎ °Íó·³ Á¤·ÄÇÏ¿© »êÃâÇϰí, ±×¸®°í Isorted´Â LÀÇ ¿ä¼ÒµéÀ» Á¤¼ö °ªµé¿¡ ÀÇÇØ¼ Á¤·ÄÇÏ¿© »êÃâÇϴµ¥ ±× Á¤¼ö°ªµéÀº À§Ä¡ 10¿¡¼ ½ÃÀÛÇÏ¿© À§Ä¡ 15¸¦ ¸¶Áö¸·À¸·Î ½ä¾î ³õÀº ¹®ÀÚ¿ Á¶°¢¿¡ ³ªÅ¸³³´Ï´Ù. ÆÄÀ̽ã 2.0¿¡¼ À̰ÍÀº ¸®½ºÆ® ¹ø¿ªÀ¸·Î ´õ ÀÚ¿¬½º·´°Ô ´Þ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù:
import string tmp1 = [ (string.upper(x),x) for x in L ] # Schwartzian transform tmp1.sort() Usorted = [ x[1] for x in tmp1 ]
tmp2 = [ (int(s[10:15]), s) for s in L ] # Schwartzian transform tmp2.sort() Isorted = [ x[1] for x in tmp2 ]
ÁÖ¸ñÇÒ °ÍÀº Isorted´Â ´ÙÀ½°ú °°ÀÌ °è»êµÉ ¼öµµ ÀÖ½À´Ï´Ù
def Icmp(s1, s2): return cmp( intfield(s1), intfield(s2) )
Isorted = L[:] Isorted.sort(Icmp)±×·¯³ª ÀÌ ¸Þ½îµå´Â LÀÇ °¢ ¿ä¼Òµé¿¡ ´ëÇÏ¿© ¿©·¯¹ø intfield¸¦ °è»êÇϱ⠶§¹®¿¡, ½´¹ÙÂî¾ð º¯Çüº¸´Ù´Â ´õ ´À¸³´Ï´Ù.
ÇÔ¼ö list(seq)´Â ÀÓÀÇÀÇ ¿¬¼Ó¿À» °°Àº ¼ø¼ÀÇ °°Àº Ç׸ñÀ» °¡Áö´Â ¸®½ºÆ®·Î º¯È¯ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, list((1, 2, 3))Àº [1, 2, 3]¸¦ »êÃâÇϰí list('abc')´Â ['a', 'b', 'c']¸¦ »êÃâÇÕ´Ï´Ù. ¸¸¾à ±× Àμö°¡ ¸®½ºÆ®¶ó¸é, seq[:]¿Í ¸¶Âù°¡Áö·Î º¹»çº»À» ¸¸µì´Ï´Ù.
±× Ŭ·¡½ºÀÇ ±¸¼ºÀÚ¸¦ ÇÁ·Î±×·¥ÇÏ¿© ¸ðµç ½ÇüµéÀ» ÃßÀûÇϵµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù, ±×·¯³ª ¿©·¯ºÐÀÌ ´ë´ÜÈ÷ ¶È¶ÈÇÏÁö ¾Ê´Ù¸é, À̰ÍÀÇ ´ÜÁ¡Àº ±× ½ÇüµéÀÌ Àý´ë·Î »èÁ¦µÇÁö ¾Ê´Â´Ù´Â °ÍÀε¥, ¸ðµç ½ÇüµéÀ» ´ãÀº ¸®½ºÆ®°¡ ±× ½ÇüµéÀÇ ÂüÁ¶¸¦ À¯ÁöÇϰí Àֱ⠶§¹®ÀÔ´Ï´Ù.
(ÀÌ ²Ä¼ö´Â È®º¸Çϰí ÀÖ´Â ½ÇüµéÀÇ ÂüÁ¶ Ƚ¼ö¸¦ Á¤±âÀûÀ¸·Î µé¿©´Ù º¸´Â °ÍÀε¥, ¸¸¾à ÂüÁ¶ Ƚ¼ö°¡ ÀÏÁ¤ ¼öÁØ ÀÌÇ϶ó¸é, ±×°ÍÀ» ¸®½ºÆ®·ÎºÎÅÍ Á¦°ÅÇÕ´Ï´Ù. ±× ¼öÁØÀ» °áÁ¤ÇÏ´Â °ÍÀº ²Ä¼öÀûÀÔ´Ï´Ù -- ºÐ¸íÈ÷ 1 º¸´Ù´Â Å©°ÚÁö¿ä.)
regex.match('.*x',"x"*5000)½ÇÆÐÇÒ °ÍÀÔ´Ï´Ù.
À̰ÍÀº ÆÄÀ̽ã 1.5¿¡ µµÀÔµÈ re ¸ðµâ¿¡¼ °íÃÄÁ³½À´Ï´Ù; ´õ Á¤º¸¸¦ ¿øÇϽøé re¿¡ °üÇÑ ¶óÀ̺귯¸® ÂüÁ¶ ¼½¼ÇÀ» Âü°íÇϼ¼¿ä.
handler(signum, frame)±×·¡¼ À̰ÍÀº µÎ °³ÀÇ Àμö·Î ¼±¾ðµÇ¾î¾ß ÇÕ´Ï´Ù:
def handler(signum, frame): ...
x = 1 # make a global
def f(): print x # try to print the global ... for j in range(100): if q>3: x=4ÇÔ¼ö¾È¿¡ ÇÒ´çµÈ ¾î¶² º¯¼öµµ Ưº°ÇÏ°Ô Àü¿ªÀ¸·Î ¼±¾ðµÇÁö ¾Ê´Â ÇÑ ±× ÇÔ¼ö¿¡ ´ëÇÏ¿© Áö¿ªÀûÀÔ´Ï´Ù. ÇϳªÀÇ °ªÀÌ ±× ÇÔ¼ö ¸öüÀÇ ¸¶Áö¸· ¼¼ú¹®À¸·Î x ¿¡ ¿«¿© ÀÖÀ¸¹Ç·Î, ÄÄÆÄÀÏ·¯´Â x °¡ Áö¿ªÀûÀ̶ó°í °£ÁÖÇÕ´Ï´Ù. °á°úÀûÀ¸·Î "print x"´Â ÃʱâÈ µÇÁö ¾ÊÀº Áö¿ª º¯¼ö¸¦ Ãâ·ÂÇÏ·Á°í ½ÃµµÇϰí NameError¸¦ Ã˹߽Ãų °ÍÀÔ´Ï´Ù.
±×·¯ÇÑ °æ¿ì¿¡ ÇØ°áÃ¥Àº ¸í½ÃÀûÀÎ Àü¿ª ¼±¾ðÀ» ±× ÇÔ¼öÀÇ Ã³À½¿¡ »ðÀÔÇÏ´Â °ÍÀÔ´Ï´Ù, ±×°ÍÀ» ¸¸µé¾î º¸¸é
def f(): global x print x # try to print the global ... for j in range(100): if q>3: x=4
ÀÌ °æ¿ì¿¡, x ¿¡ ´ëÇÑ ¸ðµç ÂüÁ¶Á¡Àº ¸ðµâ À̸§°ø°£¿¡¼ ¿Â x ¿¡ ´ëÇÑ ÂüÁ¶Á¡À¸·Î ÀÌÇØµË´Ï´Ù.
À½¼ö ÁöÇ¥¸¦ »ç¿ëÇÏ¸é ´ë´ÜÈ÷ Æí¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î ¹®ÀÚ¿ LineÀÌ newlineÀ¸·Î ³¡³ª¸é Line[:-1]Àº ±× newlineÀ» »« LineÀÇ ¸ðµç °ÍÀÔ´Ï´Ù.
½½ÇÁ°Ôµµ ¸®½ºÆ® ³»Àå ¸Þ½îµå L.insert´Â À½ÀÇ ÁöÇ¥¸¦ ÁؼöÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ »ç¾çÀº ½Ç¼ö¶ó°í »ý°¢µÇ¾îÁú ¼öµµ ÀÖ°ÚÁö¸¸ ½ÇÁ¸ÇÏ´Â ÇÁ·Î±×·¥µéÀÌ ÀÌ »ç¾ç¿¡ ÀÇÁ¸Çϰí ÀÖÀ¸¹Ç·Î ¿À·§µ¿¾È À¯ÁöµÉ °Í °°½À´Ï´Ù. À½¼ö ÁöÇ¥¿¡ ´ëÇÑ L.insert´Â ±× ¸®½ºÆ®ÀÇ ½ÃÀۺο¡ »ðÀÔÇÕ´Ï´Ù. "ÀûÀýÇÑ" À½ÀÇ ÁöÇ¥ ÇàÀ§¸¦ ¾òÀ¸·Á¸é ±× insert ¸Þ½îµå ´ë½Å¿¡ L[n:n] = [x]À» »ç¿ëÇϼ¼¿ä.
>>> list1 = ["what", "I'm", "sorting", "by"] >>> list2 = ["something", "else", "to", "sort"] >>> pairs = map(None, list1, list2) >>> pairs [('what', 'something'), ("I'm", 'else'), ('sorting', 'to'), ('by', 'sort')] >>> pairs.sort() >>> pairs [("I'm", 'else'), ('by', 'sort'), ('sorting', 'to'), ('what', 'something')] >>> result = pairs[:] >>> for i in xrange(len(result)): result[i] = result[i][1] ... >>> result ['else', 'sort', 'to', 'something']±×¸®°í ¹®Á¦¸¦ ÀÌÇØ ¸øÇϰڴٸé, À§ÀÇ ¿¹Á¦¸¦ º¸¼¼¿ä;c). "I'm"ÀÌ "by" ¾Õ¿¡ Á¤·ÄµÈ´Ù´Â °ÍÀ» ÁÖ¸ñÇϼ¼¿ä. ¿Ö³ÄÇÏ¸é ¾Æ½ºÅ° ¼ø¼·Î ´ë¹®ÀÚ "I"´Â ¼Ò¹®ÀÚ "b"ÀÇ ¾Õ¿¡ ¿À±â ¶§¹®ÀÔ´Ï´Ù. Áú¹® 4.51µµ ÂüÁ¶Çϼ¼¿ä.
ÆÄÀ̽ã 2.0¿¡¼ À̰ÍÀº ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù:
>>> list1 = ["what", "I'm", "sorting", "by"] >>> list2 = ["something", "else", "to", "sort"] >>> pairs = zip(list1, list2) >>> pairs [('what', 'something'), ("I'm", 'else'), ('sorting', 'to'), ('by', 'sort')] >>> pairs.sort() >>> result = [ x[1] for x in pairs ] >>> result ['else', 'sort', 'to', 'something'][Followup]
¾î¶² »ç¶÷ÀÌ ¹°¾ú½À´Ï´Ù, ¸¶Áö¸· ´Ü°è¿¡ ´ëÇØ¼´Â ÀÌ°Ç ¾î¶§¿ä:
result = [] for p in pairs: result.append(p[1])À̰ÍÀÌ ÈξÀ ´õ Àб⠽±½À´Ï´Ù. ±×·¸Áö¸¸, °£´ÜÇÏ°Ô Å×½ºÆ®ÇØ º» ¹Ù¿¡ ÀÇÇÏ¸é ±â´Ù¶õ ¸®½ºÆ®¿¡ ´ëÇØ¼´Â °ÅÀÇ µÎ ¹è³ª ´À¸®´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ½À´Ï´Ù. ¿ÖÀϱî¿ä? ¹«¾ùº¸´Ùµµ, append() ¿¬»êÀº ¸Þ¸ð¸®¸¦ ÀçÇÒ´çÇØ¾ß¸¸ ÇÕ´Ï´Ù, ¾à°£ÀÇ ²Ä¼ö¸¦ »ç¿ëÇØ¼ ¸Å¹ø ±×·¸°Ô ÇÏ´Â °ÍÀ» ÇÇÇϱâ´Â ÇÏÁö¸¸, ¿©ÀüÈ÷ °¡²ûÀº ±×·¸°Ô ÇØ¾ß¸¸ ÇÕ´Ï´Ù, ±×¸®°í ºÐ¸íÈ÷ ±×°Í¶§¹®¿¡ ¸¹Àº ´ë°¡¸¦ Ä¡¸¨´Ï´Ù. µÎ¹øÂ°·Î, Ç¥Çö½Ä "result.append"´Â ¿©ºÐÀÇ ¼Ó¼º ÂüÁ¶¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù. ¼Ó¼º ÂüÁ¶´Â ´ÙÀ½°ú °°ÀÌ ÀçÀÛ¼ºÇϰԵǸé Á¦°ÅµÉ ¼ö ÀÖ½À´Ï´Ù:
result = [] append = result.append for p in pairs: append(p[1])À̰ÍÀº ÀÒ¾î¹ö¸° ¼Óµµ¸¦ ¾à°£ µÇã¾Æ ÁÖ±â´Â ÇÏÁö¸¸, ¿ø·¡ÀÇ ÇØ°áÃ¥ º¸´Ù´Â ¿©ÀüÈ÷ »ó´çÈ÷ ´À¸®¸ç, ÀüÇô ´ú º¹ÀâÇÏÁöµµ ¾Ê½À´Ï´Ù.
1.4¸¦ »ç¿ëÇϽøé, ÁÖ¾îÁø °´Ã¼°¡ ¾î¶² ¸Þ½îµå¸¦ Áö¿øÇÏ´Â Áö¸¦ __methods__ ¼Ó¼ºÀ» »ìÆìº½À¸·Î½á ¾Ë ¼ö ÀÖ½À´Ï´Ù:
>>> List = [] >>> List.__methods__ ['append', 'count', 'index', 'insert', 'remove', 'reverse', 'sort']
³×, ¿©±â¿¡ httplib¸¦ »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹Á¦°¡ ÀÖ½À´Ï´Ù.
#!/usr/local/bin/python
import httplib, sys, time
### build the query string qs = "First=Josephine&MI=Q&Last=Public"
### connect and send the server a path httpobj = httplib.HTTP('www.some-server.out-there', 80) httpobj.putrequest('POST', '/cgi-bin/some-cgi-script') ### now generate the rest of the HTTP headers... httpobj.putheader('Accept', '*/*') httpobj.putheader('Connection', 'Keep-Alive') httpobj.putheader('Content-type', 'application/x-www-form-urlencoded') httpobj.putheader('Content-length', '%d' % len(qs)) httpobj.endheaders() httpobj.send(qs) ### find out what the server said in response... reply, msg, hdrs = httpobj.getreply() if reply != 200: sys.stdout.write(httpobj.getfile().read())ÁÖ¸ñÇÒ °ÍÀº ÀϹÝÀûÀ¸·Î "url·Î ÄÚµå ÀüȯµÈ Á¦Ãâ(url encoded posts)"¿¡ ´ëÇØ¼´Â (±âº») ÁúÀÇ ¹®ÀÚ¿ÀÌ ¹Ýµå½Ã "ÀοëºÎÈ£È µÇ¾î" , ¿¹¸¦ µé¸é, µ¿µî »çÀÎ(equals signs) ȤÀº °ø¹éÀÌ À̸§ ȤÀº °ª¿¡¼ ³ªÅ¸³¯ ¶§ ÄÚµåÀüȯµÈ ÇüÅ·Πº¯°æµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. urllib.quote¸¦ »ç¿ëÇØ¼ ÀÌ ÀοëºÎÈ£ ºÙÀ̱⸦ ¼öÇàÇϼ¼¿ä. ¿¹¸¦ µé¾î name="Guy Steele, Jr."¸¦ º¸³»·Á¸é:
>>> from urllib import quote >>> x = quote("Guy Steele, Jr.") >>> x 'Guy%20Steele,%20Jr.' >>> query_string = "name="+x >>> query_string 'name=Guy%20Steele,%20Jr.'
¸¸¾à »õ·Î¿î bsddb µ¥ÀÌŸº£À̽º¸¦ ÃʱâÈÇÏ¿´À¸³ª ±× ÇÁ·Î±×·¥ÀÌ Ãæµ¹Çϱâ Àü¿¡ ¾Æ¹«°Íµµ ¾²Áö ¾Ê¾Ò´Ù¸é, °¡²ûÀº ±æÀÌ-0ÀÎ ÆÄÀÏÀ» °¡Áö°Ô µÇ°í ´ÙÀ½¿¡ ±× ÆÄÀÏÀ» ¿¶§´Â ¿¹¿Ü¸¦ ¸¸³ª°Ô µÉ °ÍÀÔ´Ï´Ù.
ù ¹øÂ°´Â 'chmod +x scriptfile' ¶Ç´Â 'chmod 755 scriptfile'¸¦ ½ÇÇàÇÔÀ¸·Î½á ´Þ¼ºµË´Ï´Ù.
µÎ ¹øÂ°´Â ¿©·¯ ¹æ½ÄÀ¸·Î ´Þ¼ºµÉ ¼ö ÀÖ½À´Ï´Ù. °¡Àå ½¬¿î ¹æ¹ýÀº ´ÙÀ½°ú °°Àº ¶óÀÎÀ»
#!/usr/local/bin/pythonÆÄÀÏÀÇ ¹Ù·Î ù ¹øÂ° ¶óÀÎÀ» ÀÛ¼ºÇÏ´Â °ÍÀÔ´Ï´Ù - ¶Ç´Â ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅͰ¡ ¿©·¯ºÐÀÇ Ç÷§Æû¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¾î¶² °æ·Î¸íÀÌ¶óµµ ÁÁ½À´Ï´Ù.
ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅͰ¡ ÀÖ´Â °÷¿¡ »ó°ü ¾øÀÌ ±× ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÏ°í ½Í´Ù¸é, "env" ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. °ÅÀÇ ¸ðµç Ç÷§Æû¿¡¼ ´ÙÀ½Àº Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù, ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅͰ¡ »ç¿ëÀÚÀÇ $PATH°¡ ÁöÁ¤ÇÏ´Â µð·ºÅ丮¿¡ ÀÖ´Ù´Â °¡Á¤ÇÑ´Ù¸é:
#! /usr/bin/env pythonÁÖÀÇ -- CGI ½ºÅ©¸³Æ®¿¡ ´ëÇØ¼´Â ÀÌ·¸°Ô *ÇÏÁö ¸¶¼¼¿ä*. CGI ½ºÅ©¸³Æ®¿¡ ´ëÇÑ $PATH º¯¼ö´Â ¾ÆÁÖ ÀÛ½À´Ï´Ù, ±×·¡¼ ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍÀÇ ½ÇÁ¦ÀûÀÎ Àý´ë °æ·Î¸íÀ» »ç¿ëÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
¶§¶§·Î, »ç¿ëÀÚÀÇ È¯°æÀº ²Ë Â÷¼ /usr/bin/env ÇÁ·Î±×·¥ÀÌ ½ÇÆÐÇÕ´Ï´Ù; ¶Ç´Â ÀüÇô env ÇÁ·Î±×·¥ÀÌ ¾øÀ» ¼öµµ ÀÖ½À´Ï´Ù. ±×·¯ÇÑ °æ¿ì¿¡´Â, ´ÙÀ½ÀÇ (¾Ë·º½º ·¹Áø½ºÅ°(Alex Rezinsky)ÀÇ ¹è·Á¿¡ ÀÇÇÑ) Àӽà º¯ÅëÀ» »ç¿ëÇØ º¼ ¼ö ÀÖ½À´Ï´Ù:
#! /bin/sh """:" exec python $0 ${1+"$@"} """´ÜÁ¡À̶ó¸é À̰ÍÀÌ ±× ½ºÅ©¸³Æ®ÀÇ __doc__ ¹®ÀÚ¿ÀÌ µÇ¾î¹ö¸°´Ù´Â °ÍÀε¥, ±×·¸Áö¸¸ ´ÙÀ½°ú °°ÀÌ µ¡ ºÙ¿©¼ ±×°ÍÀ» ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù.
__doc__ = """...Whatever..."""
if List: List.sort() last = List[-1] for i in range(len(List)-2, -1, -1): if last==List[i]: del List[i] else: last=List[i]¸¸¾à ±× ¸®½ºÆ®ÀÇ ¸ðµç ¿ä¼ÒµéÀÌ »çÀüÀÇ Å°·Î »ç¿ëµÈ´Ù¸é (Áï, ¸ðµÎ ÇØ½¬°è»êÀÌ °¡´ÉÇÏ´Ù¸é) À̰ÍÀº ¾î¶² ¶§´Â ´õ ºü¸¨´Ï´Ù.
d = {} for x in List: d[x]=x List = d.values()¶ÇÇÑ, ±²ÀåÈ÷ °Å´ëÇÑ ¸®½ºÆ®¿¡ ´ëÇØ¼ ´õ ÃÖÀûÀÇ ´ë¾ÈÀº ù ¹øÂ° ¹æ¹ýÀ̶ó°í »ý°¢ÇÒ °ÍÀÔ´Ï´Ù. µÎ ¹øÂ° ´ë¾ÈÀº »ç¿ëµÉ ¼ö ÀÖÀ» ¶§¸¶´Ù ¾ÆÁÖ ÈǸ¢ÇÕ´Ï´Ù.
ÀÚÀ¯·Ó°Ô ¾òÀ» ¼ö ÀÖ´Â ¼ÒÇÁÆ®¿þ¾îÀÇ º»¼º»ó, ³ª´Â ÀÌ Áø¼úÀÌ ¹ýÀûÀ¸·Î ±¸¼Ó·ÂÀÌ ¾ø´Ù´Â °ÍÀ» Ãß°¡ ÇØ¾ß ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ÆÄÀ̽ãÀÇ º¹»ç±Ç °íÁö»çÇ׿¡´Â ´ÙÀ½ÀÇ ±Ç¸®ºÎÀÎÀÌ ÀÖ½À´Ï´Ù:
STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ¾î¶°ÇÑ Æ¯º°ÇÑ, °£Á¢Àû ȤÀº»ó´çÇÑ ÇÇÇØ¿¡ ´ëÇØ¼µµ, ȤÀº µ¥ÀÌŸ, ÀÌÀÍÀÇ ¸Á½Ç,»ç¿ëºÒ´ÉÀ¸·Î ÀÎÇÑ ¾î¶² ÇÇÇØ¿¡ ´ëÇØ¼µµ, ¼ÒÇÁÆ®¿þ¾îÀÇ ¼öÇà ȤÀº »ç¿ë°ú °ü·ÃÇÑ È¤Àº ¾ß±âµÈ, ¼ÒȦÇàÀ§, °è¾àÇàÀ§ ȤÀº ´Ù¸¥ °Á¦ ÇàÀ§µî »ó¾÷ÀûÀÌ¿ë°ú ÃÖÀûÈ¿¡ ´ëÇÑ ¸ðµç ¹¬½ÃÀû º¸ÁõÀ»Æ÷ÇÔÇÏ¿©, ¾î¶² °æ¿ì¶óµµ CNRI´Â ÀÌ ¼ÒÇÁÆ®¿þ¾î¿¡ ´ëÇÑ ¸ðµç º¸ÁõÀ» ºÎÀÎÇÑ´ÙÁÁÀº ¼Ò½ÄÀº ¸¸¾à ¿©·¯ºÐÀÌ ¹®Á¦¿¡ ºÀÂøÇϸé, Àüü ¼Ò½º¸¦ ¾òÀ» ¼ö ÀÖ¾î¼ ±×°ÍÀ» ÃßÀûÇÏ¿© ¹®Á¦¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù!
def method_map(objects, method, arguments): """method_map([a,b], "flog", (1,2)) gives [a.flog(1,2), b.flog(1,2)]""" nobjects = len(objects) methods = map(getattr, objects, [method]*nobjects) return map(apply, methods, [arguments]*nobjects)map, apply, getattr ±×¸®°í ÆÄÀ̽ãÀÇ ´Ù¸¥ µ¿Àû »ç¾çµéÀÇ ½Åºñ¸¦ ÀÌÇØÇÏ´Â °ÍÀº ÀϹÝÀûÀ¸·Î ÁÁÀº »ý°¢ÀÔ´Ï´Ù.
import random
random.random()À̰ÍÀº [0, 1) ¹üÀ§ÀÇ ¹«ÀÛÀ§ÀûÀÎ ºÎµ¿¼Ò¼öÁ¡ ¼ö¸¦ ¹ÝȯÇÕ´Ï´Ù.
ÀÌ ¸ðµâ¿¡´Â ´Ù¸¥ Ưº°ÇÑ »ý¼ºÀÚ(generator)µµ ÀÖ½À´Ï´Ù:
randrange(a, b)´Â [a, b) ¹üÀ§ÀÇ Á¤¼ö¸¦ ¼±ÅÃÇÕ´Ï´Ù. choice(S)´Â ÁÖ¾îÁø ¿¬¼Ó¿¿¡¼ ¼±ÅÃÇÕ´Ï´Ù. uniform(a, b)´Â [a, b) ¹üÀ§ÀÇ ºÎµ¿¼Ò¼öÁ¡ ¼ö¸¦ ¼±ÅÃÇÕ´Ï´Ù.¹«ÀÛÀ§ ¼ö »ý¼º±âÀÇ ÃʱâÈ ¼³Á¤À» °Á¦ÇÏ·Á¸é, ´ÙÀ½À» »ç¿ëÇϼ¼¿ä.
seed(x, y, z)´Â [1, 256) »çÀÌÀÇ ¼¼ °³ÀÇ Á¤¼ö·ÎºÎÅÍ ¾¾ °ªÀ» ¼³Á¤ÇÕ´Ï´Ù.RandomÀ̶ó´Â, Ŭ·¡½ºµµ Àִµ¥ ±×°ÍÀ» ÃʱâÈÇÏ¿© µ¶¸³ÀûÀÎ ´ÙÁß ¹«ÀÛÀ§ ¼ö »ý¼º±â¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
±× ¸ðµâÀº ¶ÇÇÑ ´Ù¾çÇÑ Ç¥ÁØ ¹èÆ÷º»¿¡ ÁØÇÏ´Â ÇÔ¼öµéÀ» ´ã°í ÀÖ½À´Ï´Ù.
ÀÌ ¸ðµç °ÍÀº ¶óÀ̺귯¸® ÂüÁ¶ ¸Å´º¾ó¿¡ ¹®¼È µÇ¾î ÀÖ½À´Ï´Ù. ¸ðµâ "whrandom"Àº Æó±âµÇ¾ú´Ù´Â °ÍÀ» ÁÖÀÇÇϼ¼¿ä.
ftp://ftp.python.org/pub/python/contrib/sio-151.zip http://www.python.org/ftp/python/contrib/sio-151.zipµµ½º¸¦ À§Çؼ´Â, Çѽº ³ë¹ÚÀÇ Python-DX¸¦ ½ÃÇèÇØ º¸¼¼¿ä, À̰ÍÀ» Áö¿øÇÕ´Ï´Ù, ´ÙÀ½ ÂüÁ¶:
http://www.cuci.nl/~hnowak/À¯´Ð½º¸¦ À§Çؼ´Â, (http://www.python.org/search/¸¦ »ç¿ëÇÏ¿©) µ¥ÀÚ ´º½º¸¦ Ž»öÇϼż ÀúÀÚ°¡ ¹ÌÄ¡ äÇÁ¸¸(Mitch Chapman)ÀÎ "serial port"¸¦ ã¾Æ º¸¼¼¿ä (±×ÀÇ ±ÛÀ» ¿©±â¿¡ Æ÷ÇÔ½ÃŰ±â¿¡´Â ¾à°£ ±æ±º¿ä).
¸ÞÀϸµ ¸®½ºÆ®·ÎºÎÅÍ ÇÁ·¹µå¸¯ ·éÆ®(Fredrik Lundh)¸¦ ÀοëÇÔ:
¸ÕÀú, Tk ¹öư À§Á¬Àº ³»ºÎÀÇ photoimage °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶Á¡À» À¯ÁöÇϰí ÀÖÁö¸¸, Tkinter´Â ±×·¸Áö ¾Ê½À´Ï´Ù. ±×·¡¼ ÆÄÀ̽ãÀÇ ¸¶Áö¸· ÂüÁ¶Á¡ÀÌ »ç¶óÁö¸é, Tkinter´Â Tk¿¡°Ô photoimage¸¦ ÇØÁ¦Çϵµ·Ï ¸í·ÉÇÕ´Ï´Ù. ±×·¯³ª ±× À̹ÌÁö´Â À§Á¬ÀÌ »ç¿ëÇϰí ÀÖÀ¸¹Ç·Î, Tk´Â ±×°ÍÀ» ÆÄ±«ÇÏÁö ¾Ê½À´Ï´Ù. ¿ÏÀüÇϰԴ ¾Æ´Õ´Ï´Ù. ±× À̹ÌÁö¸¦ °ø¹éÈ ÇÏ¿©¼, ¿ÏÀüÈ÷ Åõ¸íÇÏ°Ô ¸¸µé¾î ¹ö¸®´Âµ¥...
³× ±×·¸½À´Ï´Ù, 1.4¿¡¼ ó¸®Çϴ Ű¿öµå Àμö¿¡´Â, ¾î¶² °æ¿ì¿¡ ¿©ºÐÀÇ ÂüÁ¶Á¡À» À¯ÁöÇÏ´Â ¹ö±×°¡ ÀÖ¾ú½À´Ï´Ù. ±×¸®°í ±Íµµ°¡ ±× ¹ö±×¸¦ 1.5¿¡¼ °íÃÆÀ» ¶§´Â, »ó´ç·®ÀÇ Tkinter ÇÁ·Î±×·¥µéÀ» ¸Á°¡ ¶ß·È½À´Ï´Ù....
ÇÁ·¹µå¸¯ ·éÆ®(Fredrik Lundh) (fredrik@pythonware.com)°¡ ¼³¸íÇÑ ¹Ù¿¡ ÀÇÇϸé (ÆÄÀ̽ã-¸®½ºÆ®¿¡¼):
(Àû¾îµµ) ¼¼ °¡Áö Á¾·ùÀÇ ¸ðµÑÀÌ ÆÄÀ̽㿡 ÀÖ½À´Ï´Ù: 1) ÆÄÀ̽ãÀ¸·Î ÀÛ¼ºµÈ ¸ðµâ (.py); 2) C·Î ÀÛ¼ºµÇ°í µ¿ÀûÀ¸·Î ÀûÀçµÇ´Â ¸ðµâ (.dll, .pyd, .so, .sl, µîµî); 3) C·Î ÀÛ¼ºµÇ°í ÀÎÅÍÇÁ¸®ÅÍ¿Í ¿¬°áµÈ ¸ðµâ; ÀÌ·¯ÇÑ °ÍµéÀÇ ¸®½ºÆ®¸¦ ¾òÀ¸·Á¸é, ´ÙÀ½°ú °°ÀÌ Å¸ÀÚÇϼ¼¿ä:
import sys print sys.builtin_module_names
SENDMAIL = "/usr/sbin/sendmail" # sendmail location import os p = os.popen("%s -t" % SENDMAIL, "w") p.write("To: cary@ratatosk.org\n") p.write("Subject: test\n") p.write("\n") # blank line separating headers from body p.write("Some text\n") p.write("some more text\n") sts = p.close() if sts != 0: print "Sendmail exit status", stsºñ-À¯´Ð½º ½Ã½ºÅÛ¿¡¼´Â (±×¸®°í ¹°·Î, À¯´Ð½º ½Ã½ºÅÛ¿¡¼µµ!), SMTP¸¦ »ç¿ëÇÏ¿© ¸ÞÀÏÀ» ÀÌ¿ôÀÇ ¸ÞÀÏ ¼¹ö¿¡ º¸³¾ ¼ö ÀÖ½À´Ï´Ù. ÆÄÀ̽ã 1.5.1 ÀÌÈÄ·Î SMTP¸¦ À§ÇÑ ¶óÀ̺귯¸® smtplib.py°¡ Æ÷ÇԵǾú½À´Ï´Ù. ¿©±â¿¡ ´ë´ÜÇÑ °£´ÜÇÑ »óÈ£´ëÈÀû ¸ÞÀÏ ¼Û½ÅÀÚ°¡ ±×°ÍÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù. ÀÌ ¹æ¹ýÀº SMTP ¼ö½ÅÀÚ¸¦ Áö¿øÇÏ´Â ¾î¶°ÇÑ È£½ºÆ®¿¡ ´ëÇØ¼µµ Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù; ±×·¸Áö ¾ÊÀ¸¸é, »ç¿ëÀÚ¿¡°Ô È£½ºÆ®¸¦ ¿ä±¸ÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù:
import sys, smtplib
fromaddr = raw_input("From: ") toaddrs = string.splitfields(raw_input("To: "), ',') print "Enter message, end with ^D:" msg = '' while 1: line = sys.stdin.readline() if not line: break msg = msg + line
# The actual mail send server = smtplib.SMTP('localhost') server.sendmail(fromaddr, toaddrs, msg) server.quit()
TCP ¿¬°áÀÌ ºí·ÎÅ· µÇ´Â °ÍÀ» ¹æÁöÇÏ·Á¸é, ±× ¼ÒÄÏÀ» ºñ-ºí·ÎÅ·(non-blocking) ¸ðµå·Î ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í ³ª¼ connect()¸¦ ½ÇÇàÇϸé, (±×·²°Í °°Áö´Â ¾Ê°ÚÁö¸¸) Áï°¢ ¿¬°áµÇ°Å³ª ȤÀº ¿¡·¯¹øÈ£(errno)¸¦ ´ãÀº ¿¹¿Ü¸¦ ¾ò½À´Ï´Ù. errno.EINPROGRESS´Â ¿¬°áÀÌ ÁøÇàÁßÀÌÁö¸¸, ¾ÆÁ÷ ¿Ï·áµÇÁö ¾Ê¾Ò´Ù´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. ´Ù¸¥ ¿î¿µÃ¼Á¦¿¡¼´Â ´Ù¸¥ errnos¸¦ ¹ÝȯÇÕ´Ï´Ù, ±×·¡¼ ¿©·¯ºÐÀº Á¡°ËÇØº¼ Çʿ䰡 ÀÖ½À´Ï´Ù. È®½ÇÇÏ°Ô ¸»ÇØ ÁÙ ¼ö ÀÖ´Â °ÍÀº ´Ù¸¥ ¹öÀüÀÇ ¼Ö¶ó¸®½º´Â ¼·Î ´Ù¸¥ errno °ªÀ» ¹ÝȯÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
ÆÄÀ̽ã 1.5 À̻󿡼´Â, connect_ex()¸¦ »ç¿ëÇÏ¿© ¿¹¿Ü¸¦ »ý¼ºÇÏ´Â °ÍÀ» ÇÇÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×°ÍÀº ´ÜÁö errno °ª¸¸À» ¹ÝȯÇÒ °ÍÀÔ´Ï´Ù.
ŽÁö(poll)¸¦ ÇÏ·Á¸é, connect_ex()¸¦ ³ªÁß¿¡ ¶Ç ´Ù½Ã È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù -- 0 ¶Ç´Â errno.EISCONN´Â ¿¬°áµÇ¾î ÀÖ´Ù´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù -- ¶Ç´Â ÀÌ ¼ÒÄÏÀ» ¼¿·ºÆ®(select)¿¡ °Ç³×ÁÖ¾î (±×°ÍÀÌ ¾²±â °¡´ÉÇѰ¡¸¦ Á¡°ËÇÒ ¼ö ÀÖ½À´Ï´Ù).
>>> a = 010À̰ÍÀÌ ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇÏ·Á¸é, ÀÎÅÍÇÁ¸®ÅÍ¿¡¼ "a"¸¦ ŸÀÚÇÏ°í ¿£Å͸¦ Ä¡¸é, ÆÄÀ̽ãÀÌ "a"ÀÇ ÇöÀç °ªÀ» 10Áø¼ö·Î ÅäÇØ ³¾ °ÍÀÔ´Ï´Ù:
>>> a 816Áø¼öµµ ¸¶Âù°¡Áö·Î ½±½À´Ï´Ù. °£´ÜÇÏ°Ô ±× 16Áø¼öÀÇ ¾Õ¿¡ 0(Á¦·Î)¸¦ µÎ°í, ´ÙÀ½¿¡ ¼Ò¹®ÀÚ "x"¸¦ µÎ¼¼¿ä. 16Áø ¼ýÀÚ´Â ¼Ò¹®ÀÚ È¤Àº ´ë¹®ÀÚ·Î ÁöÁ¤µÉ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ¿¡¼´Â:
>>> a = 0xa5 >>> a 165 >>> b = 0XB2 >>> b 178
´Ù¼öÀÇ ÇØ°áÃ¥ÀÌ ÀÖ½À´Ï´Ù; ¾î¶² °ÍÀº curses¸¦ »ç¿ëÇÏ´Â °Í°ú °ü·ÃµÇ´Âµ¥, ±×°ÍÀº ¹è¿ì±â¿¡ ´ë´ÜÈ÷ Å®´Ï´Ù. ¿©±â¿¡ ¾Øµå·ù ÄíŬ¸µ(Andrew Kuchling)ÀÇ ¹è·Á¿¡ ÀÇÇÑ, curses¸¦ »ç¿ëÇÏÁö ¾Ê´Â ÇØ°áÃ¥ÀÌ ÀÖ½À´Ï´Ù (PGP-½ºÅ¸ÀÏÀÇ ¹«ÀÛÀ§¼ö ¹Ù±¸´Ï ¸¸µé±â ÄÚµå·ÎºÎÅÍ ÀοëÇÔ):
import termios, TERMIOS, sys, os fd = sys.stdin.fileno() old = termios.tcgetattr(fd) new = termios.tcgetattr(fd) new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO new[6][TERMIOS.VMIN] = 1 new[6][TERMIOS.VTIME] = 0 termios.tcsetattr(fd, TERMIOS.TCSANOW, new) s = '' # We'll save the characters typed and add them to the pool. try: while 1: c = os.read(fd, 1) print "Got character", `c` s = s+c finally: termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old)À̰ÍÀÌ ÀÛµ¿ÇÏ·Á¸é termios ¸ðµâÀÌ ÇÊ¿äÇÕ´Ï´Ù, ±×¸®°í ¸®´ª½º¿¡¼¸¸ ½ÃµµÇØ º¸¾ÒÀ» »ÓÀÌÁö¸¸, ´Ù¸¥ °÷¿¡¼µµ ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù. ±×°ÍÀº stdinÀÇ ¹ÝÇâÀ» ²ô°í ±âÁØ(canonical) ¸ðµå¸¦ »ç¿ëºÒ°¡·Î Çϰí, ±×¸®°í ³ª¼ ÇÑ ¹ø¿¡ ÇÑ ±ÛÀÚ¾¿ Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÀоîµéÀ̸ç, °¢ Ű´¸² ÀÌÈÄ¿¡´Â ¾Æ¹«°Íµµ ÀÐ¾î µéÀÌÁö ¾Ê½À´Ï´Ù.
C++À¸·Î´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ´Â °÷¿¡¼
class C { C() { cout << "No arguments\n"; } C(int i) { cout << "Argument is " << i << "\n"; } }ÆÄÀ̽㿡¼´Â ±âº» ÀμöµéÀ» »ç¿ëÇÏ¿©, ¸ðµç °æ¿ìµéÀ» ³ªÆ÷ÇÏ´Â ÇÑ °³ÀÇ ±¸¼ºÀÚ¸¦ ÀÛ¼ºÇÏ¿©¾ß ÇÕ´Ï´Ù, ¿¹¸¦ µé¾î:
class C: def __init__(self, i=None): if i is None: print "No arguments" else: print "Argument is", iÀ̰ÍÀº ÀüÀûÀ¸·Î µ¿µîÇÑ °ÍÀº ¾Æ´ÏÁö¸¸, ½Ç¿ëÀûÀ¸·Î´Â ÃæºÐÈ÷ ±ÙÁ¢ÇÕ´Ï´Ù.
°¡º¯-±æÀÌ Àμö ¸®½ºÆ®¸¦ ½ÃÇèÇØ º¼ ¼öµµ ÀÖ½À´Ï´Ù, ¿¹¸¦ µé¾î.
def __init__(self, *args): ....°°Àº Á¢±Ù¹ýÀÌ ¸ðµç ¸Þ½îµå Á¤ÀÇ¿¡ ´ëÇÏ¿© ÀÛµ¿ÇÕ´Ï´Ù.
class Account: def __init__(self, **kw): self.accountType = kw.get('accountType') self.balance = kw.get('balance')
class CheckingAccount(Account): def __init__(self, **kw): kw['accountType'] = 'checking' apply(Account.__init__, (self,), kw)
myAccount = CheckingAccount(balance=100.00)ÆÄÀ̽ã 2.0¿¡¼´Â ±×°ÍÀ» »õ·Î¿î ** ±¸¹®À» »ç¿ëÇÏ¿© Á÷Á¢ È£ÃâÇÒ ¼ö ÀÖ½À´Ï´Ù:
class CheckingAccount(Account): def __init__(self, **kw): kw['accountType'] = 'checking' Account.__init__(self, **kw)ȤÀº ´õ¿í ÀϹÝÀûÀ¸·Î:
>>> def f(x, *y, **z): ... print x,y,z ... >>> Y = [1,2,3] >>> Z = {'foo':3,'bar':None} >>> f('hello', *Y, **Z) hello (1, 2, 3) {'foo': 3, 'bar': None}
±×°ÍÀº python.org ¶Ç´Â Starship¿¡ ÀÖ´Â FTP °øÇå Áö¿ª¿¡¼ ãÀ» ¼ö ÀÖ½À´Ï´Ù. Ž»ö ¿£ÁøÀ» »ç¿ëÇÏ¿© ÃֽйöÀüÀ» ã¾Æ º¸¼¼¿ä.
¶ÇÇÑ ÆÄÀ̽ã ÄÚµå¿Í HTML ÄÚµå »çÀ̸¦ ¸íÈ®ÇÏ°Ô °¥¶óÁÖ´Â, ¹®¼ÀӽÿøÇü(DocumentTemplate)À» °í·ÁÇÏ´Â µ¥¿¡ À¯¿ëÇÒÁöµµ ¸ð¸¨´Ï´Ù. Àӽù®¼¿øÇü(DocumentTemplate)Àº Bobo °´Ã¼ ÃâÆÇ ½Ã½ºÅÛÀÇ (http:/www.digicool.com/releases) ÀϺÎÀÌÁö¸¸ ¹°·Ð µ¶¸³ÀûÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù!
http://starship.skyport.net/crew/danilo/
À̰ÍÀº ÆÄÀ̽㠼ҽº Äڵ忡 ÀÖ´Â ¹®¼È ¹®ÀÚ¿·ÎºÎÅÍ HTMLÀ» ¸¸µé¾î ³¾ ¼ö ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ ÄÚµå´Â µÎ °³ÀÇ 2-¹ÙÀÌÆ® Á¤¼ö¿Í ÇÑ °³ÀÇ 4-¹ÙÀÌÆ® Á¤¼ö¸¦ ÇÑ ÆÄÀÏ·Î ºÎÅÍ Å«°ª-Á¾·áÇü(big-endian) Æ÷¸ËÀ¸·Î ÀнÀ´Ï´Ù:
import struct
f = open(filename, "rb") # Open in binary mode for portability s = f.read(8) x, y, z = struct.unpack(">hhl", s)Æ÷¸Ë ¹®ÀÚ¿ ¼Ó¿¡ ÀÖ´Â '>'´Â Å«°ª-Á¾·áÇü µ¥ÀÌŸ¸¦ °Á¦ÇÕ´Ï´Ù; ±× ¹®ÀÚ¿·ÎºÎÅÍ ¹®ÀÚ 'h'´Â ÇѰ³ÀÇ "´ÜÁ¤µµ Á¤¼ö(2¹ÙÀÌÆ®)"¸¦ ÀÐ¾î µéÀ̰í, ±×¸®°í 'l'Àº ÇѰ³ÀÇ "¹èÁ¤µµ Á¤¼ö(4 ¹ÙÀÌÆ®)"¸¦ ÀÐ¾î µéÀÔ´Ï´Ù.
´õ¿í ±ÔÄ¢ÀûÀÎ µ¥ÀÌŸ (¿¹. Á¤¼ö ȤÀº ½Ç¼öÀÇ µ¿ÁúÀûÀÎ ¸®½ºÆ®)¿¡ ´ëÇØ¼´Â, ¹è¿(array) ¸ðµâµµ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, ¶óÀ̺귯¸® ÂüÁ¶¼¿¡ ¹®¼ÈµÇ¾î ÀÖ½À´Ï´Ù.
°¡Àå ÈçÇÑ ¿øÀÎÀº ¿«ÀÓÀÌ Àû¿ëµÇ´Â ±× À§Á¬ÀÌ "Űº¸µå ÃÊÁ¡(keyboard focus)"À» °¡ÁöÁö ¾Ê´Â °ÍÀÔ´Ï´Ù. ÃÊÁ¡ ¸í·É¾î¿¡ ´ëÇØ¼´Â Tk ¹®¼¸¦ ÂüÁ¶Çϼ¼¿ä. º¸Åë À§Á¬¿¡´Â ÀڽŠ¾È¿¡ Ŭ¸¯ÀÌ µÇ¸é Űº¸µå ÃÊÁ¡ÀÌ ÁÖ¾îÁý´Ï´Ù (±×·¯³ª ¶óº§¿¡ ´ëÇØ¼´Â ¾Æ´Õ´Ï´Ù; (ÃÊÁ¡ ÃëÇϱâ) taketocus(takefocus?) ¼±ÅûçÇ×À» ÂüÁ¶Çϼ¼¿ä).
ÆÄÀ̽ã 1.5ºÎÅÍ´Â, crypt ¸ðµâÀÌ ±âº»À¸·Î ¼³Á¤ºÒ°¡ÀÔ´Ï´Ù. ±×°ÍÀ» ¼³Á¤°¡´ÉÅä·Ï Çϱâ À§Çؼ´Â, ÆÄÀ̼± ¼Ò½º Æ®¸®·Î µé¾î°¡ ÆÄÀÏ Modules/SetupÀ» ÆíÁýÇØ¼ °¡´ÉÇϵµ·Ï ÇØ¾ß ÇÕ´Ï´Ù ('#crypt'·Î ½ÃÀÛÇÏ´Â ¶óÀÎ ¾ÕÀÇ '#' Ç¥½ÄÀ» Áö¿ì¼¼¿ä). ±×¸®°í À籸ÃàÇϼ¼¿ä. ¶ÇÇÑ °°Àº ¶óÀο¡ ¹®ÀÚ¿ '-lcrypt'¸¦ Ãß°¡ÇؾßÇÒ Çʿ䰡 ÀÖÀ»¼öµµ ÀÖ½À´Ï´Ù.
Tkinter ¾îÇø®ÄÉÀ̼ÇÀ» ¾ó¸± ¶§, ±× ¾îÇø®ÄÉÀ̼ÇÀº ÁøÂ¥·Î µ¶-¸³ÀûÀÌ µÇÁö´Â ¾ÊÀ» °ÍÀÔ´Ï´Ù, ±× ¾îÇø®ÄÉÀ̼ÇÀº ¿©ÀüÈ÷ tcl°ú tk ¶óÀ̺귯¸®¸¦ ÇÊ¿ä·Î ÇÕ´Ï´Ù.
ÇϳªÀÇ ÇØ°áÃ¥Àº ±× ¾îÇø®ÄÉÀ̼ÇÀ» tcl¿Í tk ¶óÀ̺귯¸®¿Í ÇÔ²² ´ã°í¼, ȯ°æ º¯¼ö TCL_LIBRARY¿Í TK_LIBRARY¸¦ »ç¿ëÇÏ¿© ½ÇÇà-½Ã°£¿¡ ±×°ÍµéÀ» Áö½ÃÇÏ´Â °ÍÀÔ´Ï´Ù.
ÁøÂ¥·Î µ¶-¸³ÀûÀÎ ¾îÇø®ÄÉÀ̼ÇÀ» ¾òÀ¸·Á¸é, ±× ¶óÀ̺귯¸®¸¦ Çü¼ºÇÏ´Â Tcl ½ºÅ©¸³Æ®°¡ ±× ¾îÇø®ÄÉÀ̼ǿ¡ ¿ª½Ã ÅëÇյǾî¾ßÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ±×·¯ÇÑ °ÍÀ» Áö¿øÇÏ´Â ÇϳªÀÇ µµ±¸´Â SAM (stand-alone modules)Àε¥, Tix ¹èÆ÷º»¿¡ (http://tix.mne.com/) Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. Tix¸¦ SAM »ç¿ë°¡´ÉÀ¸·Î ±¸ÃàÇϽðí, ÆÄÀ̽ãÀÇ Modules/tkappinit.c ¾È¿¡¼ Tclsam_init µîµî¿¡ ´ëÇÑ ÀûÀýÇÑ È£ÃâÀ» ¼öÇàÇϼ¼¿ä, ±×¸®°í libtclsam¿Í libtksam¿¡ ¿¬°áÇϼ¼¿ä (Tix ¶óÀ̺귯¸® ¿ª½Ã Æ÷ÇÔÇØ¾ßÇÒ ¼öµµ ÀÖ½À´Ï´Ù).
Á¤Àû µ¥ÀÌŸ´Â (C++ ȤÀº JavaÀÇ °üÁ¡¿¡¼´Â) ½±½À´Ï´Ù; Á¤Àû ¸Þ½îµå´Â (¶Ç´Ù½Ã C++ ȤÀº Java °üÁ¡À¸·Î º¸¾Æ) Á÷Á¢ÀûÀ¸·Î Áö¿øµÇÁö ¾Ê½À´Ï´Ù.
Á¤Àû µ¥ÀÌŸ (STATIC DATA)
¿¹¸¦ µé¾î,
class C: count = 0 # number of times C.__init__ called
def __init__(self): C.count = C.count + 1
def getcount(self): return C.count # or return self.countc.count´Â ¶ÇÇÑ isinstance(c, C)°¡ º¸À¯ÇÏ´Â ¸ðµç C¿¡ ´ëÇÏ¿© C.count¸¦ ÂüÁ¶ÇÕ´Ï´Ù, c ±× ÀÚü¿¡ ÀÇÇØ¼ µ¤¿© ¾º¿©Áö°Å³ª ȤÀº c.__class__¿¡¼ºÎÅÍ °Å²Ù·Î C±îÁöÀÇ ±âº»-Ŭ·¡½º Ž»ö °æ·Î¿¡ ÀÖ´Â ¾î¶² Ŭ·¡½º¿¡ ÀÇÇÏ¿© µ¤¿©¾º¿©ÁöÁö¸¸ ¾Ê´Â´Ù¸é ¸»ÀÌÁö¿ä.
ÁÖÀÇ: CÀÇ ¸Þ½îµå ¾È¿¡¼ ´ÙÀ½¶óÀÎÀº,
self.count = 42¿¬°ü¼º¾ø´Â »õ·Î¿î "count"¶ó´Â À̸§ÀÇ ½Çü º¯¼ö¸¦ selfÀÇ »çÀü¾È¿¡ »ý¼ºÇÕ´Ï´Ù. ±×·¡¼ Ŭ·¡½º-Á¤Àû µ¥ÀÌŸ À̸§À» ´Ù½Ã ¿«À¸·Á¸é ´ÙÀ½ÀÇ ÇüŰ¡
C.count = 314¸Þ½îµå ¾ÈÀÌµç ¹ÛÀ̵ç ÇÊ¿äÇÕ´Ï´Ù.
Á¤Àû ¸Þ½îµå(STATIC METHODS)
Á¤Àû ¸Þ½îµå´Â (Á¤Àû µ¥ÀÌŸ¿Í ´ëÁ¶ÇÏ¿©) ÆÄÀ̽㿡¼ ÀÚ¿¬½º·´Áö ¸øÇÕ´Ï´Ù, ¿Ö³ÄÇÏ¸é ´ÙÀ½Àº
C.getcount¹¿©ÁöÁö ¾ÊÀº ¸Þ½îµå °´Ã¼¸¦ ¹ÝȯÇϴµ¥, CÀÇ ½Çü°¡ ù ¹øÂ° Àμö·Î Á¦°øµÇÁö ¾Ê°í¼´Â È£ÃâµÉ ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù.
Á¤Àû ¸Þ½îµåÀÇ È¿°ú¸¦ ¾ò±â À§ÇÑ ÀǵµÀûÀÎ ¹æ¹ýÀº ¸ðµâ-¼öÁØÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÔ´Ï´Ù:
def getcount(): return C.count¸¸¾à ¿©·¯ºÐÀÇ Äڵ尡 ¸ðµâ´ç ÇϳªÀÇ Å¬·¡½º¸¦ Á¤ÀÇÇϵµ·Ï ±¸Á¶ÈµÇ¾ú´Ù¸é (ȤÀº ±ä¹ÐÇÏ°Ô ¿¬°üµÈ Ŭ·¡½º °èÃþµµ¶ó¸é), À̰ÍÀº ¿øÇÏ´Â ¹ÙÀÇ Ä¸½¶È¸¦ Á¦°øÇÕ´Ï´Ù.
µ¥ÀÚ´º½º¸¦ Ž»öÇØº¸¸é Á¤Àû ¸Þ½îµå¸¦ ¸¸µé¾î º¸±â À§ÇÑ ¸Ó¸®½Î¸Å´Â Àü·«µéÀ» ¸¹ÀÌ º¼ ¼ö ÀÖ½À´Ï´Ù. ´ëºÎºÐÀÇ »ç¶÷µéÀº ±×·¯ÇÑ Ä¡·á¾àÀÌ ±× º´º¸´Ùµµ ´õ ³ª»Ú´Ù°í ´À³§´Ï´Ù. ¾Æ¸¶µµ Á¦ÀÏ ¾àÇÑ µ¶¼ºÀ̶ó¸é ÆäÄ« Æä½Ã(Pekka Pessi) (mailto:ppessi@hut.fi)¿¡°Ô µ¹¸®°Ú½À´Ï´Ù:
# helper class to disguise function objects class _static: def __init__(self, f): self.__call__ = f
class C: count = 0
def __init__(self): C.count = C.count + 1
def getcount(): return C.count getcount = _static(getcount)
def sum(x, y): return x + y sum = _static(sum)
C(); C() c = C() print C.getcount() # prints 3 print c.getcount() # prints 3 print C.sum(27, 15) # prints 42
__import__('x.y.z').y.z´õ Çö½ÇÀûÀÎ »óȲ¿¡ ´ëÇØ¼´Â, ´ÙÀ½°ú °°ÀÌ ÇØ¾ßÇÒ Áöµµ ¸ð¸£°Ú½À´Ï´Ù
m = __import__(s) for i in string.split(s, ".")[1:]: m = getattr(m, i)
¸¸¾à ´ÙÀ½°ú °°Àº °£´ÜÇÑ Å×½ºÆ® ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸½Ã¸é:
import thread def run(name, n): for i in range(n): print name, i for i in range(10): thread.start_new(run, (i, 100))¾î¶² ¾²·¹µåµµ ½ÇÇàµÇÁö ¾Ê´Â µíÀÌ º¸ÀÔ´Ï´Ù! ±× ÀÌÀ¯´Â ÁÖ ¾²·¹µå°¡ Á¾·áÇÏÀÚ ¸¶ÀÚ, ¸ðµç ¾²·¹µå°¡ »ç¸ÁÇϱ⠶§¹®ÀÔ´Ï´Ù.
°£´ÜÇÑ ÇØ°áÃ¥Àº ±× ÇÁ·Î±×·¥ÀÇ ¸¶Áö¸·¿¡ sleepÀ» Ãß°¡ÇÏ´Â °ÍÀε¥, ¸ðµç ¾²·¹µå°¡ ³¡³ª±â À§Çؼ ÃæºÐÈ÷ ±ä ½Ã°£À» ÁÖ´Â °ÍÀÔ´Ï´Ù:
import thread, time def run(name, n): for i in range(n): print name, i for i in range(10): thread.start_new(run, (i, 100)) time.sleep(10) # <----------------------------!±×·¯³ª ÀÌÁ¦ (¸¹Àº Ç÷§Æû¿¡¼) ±× ¾²·¹µåµéÀº º´·ÄÀûÀ¸·Î ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù, ±×·¯³ª Çѹø¿¡ Çϳª¾¿, ¿¬¼ÓÀûÀ¸·Î ½ÇÇàµÇ´Â µíÀÌ º¸ÀÔ´Ï´Ù! ±× ÀÌÀ¯´Â OSÀÇ ¾²·¹µå ½ºÄÉÁì·¯°¡ ÀÌ ÀüÀÇ ¾²·¹µå°¡ Á¤Áö´çÇÒ ¶§±îÁö´Â »õ·Î¿î ¾²·¹µå¸¦ ½ÃÀÛ½ÃŰÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù.
°£´ÜÇÑ ÇØ°áÃ¥Àº ÀÛÀº sleepÀ» ±× ½ÇÇà ÇÔ¼öÀÇ ½ÃÀۺο¡ Ãß°¡ÇÏ´Â °ÍÀÔ´Ï´Ù:
import thread, time def run(name, n): time.sleep(0.001) # <---------------------! for i in range(n): print name, i for i in range(10): thread.start_new(run, (i, 100)) time.sleep(10)´õ ÈùÆ®¸¦ µéÀÚ¸é:
time.sleep() È£ÃâÀ» ¸¶Áö¸·¿¡ »ç¿ëÇÏ´Â ´ë½Å¿¡, ¼¼¸¶Æ÷¾î ¸ÞÄ«´ÏÁò·ùÀÇ °ÍÀ» »ç¿ëÇÏ´Â °ÍÀÌ ´õ ÁÁ½À´Ï´Ù. ÇϳªÀÇ ¾ÆÀ̵ð¾î´Â Queue ¸ðµâÀ» »ç¿ëÇÏ¿© queue °´Ã¼¸¦ »ý¼ºÇϰí, °¢ ¾²·¹µå°¡ Á¾·áÇÒ ¶§ ±× Å¥¿¡ ÅäÅ«À» Ãß°¡Çϵµ·Ï Çϸç, ÁÖ ¾²·¹µå°¡ ¾²·¹µå ¼ö¸¸ÅÀÇ ÅäÅ«À» ±× Å¥·ÎºÎÅÍ Àеµ·Ï ÇÏ´Â °ÍÀÔ´Ï´Ù.
¾²·¹µå ¸ðµâ ´ë½Å¿¡ ±× ¾²·¹µù ¸ðµâÀ» »ç¿ëÇϼ¼¿ä. ±×°ÍÀº ÆÄÀ̽㠹öÀü 1.5.1ÀÌÈÄ¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ±×°ÍÀº ÀÌ·¯ÇÑ ÀÚÁú±¸·¹ÇÑ ¸ðµç °ÍµéÀ» ó¸®ÇØ ÁÖ¸ç, ´Ù¸¥ ¸¹Àº ¸ÚÁø »ç¾çµé ¿ª½Ã °¡Áö°í ÀÖ½À´Ï´Ù!
ÆÄÀ̽㿡¼´Â ´ëºÎºÐÀÇ ÆÄÀÏ °´Ã¼ f¸¦ À§Çؼ ³»Àå ÇÔ¼ö "open"À» ÅëÇÏ¿© ÀÛ¼ºÇϴµ¥, f.close()´Â ÆÄÀ̽ãÀÇ °üÁ¡¿¡¼ º¸¸é ±× ÆÄÀÏ °´Ã¼¿¡ ´ÝÇôÁø °ÍÀ¸·Î Ç¥½ÄÀ» ³²±â¸ç, ¶ÇÇÑ ±âÀú¿¡ ÀÖ´Â C ½ºÆ®¸²À» ´Ýµµ·Ï Á¶Ä¡ÇÕ´Ï´Ù. f°¡ ¾²·¹±â°¡ µÇ¸é, fÀÇ ¼Ò¸êÀÚ ¾È¿¡¼ ÀÌ°Í ¿ª½Ã ÀÚµ¿ÀûÀ¸·Î ÀϾ´Ï´Ù.
±×·¯³ª stdin, stdout ±×¸®°í stderr´Â ÆÄÀ̽㿡¼ Ưº°ÇÏ°Ô Ãë±ÞµÇ´Âµ¥, C ¿¡ ÀÇÇØ¼µµ Ưº°ÇÑ ÁöÀ§°¡ ÁÖ¾îÁö±â ¶§¹®ÀÔ´Ï´Ù: ´ÙÀ½°ú °°ÀÌ Çϸé
sys.stdout.close() # ditto for stdin and stderrÆÄÀ̽ã-¼öÁØÀÇ ÆÄÀÏ °´Ã¼¸¦ ´ÝÇôÁø °ÍÀ¸·Î Ç¥½ÄÀ» ³²±é´Ï´Ù, ±×·¯³ª (¸¸¾à sys.stdoutÀÌ ¿©ÀüÈ÷ ±×ÀÇ ±âº» °ª¿¡ ¿«¿© ÀÖ´Ù¸é, ±×°Í ¿ª½Ã C°¡ "stdout"À̶ó°í ºÎ¸£´Â ½ºÆ®¸²ÀÔ´Ï´Ù) ±×¿Í °ü·ÃµÈ C ½ºÆ®¸²À» ´ÝÁö ¾Ê½À´Ï´Ù.
ÀÌ·¯ÇÑ ¼¼°³Áß Çϳª¸¦ À§ÇÑ ±âÀúÀÇ C ½ºÆ®¸²À» ´ÝÀ¸·Á¸é, ±×°ÍÀÌ ÁøÂ¥ ¿øÇÏ´Â °ÍÀÎÁö¸¦ ¸ÕÀú È®ÀÎÇØ¾ß ÇÕ´Ï´Ù (¿¹¸¦ µé¾î, ¿©·¯ºÐÀº ÀÔÃâ·ÂÀ» ½ÃµµÇÏ´Â È®Àå ¸ðµâ°ú ±× Á¶ÀÛÀ» È¥µ¿ÇÒ ¼öµµ ÀÖ½À´Ï´Ù). ¸¸¾à ±×·¸´Ù¸é, os.close¸¦ »ç¿ëÇϼ¼¿ä:
os.close(0) # close C's stdin stream os.close(1) # close C's stdout stream os.close(2) # close C's stderr stream
Àü¿ª ÀÎÅÍÇÁ¸®ÅÍ Àá±ÝÀº ÇÑ ¹ø¿¡ ¿ÀÁ÷ ÇÑ °³ÀÇ ¾²·¹µå°¡ ÆÄÀ̽㠰¡»ó±â°è¿¡¼ ½ÇÇàµÇ´Â°¡¸¦ ³»ºÎÀûÀ¸·ÎÈ®ÀÎÇϱâ À§ÇØ »ç¿ëµË´Ï´Ù. ÀϹÝÀûÀ¸·Î, ÆÄÀ̽ãÀº ¿ÀÁ÷ ¹ÙÀÌÆ®ÄÚµå Áö½Ã¾î »çÀÌ¿¡¼¸¸ ¾²·¹µå°£ ÀüȯÀ» Á¦°øÇÕ´Ï´Ù (¾ó¸¶³ª ÀÚÁÖ ÀüȯÀ» Á¦°øÇÏ´À³Ä´Â sys.setcheckinterval¸¦ ÅëÇÏ¿© ¼³Á¤µÉ ¼ö ÀÖ½À´Ï´Ù). °¢ ¹ÙÀÌÆ®ÄÚµå Áö½Ã¾î´Â -- ±×¸®°í ±×°ÍÀ¸·ÎºÎÅÍ µµ´ÞµÇ´Â ¸ðµç C ±¸Çö ÄÚµå´Â -- ±×·¯¹Ç·Î ¿øÀÚÀûÀÔ´Ï´Ù.
ÀÌ·ÐÀûÀ¸·Î, À̰ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â, Á¤È®ÇÑ °è»êÀ» À§Çؼ´Â PVM ¹ÙÀÌÆ® ÄÚµå ±¸Çö¿¡ ´ëÇÑ Á¤È®ÇÑ ÀÌÇØ¸¦ ¿ä±¸ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ½ÇÁ¦ÀûÀ¸·Î, À̰ÍÀÌ ÀǹÌÇÏ´Â ¹Ù´Â, "¿øÀÚÀûÀ¸·Î º¸ÀÌ´Â" ³»Àå µ¥ÀÌŸ(Á¤¼ö, ¸®½ºÆ®, »çÀü, µîµî) ÇüÀÎ °øÀ¯ º¯¼öµé¿¡ ´ëÇÑ Ã³¸®°¡ ÁøÂ¥·Î ¿øÀÚÀûÀ̶ó´Â °ÍÀÔ´Ï´Ù.
¿¹¸¦ µé¾î, ÀÌ·¯ÇÑ °ÍµéÀº ¿øÀÚÀûÀÔ´Ï´Ù (L, L1, L2Àº ¸®½ºÆ®À̸ç , D, D1, D2´Â »çÀü, x, y´Â °´Ã¼À̰í, i, j ´Â Á¤¼öÀÔ´Ï´Ù):
L.append(x) L1.extend(L2) x = L[i] x = L.pop() L1[i:j] = L2 L.sort() x = y x.field = y D[x] = y D1.update(D2) D.keys()ÀÌ·¯ÇÑ °ÍµéÀº ¿øÀÚÀûÀÌÁö ¾Ê½À´Ï´Ù:
i = i+1 L.append(L[-1]) L[i] = L[j] D[x] = D[x] + 1ÁÖÀÇ: ´Ù¸¥ °´Ã¼µéÀ» ´ëüÇÏ´Â ¿¬»êÀº ÂüÁ¶È½¼ö°¡ 0 ¿¡ µµ´Þ ÇÒ ¶§ ´Ù¸¥ °´Ã¼µéÀÇ __del__ ¸Þ½îµå¸¦ È£ÃâÇÒ °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù, ±×¸®°í ±×°ÍÀº ´Ù¸¥ °Íµé¿¡ ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ƯÈ÷ »çÀü°ú ¸®½ºÆ®¿¡ ´ëÇÑ ´ë·®ÀÇ °»½Å¿¡µµ Àû¿ëµË´Ï´Ù. Àǽɽº·¯¿ï ¶§´Â, mutex¸¦ »ç¿ëÇϼ¼¿ä!
>>> s = "Hello, world" >>> a = list(s) >>> print a ['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd'] >>> a[7:] = list("there!") >>> import string >>> print string.join(a, '') 'Hello, there!'
>>> import array >>> a = array.array('c', s) >>> print a array('c', 'Hello, world') >>> a[0] = 'y' ; print a array('c', 'yello world') >>> a.tostring() 'yello, world'
°Ç³× ÁÙ¼ö ÀÖ³ª¿ä?A: 'apply'¸¦ »ç¿ëÇϼ¼¿ä, ´ÙÀ½°ú °°ÀÌ:
def f1(a, *b, **c): ...
def f2(x, *y, **z): ... z['width']='14.3c' ... apply(f1, (x,)+y, z)
¸¸¾à Ãâ·Â°¡´É ¹öÀüÀ» ÆÄÀÏ¿¡ ÀúÀåÇϰí, ¾à°£ÀÇ º¯°æÀ» ÇÏ°í ³ª¼ ±×°ÍÀ» ´Ù¸¥ ¾î¶² Ãâ·ÂµÈ »çÀü°ú ºñ±³ÇØ º¸±â¸¦ ¿øÇÑ´Ù¸é À̰ÍÀº °í¹Î½º·¯¿ï ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ±×·¯ÇÑ Çʿ伺ÀÌ ÀÖ´Ù¸é UserDict.UserDict¸¦ ÇϺÎŬ·¡½ºÈÇÏ¿© ¿¹»ó°¡´ÉÇÑ ¼ø¼·Î ÀÚ½ÅÀ» Ãâ·ÂÇÏ´Â SortedDict Ŭ·¡½º¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ¿©±â¿¡ ±×·¯ÇÑ Å¬·¡½º¸¦ °£°áÇÏ°Ô ±¸ÇöÇÑ Å¬·¡½º°¡ ÀÖ½À´Ï´Ù:
import UserDict, string
class SortedDict(UserDict.UserDict): def __repr__(self): result = [] append = result.append keys = self.data.keys() keys.sort() for k in keys: append("%s: %s" % (`k`, `self.data[k]`)) return "{%s}" % string.join(result, ", ")
___str__ = __repr__
ºñ·Ï ¿Ïº®ÇÑ ÇØ°áÃ¥Àº ¾Æ´ÏÁö¸¸, À̰ÍÀº ¸¶ÁÖÄ¥ ¼ö ÀÖ´Â ÀϹÝÀûÀÎ ¸¹Àº »óȲ¿¡ Àß ÀÛµ¿ÇÒ °ÍÀÔ´Ï´Ù. (±×°ÍÀº pprint ¸ðµâ¿¡ ¾î¶°ÇÑ ¿µÇâµµ ¹ÌÄ¡Áö ¾ÊÀ» °ÍÀÔ´Ï´Ù ±×¸®°í »çÀüÀ̵簡 ȤÀº »çÀüÀ» Æ÷ÇÔÇÑ °ªµéÀ» Åõ¸íÇÏ°Ô Ã³¸®ÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù).
Çϳª´Â freeze µµ±¸¸¦ »ç¿ëÇÏ´Â °ÍÀε¥, ÆÄÀ̽㠼ҽº Æ®¸®¿¡ Tools/freeze·Î Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ±×°ÍÀº ÆÄÀ̽㠹ÙÀÌÆ® ÄÚµå C ¹è¿·Î º¯È¯ÇÕ´Ï´Ù. C ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇØ¼, ¿©·¯ºÐÀÇ ¸ðµç ¸ðµâÀ» »õ·Î¿î ÇÁ·Î±×·¥À¸·Î ³»ÀåÇÒ ¼ö ÀÖ½À´Ï´Ù, ±×·¯¸é Ç¥ÁØ ÆÄÀ̽㠸ðµâ°ú ¿¬°áµË´Ï´Ù.
À©µµ¿ì¿¡¼, ¶Ç´Ù¸¥ ÇØ°áÃ¥ÀÌ Á¸ÀçÇϴµ¥ C ÄÄÆÄÀÏ·¯¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê½À´Ï´Ù. Å©¸®½ºÃ® µð½º¸Ó(Christian Tismer)ÀÇ SQFREEZE (http://starship.python.net/crew/pirx/)´Â ±× ¹ÙÀÌÆ® Äڵ带 Ưº°ÇϰÔ-ÁغñµÈ ÆÄÀ̽ã ÀÎÅÍÇÁ¸®ÅÍ¿¡ Ãß°¡ÇÕ´Ï´Ù, ±× ÀÎÅÍÇÁ¸®ÅÍ´Â ±× ¹ÙÀÌÆ® Äڵ带 ½ÇÇàÇüÀ¸·Î ÀÌÇØÇÒ °ÍÀÔ´Ï´Ù.
°íµç ¸Æ¹Ð¶õ(Gordon McMillian)ÀÌ Á¦°øÇÏ´Â ¼³Ä¡±â´Â (http://starship.python.net/crew/gmcm/distribute.html) ¼¼¹øÂ° ´ë¾ÈÀ¸·Î¼, SQFREEZE¿Í À¯»çÇÏ°Ô ÀÛµ¿ÇÏÁö¸¸, ÀÓÀÇÀûÀÎ Ãß°¡ ÆÄÀϵµ ±× µ¶¸³ ÀÌÁø ÆÄÀÏ¿¡ Æ÷ÇÔÇϵµ·Ï Çã¿ëÇÕ´Ï´Ù.
import termios, TERMIOS, fcntl, FCNTL, sys, os fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd) newattr = termios.tcgetattr(fd) newattr[3] = newattr[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO termios.tcsetattr(fd, TERMIOS.TCSANOW, newattr)
oldflags = fcntl.fcntl(fd,FCNTL.F_GETFL) fcntl.fcntl(fd,FCNTL.F_SETFL,oldflags|FCNTL.O_NONBLOCK)
try: while 1: try: c = sys.stdin.read(1) print "Got character", `c` except IOError: pass # Ignore IOError from empty buff finally: termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, oldterm) fcntl.fcntl(fd,FCNTL.F_SETFL,oldflags)À̰ÍÀÌ ÀÛµ¿ÇÏ·Á¸é termios¿Í fcntl ¸ðµâÀÌ ÇÊ¿äÇÕ´Ï´Ù, ¸®´ª½º¿¡¼¸¸ ½ÃµµÇØ º¸¾ÒÁö¸¸, ´Ù¸¥ °÷¿¡¼µµ ÀÛµ¿Çϸ®¶ó º¾´Ï´Ù.
ÀÌ Äڵ忡¼´Â, ¹®ÀÚµéÀÌ ÇÑ ¹ø¿¡ ÇѰ³¾¿ ÀÐÇôÁö°í Ãâ·ÂµË´Ï´Ù.
termios.tcsetattr()Àº stdinÀÇ ¹ÝÇâÀ» ²ô°í Ç¥ÁØ(canonical) ¸ðµå¸¦ »ç¿ëºÒ´ÉÀ¸·Î ¸¸µì´Ï´Ù. fcntl.fnctl() stdinÀÇ ÆÄÀÏ ±â¼úÀÚ ±ê¹ßÀ» ȹµæÇÏ°í ±×°ÍµéÀ» ºñ-ºí·ÎÅ·(non-blocking) ¸ðµå·Î º¯°æÇϴµ¥ »ç¿ëµË´Ï´Ù. ºñ¾îÀÖÀ» ¶§ stdinÀ» Àд °ÍÀº IOError¸¦ ÀÏÀ¸Å°¹Ç·Î, ÀÌ ¿¡·¯´Â ³ªÆ÷µÇ°í ¹«½ÃµË´Ï´Ù.
-----------------------------------------------------------------------
rstrip()Àº ³Ê¹« ¿å½ÉÀÌ ¸¹¾Æ¼, ¸ðµç À̲ø¸®´Â °ø¹éµéÀ» Á¦°ÅÇÕ´Ï´Ù. splitlines()´Â ControlMÀ» ¶óÀÎ °æ°è°ªÀ¸·Î ÃëÇÕ´Ï´Ù. ÀÌ ¹®ÀÚ¿µéÀ» ÀÔ·ÂÀ̶ó°í °£ÁÖÇØ º¸¸é: "python python \r\n" "python\rpython\r\n" "python python \r\r\r\n" rstrip()/splitlines()À¸·ÎºÎÅÍ µ¹¾Æ¿Â °á°ú´Â ¾Æ¸¶µµ ¿ì¸®°¡ ¿øÇÑ °ÍÀÌ ¾Æ´Ò °ÍÀÔ´Ï´Ù.
º¸±â¿¡´Â re°¡ ÀÌ ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ´Â °Í °°½À´Ï´Ù.
#!/usr/bin/python # requires python2
import re, os, StringIO
lines=StringIO.StringIO( "The Python Programming Language\r\n" "The Python Programming Language \r \r \r\r\n" "The\rProgramming\rLanguage\r\n" "The\rProgramming\rLanguage\r\r\r\r\n" "The\r\rProgramming\r\rLanguage\r\r\r\r\n" )
ln=re.compile("(?:[\r]?\n|\r)$") # dos:\r\n, unix:\n, mac:\r, others : unknown # os.linesep does not work if someone ftps(in binary mode) a dos/mac text file # to your unix box #ln=re.compile(os.linesep + "$")
while 1: s=lines.readline() if not s: break print "1.(%s)" % `s.rstrip()` print "2.(%s)" % `ln.sub( "", s, 1)` print "3.(%s)" % `s.splitlines()[0]` print "4.(%s)" % `s.splitlines()` print
lines.close()
", ".join([1, 2, 4, 8, 16])À̰ÍÀº ´ÙÀ½ÀÇ °á°ú¸¦ »êÃâÇÕ´Ï´Ù
"1, 2, 4, 8, 16"ÀÌ·¯ÇÑ »ç¿ë¹ý¿¡ ´ëÇØ¼´Â µÎ °³ÀÇ ÀϹÝÀûÀÎ ¹Ý·ÐÀÌ ÀÖ½À´Ï´Ù.
±× ù ¹øÂ°´Â ´ÙÀ½ ¶óÀο¡ ÀÐÇôÁö´Â ´ë·Î ÀÔ´Ï´Ù: "¹®ÀÚ¿ ±âÈ£ (¹®ÀÚ¿ »ó¼ö)ÀÇ ¸Þ½îµå¸¦ »ç¿ëÇÏ´Â °ÍÀº Á¤¸» º¸±â¿¡ ÈäÇÏ´Ù", À̰Ϳ¡ ´ëÇÑ ´ë´äÀº ´ÙÀ½°ú °°½À´Ï´Ù. ±×·² ¼öµµ ÀÖÁö¸¸, ¹®ÀÚ¿ ±âÈ£´Â ´ÜÁö °íÁ¤µÈ °ªÀÔ´Ï´Ù. ¸¸¾à ±× ¸Þ½îµåµéÀÌ ¹®ÀÚ¿¿¡ ¿«¿©Áø À̸§µé¿¡ Çã¿ëµÈ´Ù¸é ±âÈ£»óÀ¸·Î ºÒ°¡´ÉÇÏ°Ô ÇØ¾ß ÇÒ ³í¸®ÀûÀÎ ÀÌÀ¯°¡ ¾ø½À´Ï´Ù. ³Ñ¾î¾ßÇÒ »êÀÔ´Ï´Ù!
µÎ ¹øÂ° ¹Ý´ë´Â ÀüÇüÀûÀ¸·Î ´ÙÀ½°ú °°ÀÌ ´øÁ®Áý´Ï´Ù: "³ª´Â ¿¬¼Ó¿ÀÌ ±×ÀÇ ±¸¼º¿øµéÀ» ¹®ÀÚ¿ »ó¼ö¿Í ÇÔ²² °áÇÕÇϱ⸦ ÁøÁ¤À¸·Î ¹Ù¶õ´Ù." ½½ÇÁ°Ôµµ, ±×·² ¼ö ¾ø½À´Ï´Ù. ¾î¶² ÀÌÀ¯ ¶§¹®¿¡ split()À» ¹®ÀÚ¿ ¸Þ½îµå·Î °£ÁÖÇϴµ¥¿¡´Â Å« ¾î·Á¿òÀÌ ¾ø¾î º¸ÀÔ´Ï´Ù, ¿Ö³ÄÇϸé ÀÌ °æ¿ì¿¡ ´ÙÀ½Àº
"1, 2, 4, 8, 16".split(", ")ÁÖ¾îÁø ±¸ºÐÀÚ¿¡ ÀÇÇØ¼ ±¸ºÐµÈ ÇϺι®ÀÚ¿À» ¹®ÀÚ¿ ±âÈ£¿¡°Ô ¹ÝȯÇ϶ó´Â Áö½Ã¶ó°í ÀÌÇØÇÏ´Â °ÍÀÌ ½±½À´Ï´Ù (ȤÀº, ±âº»°ªÀ¸·Î, ÀÓÀÇÀÇ ¼öÇàÀº °ø¹é). ÀÌ °æ¿ì¿¡ À¯´ÏÄÚµå ¹®ÀÚ¿Àº À¯´ÏÄÚµå ¹®ÀÚ¿À» ´ãÀº ¸®½ºÆ®¸¦ ¹ÝȯÇϰí, ¾Æ½ºÅ° ¹®ÀÚ¿À» ¾Æ½ºÅ° ¹®ÀÚ¿À» ´ãÀº ¸®½ºÆ®¸¦ ¹ÝȯÇÏ°í ±×¸®°í ¸ðµç »ç¶÷Àº ÇູÇÕ´Ï´Ù.
join()Àº ¹®ÀÚ¿ ¸Þ½îµåÀÔ´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×°ÍÀ» »ç¿ëÇϰí ÀÖ´Â µ¿¾È¿¡ ÀÓÀÇÀÇ ¿¬¼Ó¿¿¡ ´ëÇÏ¿© ±× ±¸ºÐ ¹®ÀÚ¿ÀÌ ¹Ýº¹µÇµµ·Ï Áö½ÃÇϰí, °¢ ¿ä¼ÒÀÇ ¹®ÀÚ¿ Ç¥ÇöÀ» Çü¼ºÇϸç, ±×¸®°í ÀÚ½ÅÀ» ±× ¿ä¼ÒµéÀÇ Ç¥Çö »çÀÌ¿¡ »ðÀÔÇϰí Àֱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ ¸Þ½îµå´Â ¿¬¼Ó¿ °´Ã¼¸¦ À§ÇÑ ±ÔÄ¢À» ÁؼöÇÏ´Â ¸ðµç Àμö¿Í ÇÔ²² »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù, ¿©±â¿¡´Â ½º½º·Î Á¤ÀÇÇÑ »õ·Î¿î Ŭ·¡½º¸¦ Æ÷ÇԵ˴ϴÙ.
À̰ÍÀº ¹®ÀÚ¿ ¸Þ½îµåÀ̹ǷΠÀ¯´ÏÄÚµå ¹®ÀÚ¿ »Ó¸¸ ¾Æ´Ï¶ó Æò¹® ¾Æ½ºÅ° ¹®ÀÚ¿¿¡µµ ÀÛµ¿ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à join()ÀÌ ±× ¿¬¼Ó¿ ÇüÀÇ ¸Þ½îµå¶ó¸é ±× ¿¬¼Ó¿ ÇüÀº ±¸ºÐÀÚÀÇ Çü¿¡ µû¶ó¼ ¾î¶² ÇüÀÇ ¹®ÀÚ¿À» ¹ÝÈ¯ÇØ¾ß ÇÒÁö¸¦ °áÁ¤Çؾ߸¸ ÇÒ °ÍÀÔ´Ï´Ù.
ÀÌ·¯ÇÑ ÁÖÀåµé¿¡ ´ëÇÏ¿© ¸¸Á·ÇÏÁö ¸øÇϸé, ÇöÀç·Î´Â °è¼ÓÇÏ¿© string ¸ðµâ¿¡ ÀÖ´Â join() ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù, À̰ÍÀ¸·Î ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù
string.join([1, 2, 4, 8, 16], ", ")¸ðµâÀº ½ÇÁ¦·Î ºÒÆòÇϰí ÀÖ´Â ±× ±¸¹®À» »ç¿ëÇØ¼ ¼±È£ÇÏ´Â ±¸¹®À» ±¸ÇöÇÑ´Ù´Â °ÍÀ» Àؾî¹ö¸®·Á°í ³ë·ÂÇØ¾ß ÇÒ °ÍÀÔ´Ï´Ù!
class A: pass
B = A
a = B() b = a print b <__main__.A instance at 016D07CC> print a <__main__.A instance at 016D07CC>
ÀǵµÀûÀ¸·Î ÀÌ Å¬·¡½º´Â À̸§À» °¡Áý´Ï´Ù: µÎ °³ÀÇ À̸§¿¡ ¿«¿©Á® ÀÖ°í À̸§ B ¸¦ ÅëÇÏ¿© È£ÃâµÊ¿¡µµ ºÒ±¸Çϰí, »ý¼ºµÈ ½Çü´Â ¿©ÀüÈ÷ Ŭ·¡½º AÀÇ ½Çü·Î º¸°í µÇ°í ÀÖ½À´Ï´Ù. ±×·¸Áö¸¸, ±× ½ÇüÀÇ À̸§ÀÌ a ÀÎÁö b ÀÎÁö´Â ¸»ÇÒ ¼ö Àִµ¥, µÎ À̸§ ¸ðµÎ °°Àº °ª¿¡ ¿«¿© Àֱ⠶§¹®ÀÔ´Ï´Ù.
ÀϹÝÀûÀ¸·Î À̾߱â ÇØ¼ ¿©·¯ºÐÀÇ Äڵ尡 ƯÁ¤ÇÑ °ªÀÇ "À̸§À» ¾Ë¾Æ¾ß ÇÒ" ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ÀǵµÀûÀ¸·Î ³»ºÎ¸¦ µé¿©´Ù º¸´Â ÇÁ·Î±×·¥À» ¸¸µé°í ÀÖÁö ¾Ê´Ù¸é, À̰ÍÀº º¸Åë Á¢±Ù¹ýÀ» ¹Ù²Ù¾î º¸´Â °ÍÀÌ À¯ÀÍÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³» ÁÖ°í ÀÖ½À´Ï´Ù.
http://python.sourceforge.net/devel-docs/tut/node14.html]
»ç¶÷µéÀº °¡²û ´ÙÀ½°ú °°Àº °á°ú¿¡ ¸Å¿ì ³î¶ø´Ï´Ù:
>>> 1.2-1.0 0.199999999999999996±×¸®°í ÆÄÀ̽ãÀÇ ¹ö±×¶ó°í »ý°¢ÇÕ´Ï´Ù. ±×·¸Áö ¾Ê½À´Ï´Ù. ±×°ÍÀº ºÎµ¿ ¼Ò¼öÁ¡¼öÀÇ ³»ºÎ Ç¥Çö ¶§¹®¿¡ ¾ß±âµÈ ¹®Á¦ÀÔ´Ï´Ù. ºÎµ¿ ¼Ò¼öÁ¡¼ö´Â °íÁ¤µÈ °³¼öÀÇ ÀÌÁø ÀÚ¸®¼ö·Î ÀúÀåµË´Ï´Ù.
10Áø¼ö¿¡¼´Â, °íÁ¤µÈ °³¼öÀÇ ½ÊÁø ÀÚ¸®¼ö·Î Ç¥ÇöµÉ ¼ö ¾ø´Â ¼ýÀÚµéÀÌ ¸¹½À´Ï´Ù, Áï, 1/3 = 0.3333333333.......
ÀÌÁø ¼öÀÇ °æ¿ì¿¡´Â, 1/2 = 0.1, 1/4 = 0.01, 1/8 = 0.001, µîµî Ç¥ÇöµÉ ¼ö ¾ø´Â ¼ýÀÚµéÀÌ ¸¹½À´Ï´Ù. Áö¸®¼ö´Â ¾î¶² Á¡¿¡¼ Àý´ÜµË´Ï´Ù.
ÆÄÀ̽ã 1.6 ÀÌÈÄ·Î, ºÎµ¿ ¼Ò¼öÁ¡ÀÇ repr() ÇÔ¼ö´Â ÀÓÀÇÀÇ ½Ç¼ö f¿¡ ´ëÇÏ¿© eval(repr(f)) == f¸¦ ÂüÀ¸·Î ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ¸¸ÅÀÇ ÀÚ¸®¼ö¸¦ Ãâ·ÂÇÕ´Ï´Ù. str() ÇÔ¼ö´Â ¾Æ¸¶µµ ¿øÇѹÙÀÇ ´õ¿í ÀÇ¹Ì ÀÖ´Â ¼ýÀÚ¸¦ Ãâ·ÂÇÕ´Ï´Ù:
>>> 0.2 0.20000000000000001 >>> print 0.2 0.2¶Ç ´Ù½Ã, À̰ÍÀº ÆÄÀ̽ã°ú °ü·ÃÀÌ ¾ø½À´Ï´Ù, ±×·¯³ª C Ç÷§ÆûÀÌ ±âÀú¿¡¼ ºÎµ¿¼Ò¼öÁ¡¼ö¸¦ ´Ù·ç´Â ¹æ½Ä°ú °ü·ÃÀÌ ÀÖÀ¸¸ç, ±Ã±ØÀûÀ¸·Î´Â °íÁ¤µÈ °³¼öÀÇ ¼öÄ¡ ¹®ÀÚ¿À» ½á³¾ ¶§ Ç×»ó °¡Áö°Ô µÇ´Â ºÎÁ¤È®¼º°ú °ü·ÃÀÌ ÀÖ½À´Ï´Ù.
ÀÌ °á°úÁßÀÇ Çϳª´Â °è»êÀÇ °á°ú¸¦ ==À¸·Î ½Ç¼öÇü°ú ºñ±³ÇÏ´Â °ÍÀº À§ÇèÇÏ´Ù´Â °ÍÀÔ´Ï´Ù! ¾à°£¸¸ ºÎÁ¤È®Çصµ == ´Â ½ÇÆÐÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù.
´ë½Å¿¡ ´ÙÀ½°ú °°Àº °ÍÀ» ½ÃµµÇØ º¸¼¼¿ä:
epsilon = 0.0000000000001 # Tiny allowed error expected_result = 0.4
if expected_result-epsilon <= computation() <= expected_result +epsilon: ...
¸¹Àº ¸®´ª½º ½Ã½ºÅÛÀº ÀÌÁ¦ ¼¼°³ÀÇ ¹öŬ¸® DB ¹öÀü ¸ðµÎ À̿밡´ÉÇÕ´Ï´Ù. ¸¸¾à ¹öÀü 1 ¿¡¼ »õ·Î¿î ¹öÀüÀ¸·Î ¿Å±æ »ý°¢À̶ó¸é db_dump185¸¦ »ç¿ëÇÏ¿© ±× µ¥ÀÌŸ º£À̽ºÀÇ Æò¹® ÅØ½ºÆ® ¹öÀüÀ» ´ýÇÁÇϼ¼¿ä. ¸¸¾à ¹öÀü 2 ¿¡¼ ¹öÀü 3À¸·Î À̵¿ÇÒ »ý°¢À̶ó¸é db2_dump¸¦ »ç¿ëÇÏ¿© ±× µ¥ÀÌŸ º£À̽ºÀÇ Æò¹® ÅØ½ºÆ® ¹öÀüÀ» »ý¼ºÇϼ¼¿ä. ¾î´À °æ¿ì¿¡³ª, db_load¸¦ »ç¿ëÇÏ¿© ÄÄÇ»ÅÍ¿¡ ¼³Ä¡µÈ ÃֽйöÀü¿ëÀ¸·Î °íÀ¯ÇÑ µ¥ÀÌŸº£À̽º¸¦ »õ·Ó°Ô »ý¼ºÇϼ¼¿ä. ¸¸¾à ¹öÀü 3 ÀÇ ¹öŬ¸® DB°¡ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é, db2_load¸¦ »ç¿ëÇÏ¿© ¹öÀü 3¿ë °íÀ¯ÇÑ µ¥ÀÌŸº£À̽º¸¦ »ý¼ºÇÏ½Ç ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
ÇØ½¬ ÆÄÀÏ Äڵ尡 µ¥ÀÌŸ¸¦ ¸Á°¡Æ®¸±¼ö ÀÖ´Ù°í ¾Ë·ÁÁø ¹ö±×¸¦ Æ÷ÇÔÇϰí Àֱ⠶§¹®¿¡ ¹öŬ¸® DB ¹öÀü 1 ÆÄÀϷκÎÅÍ À̵¿ÇÏ¼Å¾ß ÇÒ °ÍÀÔ´Ï´Ù.
ÀÌ ´ë´äÀÇ ³ª¸ÓÁö´Â ´ëºÎºÐ °³ÀÎÀû ¼±È£µµÀÇ ¹®Á¦ÀÔ´Ï´Ù, ±×·¯³ª ¿©±â¿¡ ¾î¶² ´º½º±×·ìÀÇ ÇÊÀÚ°¡ ¸»ÇÑ °ÍÀÌ ÀÖ½À´Ï´Ù (ÀÀ´äÇØÁØ ¸ðµç ºÐ¿¡°Ô °¨»çµå¸³´Ï´Ù)
ÀϹÝÀûÀ¸·Î, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏÁö ¸¶¼¼¿ä
from modulename import *±×·¸°Ô ÇÏ¸é ¼öÀÔÀÚÀÇ À̸§°ø°£ÀÌ ¾îÁö·´ÇôÁý´Ï´Ù. ¾î¶² »ç¶÷µéÀº ÀÌ·±¹æ½ÄÀ¸·Î ¼öÀԵǵµ·Ï µðÀÚÀÎµÈ ¸ðµâ¿¡¼ Á¶Â÷ ÀÌ·± °ü¿ë¹ýÀ» ÇÇÇÕ´Ï´Ù. (ÀÌ·± ¹æ½ÄÀ¸·Î µðÀÚÀÎµÈ ¸ðµâ¿¡´Â Tkinter, thread, ±×¸®°í wxPythonÀÌ Æ÷ÇԵ˴ϴÙ.)
ÆÄÀÏÀÇ »ó´Ü¿¡ ¸ðµâµéÀ», ÇÑ ÁÙ¿¡ ÇÑ ¸ðµâ¾¿ ¼öÀÔÇϼ¼¿ä. ±×·¸°Ô Çϸé Äڵ尡 ¾î¶² ¸ðµâÀ» ÇÊ¿ä·Î ÇÏ´ÂÁö ¸íÈ®È÷ ÇÒ ¼ö ÀÖÀ¸¸ç ±× ¸ðµâÀÇ À̸§ÀÌ ¿µ¿ª¾È¿¡ Á¸ÀçÇÏ´ÂÁö ¾î¶²ÁöÀÇ ¹®Á¦¸¦ ÇÇÇÒ ¼ö ÀÖ½À´Ï´Ù.
¸¸¾à ¸¹Àº ¼öÀÔµéÀÌ ÀÖ°í, ±×¸®°í ±× ºñ¿ë ( ¸¹Àº ÃʱâÈ ½Ã°£)À» ÇÇÇϰíÀÚ ÇÑ´Ù¸é. ¼öÀÔµéÀ» (ÇÔ¼ö Á¤ÀÇÀÇ ÃÖ»ó´Ü°ú °°Àº) Áö¿ª ¿µ¿ª ¾ÈÀ¸·Î À̵¿½ÃŰ¼¼¿ä. ÀÌ Å×Å©´ÐÀº ±× ÇÁ·Î±×·¥ÀÌ ¾î¶»°Ô ½ÇÇàµÇ´À³Ä¿¡ µû¶ó¼ ¸¹Àº ¼öÀÔÀÌ ºÒÇÊ¿äÇÒ ¶§ ƯÈ÷ À¯¿ëÇÕ´Ï´Ù. ¸¸¾à ±× ¸ðµâÀÌ ´ÜÁö ±× ÇÔ¼ö¿¡¼¸¸ »ç¿ëµÈ´Ù¸é ¼öÀÔÀ» ÇÔ¼ö ¾ÈÀ¸·Î À̵¿½ÃŰ°í ½ÍÀ» ¼öµµ ÀÖ½À´Ï´Ù. (±× ¸ðµâÀ» ÃʱâÈÇÏ´Â ½Ã°£ ¶§¹®¿¡) óÀ½À¸·Î ¸ðµâÀ» ÀûÀçÇÒ ¶§´Â ºñ½Ñ´ë°¡¸¦ Ä¡¸¦ ¼öµµ ÀÖ½À´Ï´Ù ±×·¯³ª ¸ðµâÀ» ¿©·¯¹ø ÀûÀçÇÏ´Â °ÍÀº ½ÇÁ¦ÀûÀ¸·Î ¹«·áÀÔ´Ï´Ù (¸¹Àº ¼öÀÇ »çÀü ÂüÁ¶). ±× ¸ðµâ À̸§ÀÌ ¿µ¿ª ¹ÛÀ¸·Î ³ª°¬À» Áö¶óµµ, ±× ¸ðµâÀº sys.modules¿¡¼ »ç¿ë°¡´ÉÇÕ´Ï´Ù. ±×¸®ÇÏ¿©, ¸ðµâ ¼öÁØ¿¡ (ÇÊ¿äÇÏÁö ¾Ê´Ù¸é) ¼öÀÔÀ» ¹èÁ¤ÇÏÁö ¾Ê°í ÇÔ¼ö ¼öÁØ¿¡ ¸ðµç ¼öÀÔÀ» ¹èÁ¤Çصµ ½ÇÁ¦ÀûÀ¸·Î ¾Æ¹«·± ¹®Á¦°¡ ¾ø½À´Ï´Ù.
¾î¶² °æ¿ì¿¡´Â ÇʼöÀûÀ¸·Î ¼öÀÔÀ» ÇÔ¼ö ȤÀº Ŭ·¡½º·Î À̵¿½ÃÄѼ ¼øÈ¯ ¼öÀÔÀÇ ¹®Á¦¸¦ ÇÇÇØ¾ß ÇÕ´Ï´Ù. °íµç(Gordon)Àº ´ÙÀ½°ú °°ÀÌ ¸»ÇÕ´Ï´Ù:
¼øÈ¯ ¼öÀÔÀº µÎ ¸ðµâ ¸ðµÎ "import <module>" ÇüÅÂÀÇ ¼öÀÔÀ» »ç¿ëÇÏ´Â °÷¿¡¼ ÈǸ¢ÇÕ´Ï´Ù. ¼øÈ¯¼öÀÔÀº µÎ ¹øÂ° ¸ðµâÀÌ Ã¹ ¹øÂ° ¸ðµâ·ÎºÎÅÍ À̸§À» ¾òÀ¸·Á°í ÇÒ ¶§ ("from module import name") ±×¸®°í ¼öÀÔÀÌ ÃÖ»óÀ§ ¼öÁØ¿¡ ÀÖÀ» ¶§ ½ÇÆÐÇÕ´Ï´Ù. ±×°ÍÀº ù ¹øÂ° ¸ðµâ¿¡ ÀÖ´Â À̸§µéÀÌ ¾ÆÁ÷ »ç¿ë°¡´ÉÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù, (ù ¹øÂ° ¸ðµâÀº µÎ ¹øÂ° ¸ðµâÀ» ¼öÀÔÇÏ´À¶ó ¹Ù»Þ´Ï´Ù).ÀÌ °æ¿ì¿¡, ¸¸¾à µÎ ¹øÂ° ¸ðµâÀÌ ¿ÀÁ÷ ÇϳªÀÇ ÇÔ¼ö¿¡¼¸¸ »ç¿ëµÈ´Ù¸é, ¼öÀÔÀº ½±°Ô ±× ÇÔ¼ö¾ÈÀ¸·Î À̵¿µÉ ¼ö ÀÖ½À´Ï´Ù. ±× ¼öÀÔÀÌ È£ÃâµÉ ¶§ ±îÁö´Â, ù ¹øÂ° ¸ðµâÀº Ãʱâȸ¦ ¿Ï°áÇÒ °ÍÀ̸ç, ±×¸®°í µÎ ¹øÂ° ¸ðµâÀº ¼öÀÔÀ» ÇÒ ¼ö ÀÖ½À´Ï´Ù.
¾î¶² ¸ðµâµéÀÌ Ç÷§Æû-Á¾¼ÓÀûÀ̶ó¸é ÃÖ»óÀ§ ¼öÁØÀÇ ÄÚµå·ÎºÎÅÍ ¼öÀÔÀ» À̵¿½Ãų Çʿ䰡 ÀÖÀ»Áöµµ ¸ð¸¨´Ï´Ù. ±× °æ¿ì¿¡, ±× ÆÄÀÏÀÇ ÃÖ»óÀ§¿¡¼ ¸ðµç ¸ðµâÀ» ¼öÀÔÇÏ´Â °ÍÁ¶Â÷µµ ºÒ°¡´ÉÇÒÁöµµ ¸ð¸¨´Ï´Ù. ÀÌ °æ¿ì¿¡´Â, Á¤È®ÇÑ ¸ðµâÀ» »óÀÀÇÏ´Â Ç÷§Æû-Á¾¼ÓÀû Äڵ忡¼ ¼öÀÔÇÏ´Â °ÍÀÌ ÈǸ¢ÇÑ ¼±ÅÃÀÔ´Ï´Ù.
¸¸¾à ƯÁ¤ Ŭ·¡½ºÀÇ ½Çüµé¸¸ÀÌ ¸ðµâÀ» »ç¿ëÇÑ´Ù¸é, ¸ðµâÀ» ±× Ŭ·¡½ºÀÇ __init__ ¸Þ½îµå¿¡¼ ¼öÀÔÇÏ°í ±× ¸ðµâÀ» ½Çü º¯¼ö¿¡ ÇÒ´çÇÏ¿©¼ ±× °´Ã¼°¡ »ì¾Æ ÀÖ´Â µ¿¾È¿¡ Ç×»ó (±× ½Çü º¯¼ö¸¦ ÅëÇÏ¿©) »ç¿ë°¡´ÉÇϵµ·Ï ÇÏ´Â °ÍÀÌ Çö¸íÇÕ´Ï´Ù. ÁÖ¸ñÇÒ °ÍÀº ±× Ŭ·¡½º°¡ ½ÇÃ¼È µÉ ¶§±îÁö ¼öÀÔÀ» ¿¬±âÇÏ·Á¸é, ±× ¼öÀÔÀº ¹Ýµå½Ã ¸Þ½îµå ¾È¿¡ ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. ¼öÀÔÀ» ±× Ŭ·¡½º ¾ÈÀ̱â´Â ÇÏÁö¸¸ ¸Þ½îµåÀÇ ¹Û¿¡ ¹èÁ¤ÇÏ´Â °ÍÀº ±× ¸ðµâÀÌ ÃʱâÈ µÉ ¶§ ¿©ÀüÈ÷ ±× ¼öÀÔÀÌ ÀϾµµ·Ï ¾ß±âÇÕ´Ï´Ù.
PyChecker´Â ´ÙÀ½¿¡¼ : http://pychecker.sf.net/ ¾òÀ» ¼ö ÀÖ½À´Ï´Ù.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â °¡Àå °£°áÇÑ ¹æ¹ýÀº site.py¸¦ ÆíÁýÇÏ´Â °ÍÀÔ´Ï´Ù. °Å±â, ¸¶Áö¸· ºÎºÐ¿¡¼, ´ÙÀ½°ú °°Àº ¶óÀÎÀ» ¹ß°ßÇÒ °ÍÀÔ´Ï´Ù
encoding = "ascii""ascii"¸¦ ¿©·¯ºÐÀÌ ¿øÇÏ´Â ÄÚµåÀüȯÀ¸·Î º¯°æÇϼ¼¿ä. ÁÖÀDZí°Ô site.py ¸ðµâ¿¡ ÀÖ´Â ´ÙÀ½ÀÇ ¶óÀÎÀ» ÀÐ¾î º¸½Ã¸é, °Å±â¿¡¼ "if 0:"À¸·Î ÁÖ¼®Ã³¸®µÈ ¶óÀεéÀ» ¹ß°ßÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù. ÀÌ ¶óÀÎÀÇ ÁÖ¼®À» Á¦°ÅÇÏ½Ã¸é ÆÄÀ̽ãÀº ÇöÀçÀÇ ·ÎÄÉÀÏ ¼³Á¤°ªÀ» (LC_CTYPE ȯ°æ º¯¼ö, ¶Ç´Â LANG/LC_ALL) »ç¿ëÇÏ¿© ¼±È£ÇÏ´Â ÄÚµå ÀüȯÀ» °áÁ¤ÇÒ °ÍÀÔ´Ï´Ù.
±×¸®°í ¸¶Áö¸·À¸·Î, sitecustomize.py¸¦ ¸¸µé ¼ö Àִµ¥, ¿©·¯ºÐÀÌ ¿øÇÏ´Â ¹æ½ÄÀ¸·Î ÄÚµåÀüȯÀ» ¼³Á¤ÇØ ÁÙ °ÍÀÔ´Ï´Ù. ³ª´Â ±×·¯ÇÑ ¶óÀÎÀÌ ÁÖ¼®Á¦°ÅµÇ¾î ¼öÁ¤µÈ site.py ¹öÀüÀ» »ç¿ëÇÕ´Ï´Ù.
# Set the string encoding used by the Unicode implementation. # The default is 'ascii'
encoding = "ascii" # <= CHANGE THIS if you wish
# Enable to support locale aware default string encodings.
import locale
loc = locale.getdefaultlocale()
if loc[1]: encoding = loc[1]
if encoding != "ascii": import sys sys.setdefaultencoding(encoding)
¶ÇÇÑ À©µµ¿ì¿¡¼ ÁÖÀÇÇÒ °ÍÀº, "mbcs"¶ó°í ¾Ë·ÁÁø ÄÚµåÀüȯÀÌ Àִµ¥, ÇöÀçÀÇ ·ÎÄÉÀÏ¿¡ Á¾¼ÓÀûÀÎ ÄÚµå ÀüȯÀ» »ç¿ëÇÕ´Ï´Ù. ¸¹Àº °æ¿ì¿¡, ƯÈ÷ COM°ú ÀÛµ¿ÇÒ ¶§´Â, À̰ÍÀÌ ¾Æ¸¶µµ »ç¿ëÇØ¾ßÇÒ ÀûÀýÇÑ ±âº» ÄÚµåÀüȯÀÌ µÉ °ÍÀÔ´Ï´Ù.