9. ã¯ã©ã¹Â¶
ã¯ã©ã¹ã¯ãã¼ã¿ã¨æ©è½ãçµã¿åãããæ¹æ³ãæä¾ãã¾ãã æ°è¦ã«ã¯ã©ã¹ã使ãããã¨ã§ãæ°ãããªãã¸ã§ã¯ãã® å ã使ãããã®åãæã¤æ°ãã ã¤ã³ã¹ã¿ã³ã¹ ãä½ãã¾ãã ã¯ã©ã¹ã®ããããã®ã¤ã³ã¹ã¿ã³ã¹ã¯èªèº«ã®ç¶æ ãä¿æãã屿§ãæã¦ã¾ãã ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã¯ããã®ç¶æ ã夿´ããããã® (ãã®ã¯ã©ã¹ãå®ç¾©ãã) ã¡ã½ãããæã¦ã¾ãã
Python ã¯ãä»ã®ããã°ã©ãã³ã°è¨èªã¨æ¯è¼ãã¦ãæå°éã®æ§æã¨æå³ä»ãã使ã£ã¦ã¯ã©ã¹ãè¨èªã«è¿½å ãã¦ãã¾ããPython ã®ã¯ã©ã¹ã¯ãC++ 㨠Modula-3 ã®ã¯ã©ã¹ã¡ã«ããºã ãæ··ãããã®ã§ããPython ã®ã¯ã©ã¹æ©æ§ã¯ãªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ã®æ¨æºçãªæ©è½ãå ¨ã¦æä¾ãã¦ãã¾ããã¯ã©ã¹ã®ç¶æ¿ã¡ã«ããºã ã¯ãè¤æ°ã®åºåºã¯ã©ã¹ãæã¤ãã¨ãã§ããæ´¾çã¯ã©ã¹ã§åºåºã¯ã©ã¹ã®ä»»æã®ã¡ã½ããããªã¼ãã©ã¤ããããã¨ãã§ãã¾ããã¡ã½ããã§ã¯ãåºåºã¯ã©ã¹ã®ã¡ã½ãããåãååã§å¼ã³åºããã¨ãã§ãã¾ãããªãã¸ã§ã¯ãã«ã¯ä»»æã®ç¨®é¡ã¨æ°ã®ãã¼ã¿ãæ ¼ç´ãããã¨ãã§ãã¾ããã¢ã¸ã¥ã¼ã«ã¨åãããã¯ã©ã¹æ©æ§ã Python ã®åçãªæ§è³ªã«å¾ãããã«è¨è¨ããã¦ãã¾ããã¯ã©ã¹ã¯å®è¡æã«çæãããçæå¾ã«å¤æ´ãããã¨ãã§ãã¾ãã
C++ ã®ç¨èªã§è¨ãã°ãé常ã®ã¯ã©ã¹ã¡ã³ã (ãã¼ã¿ã¡ã³ããå«ã) 㯠(ãã©ã¤ãã¼ã夿° ã«æ¸ããã¦ããä¾å¤ãé¤ãã¦) public ã§ãããã¡ã³ã颿°ã¯ãã¹ã¦ ä»®æ³é¢æ°(virtual) ã§ãã Modula-3 ã«ãããããªããªãã¸ã§ã¯ãã®ã¡ã³ããã¡ã½ããããåç §ããããã®ç縮ããè¨æ³ã¯ä½¿ãã¾ãã: ã¡ã½ãã颿°ã®å®£è¨ã§ã¯ããªãã¸ã§ã¯ãèªä½ã表ã第ä¸å¼æ°ãæç¤ºããªããã°ãªãã¾ããã第ä¸å¼æ°ã®ãªãã¸ã§ã¯ãã¯ã¡ã½ããå¼ã³åºãã®éã«æé»ã®å¼æ°ã¨ãã¦æ¸¡ããã¾ãã Smalltalk ã«ä¼¼ã¦ãã¯ã©ã¹ã¯ããèªä½ããªãã¸ã§ã¯ãã§ãããã®ããã import ãåå夿´ã¨ãã£ãæä½ãå¯è½ã§ãã C++ ã Modula-3 ã¨éã£ã¦ãã¦ã¼ã¶ã¼ã¯çµè¾¼ã¿åãåºåºã¯ã©ã¹ã«ãã¦æ¡å¼µãè¡ãã¾ããã¾ããC++ ã¨ã¯åãã§ Modula-3 ã¨ã¯éãç¹ã¨ãã¦ãç¹å¥ãªæ§æãä¼´ãã»ã¨ãã©ã®çµã¿è¾¼ã¿æ¼ç®å (ç®è¡æ¼ç®å (arithmetic operator) ãæ·»å表è¨) ã¯ã¯ã©ã¹ã¤ã³ã¹ã¿ã³ã¹ã§ä½¿ãããã«åå®ç¾©ã§ãã¾ãã
(ã¯ã©ã¹ã«é¢ãã¦æ®éçãªç¨èªå®ç¾©ããªãã®ã§ã Smalltalk 㨠C++ ã®ç¨èªãå ´åã«å¿ãã¦ä½¿ã£ã¦ãããã¨ã«ãã¾ãã C++ ããã Modula-3 ã®æ¹ããªãã¸ã§ã¯ãæåã®æå³è«ã Python ã«è¿ãã®ã§ã Modula-3 ã®ç¨èªã使ãããã®ã§ãããã»ã¨ãã©ã®èªè 㯠Modula-3 ã«ã¤ãã¦ãããªãã§ãããããã)
9.1. ååã¨ãªãã¸ã§ã¯ãã«ã¤ãã¦Â¶
ãªãã¸ã§ã¯ãã«ã¯å使§ããããåä¸ã®ãªãã¸ã§ã¯ãã«(è¤æ°ã®ã¹ã³ã¼ããã) è¤æ°ã®ååãå²ãå½ã¦ããã¨ãã§ãã¾ãããã®æ©è½ã¯ä»ã®è¨èªã§ã¯å¥åã¥ã(alias) ã¨ãã¦ç¥ããã¦ãã¾ãã Python ãä¸è¦ããã ãã§ã¯ãå¥åã¥ãã®éè¦æ§ã¯åãããªããã¨ãå¤ãã夿´ä¸è½ãªåºæ¬å (æ°å¤ãæååãã¿ãã«)ãæ±ãã¨ãã«ã¯ç¡è¦ãã¦å·®ãæ¯ãããã¾ãããããããªãããå¥åä»ãã¯ããªã¹ããè¾æ¸ãä»ã®å¤ãã®åãªã©ã夿´å¯è½ãªåãæ±ã Python ã³ã¼ãä¸ã§é©ãã¹ã广ãããã¾ããå¥åä»ãã¯ããã¤ãã®ç¹ã§ãã¤ã³ã¿ã®ããã«æ¯èãããã®ãã¨ã¯é常ã¯ããã°ã©ã ã«å©ããããã«ä½¿ããã¾ããä¾ãã°ããªãã¸ã§ã¯ãã®åãæ¸¡ãã¯ãå®è£ ä¸ã¯ãã¤ã³ã¿ã渡ãããã ããªã®ã§ã³ã¹ãã®ä½ãæä½ã«ãªãã¾ããã¾ãã颿°ããããªãã¸ã§ã¯ãã弿°ã¨ãã¦æ¸¡ãããã¨ãã颿°ã®å¼ã³åºãå´ãããªãã¸ã§ã¯ãã«å¯¾ãã夿´ãè¦ããã¨ãã§ãã¾ã --- ããã«ããã Pascal ã«ãããããªäºã¤ã®å¼æ°æ¸¡ãæ©æ§ããã¤å¿ è¦ããªããã¦ãã¾ãã
9.2. Python ã®ã¹ã³ã¼ãã¨åå空é¶
ã¯ã©ã¹ãç´¹ä»ããåã«ãPython ã®ã¹ã³ã¼ãã®ã«ã¼ã«ã«ã¤ãã¦ãããã¨ã話ãã¦ãããªããã°ãªãã¾ãããã¯ã©ã¹å®ç¾©ã¯å·§ã¿ãªããªãã¯ãåå空éã«æ½ãã®ã§ãä½ãèµ·ãã£ã¦ããã®ããå®å ¨ã«çè§£ããã«ã¯ãã¹ã³ã¼ãã¨åå空éãã©ã®ããã«åä½ããããçè§£ããå¿ è¦ãããã¾ããã¡ãªã¿ã«ããã®åé¡ã«é¢ããç¥èã¯å ¨ã¦ã® Python ããã°ã©ãã«ã¨ã£ã¦æç¨ã§ãã
ã¾ãå®ç¾©ããå§ãã¾ãããã
åå空é (namespace) ã¨ã¯ãååãããªãã¸ã§ã¯ãã¸ã®å¯¾å¿ä»ã (mapping) ã§ããã»ã¨ãã©ã®åå空éã¯ãç¾ç¶ã§ã¯ Python ã®è¾æ¸ã¨ãã¦å®è£
ããã¦ãã¾ããããã®ãã¨ã¯é常㯠(ããã©ã¼ãã³ã¹ä»¥å¤ã§ã¯) ç®ç«ã¤ãã¨ã¯ãªãããå°æ¥ã¯å¤æ´ãããããããã¾ãããåå空éã®ä¾ã«ã¯ãçµè¾¼ã¿åã®éå (abs() çã®é¢æ°ãçµè¾¼ã¿ä¾å¤å)ãã¢ã¸ã¥ã¼ã«å
ã®ã°ãã¼ãã«ãªååã颿°ãå¼ã³åºããã¨ãã®ãã¼ã«ã«ãªååãããã¾ãããªãã¸ã§ã¯ãã®å±æ§ãããªãéåãã¾ããããæå³ã§ã¯åå空éã§ããåå空éã«ã¤ãã¦ç¥ã£ã¦ããã¹ãéè¦ãªãã¨ã¯ãç°ãªã£ãåå空éã«ããååã®éã«ã¯å
¨ãé¢ä¿ããªãã¨ãããã¨ã§ããä¾ãã°ãäºã¤ã®å¥ã
ã®ã¢ã¸ã¥ã¼ã«ã®ä¸¡æ¹ã§é¢æ° maximize ã¨ãã颿°ãå®ç¾©ãããã¨ãã§ããå®ç¾©èªä½ã¯æ··åããããã¨ã¯ããã¾ãã --- ã¢ã¸ã¥ã¼ã«ã®ã¦ã¼ã¶ã¯ååã®åã«ã¢ã¸ã¥ã¼ã«åãã¤ããªããã°ãªãã¾ããã
ã¨ããã§ã 屿§ ã¨ããè¨èã¯ããããã«ç¶ãååãã¹ã¦ã«å¯¾ãã¦ä½¿ã£ã¦ãã¾ã --- ä¾ãã°å¼ z.real ã§ã real ã¯ãªãã¸ã§ã¯ã z ã®å±æ§ã§ããå³å¯ã«ããã°ãã¢ã¸ã¥ã¼ã«å
ã®ååã«å¯¾ããåç
§ã¯å±æ§ã®åç
§ã§ããå¼ modname.funcname ã§ã¯ã modname ã¯ããã¢ã¸ã¥ã¼ã«ãªãã¸ã§ã¯ãã§ã funcname ã¯ãã®å±æ§ã§ãããã®å ´åã«ã¯ãã¢ã¸ã¥ã¼ã«ã®å±æ§ã¨ã¢ã¸ã¥ã¼ã«ã®ä¸ã§å®ç¾©ããã¦ããã°ãã¼ãã«åã®éã«ã¯ãç´æ¥çãªå¯¾å¿ä»ããããã¾ãããããã®ååã¯åãåå空éãå
±æãã¦ããã®ã§ãï¼ [1]
屿§ã¯èªåãå°ç¨ã«ããæ¸è¾¼ã¿å¯è½ã«ãã§ãã¾ããæ¸è¾¼ã¿å¯è½ã§ããã°ã屿§ã«ä»£å
¥ãããã¨ãã§ãã¾ããã¢ã¸ã¥ã¼ã«å±æ§ã¯æ¸è¾¼ã¿å¯è½ã§ã modname.the_answer = 42 ã¨æ¸ããã¨ãã§ãã¾ããæ¸è¾¼ã¿å¯è½ãªå±æ§ã¯ã del æã§åé¤ãããã¨ãã§ãã¾ããä¾ãã°ã del modname.the_answer ã¯ã modname ã§æå®ããããªãã¸ã§ã¯ããã屿§ the_answer ãé¤å»ãã¾ãã
åå空éã¯æ§ã
ãªæç¹ã§ä½æããããã®å¯¿å½ãæ§ã
ã§ããçµã¿è¾¼ã¿ã®ååãå
¥ã£ãåå空é㯠Python ã¤ã³ã¿ããªã¿ãèµ·åããã¨ãã«ä½æãããæ±ºãã¦åé¤ããããã¨ã¯ããã¾ãããã¢ã¸ã¥ã¼ã«ã®ã°ãã¼ãã«ãªåå空éã¯ãã¢ã¸ã¥ã¼ã«å®ç¾©ãèªã¿è¾¼ã¾ããã¨ãã«ä½æããã¾ããé常ãã¢ã¸ã¥ã¼ã«ã®åå空éã¯ãã¤ã³ã¿ããªã¿ãçµäºããã¾ã§æ®ãã¾ããã¤ã³ã¿ããªã¿ã®ãããã¬ãã«ã§å®è¡ãããæã¯ãã¹ã¯ãªãããã¡ã¤ã«ããèªã¿åºããããã®ã§ã対話çã«èªã¿åºããããã®ã§ãã __main__ ã¨ããååã®ã¢ã¸ã¥ã¼ã«ã®ä¸é¨åã§ããã¨ã¿ãªãããã®ã§ãç¬èªã®åå空éãæã¤ãã¨ã«ãªãã¾ãã (çµã¿è¾¼ã¿ã®ååã¯å®éã«ã¯ã¢ã¸ã¥ã¼ã«å
ã«åå¨ãã¾ãããã®ã¢ã¸ã¥ã¼ã«ã¯ builtins ã¨å¼ã°ãã¦ãã¾ãã)
颿°ã®ãã¼ã«ã«ãªåå空éã¯ã颿°ãå¼ã³åºãããã¨ãã«ä½æããã颿°ããæ»ã£ãã¨ããã颿°å ã§ä¾å¤ãéåºããããã¤é¢æ°å ã§å¦çãããªãã£ãå ´åã«åé¤ããã¾ãã (å®éã«ã¯ãå¿ãããããã¨è¨ã£ãã»ããèµ·ãã¦ãããã¨ããã表ãã¦ãã¾ãã) ãã¡ãããå帰å¼åºãã®ã¨ãã«ã¯ãåã ã®å¼ã³åºãã§åèªã®ãã¼ã«ã«ãªåå空éãããã¾ãã
ã¹ã³ã¼ã (scope) ã¨ã¯ãããåå空éãç´æ¥ã¢ã¯ã»ã¹ã§ãããããªã Python ããã°ã©ã ã®ããã¹ãä¸ã®é åã§ãã "ç´æ¥ã¢ã¯ã»ã¹å¯è½" ã¨ã¯ã修飾ãªãã« (訳注: spam.egg ã§ã¯ãªãåã« egg ã®ããã«) ååãåç
§ããéã«ããã®åå空éããååãè¦ã¤ãããã¨è©¦ã¿ããã¨ãæå³ãã¾ãã
ã¹ã³ã¼ãã¯éçã«æ±ºå®ããã¾ãããåçã«ä½¿ç¨ããã¾ããå®è¡ä¸ã¯ãã¤ã§ããç´æ¥åå空éã«ã¢ã¯ã»ã¹å¯è½ãªã3ã¤ã¾ãã¯4ã¤ã®å ¥ãåã«ãªã£ãã¹ã³ã¼ããããã¾ã:
æåã«æ¢ããããæãå å´ã®ã¹ã³ã¼ãã¯ããã¼ã«ã«ãªååãæã£ã¦ãã¾ãã
å¤å´ã®(enclosing)颿°ã®ã¹ã³ã¼ãã¯ãè¿ãã»ãããé ã«æ¢ããããã¼ã«ã«ã§ãã°ãã¼ãã«ã§ããªãååãæã£ã¦ãã¾ãã
次ã®ã¹ã³ã¼ãã¯ãç¾å¨ã®ã¢ã¸ã¥ã¼ã«ã®ã°ãã¼ãã«ãªååãæã£ã¦ãã¾ãã
ä¸çªå¤å´ã®(æå¾ã«æ¤ç´¢ããã)ã¹ã³ã¼ãã¯ãã«ãã¤ã³åãæã£ã¦ãã¾ãã
ååã global ã¨å®£è¨ããã¦ããå ´åããã®ååã«å¯¾ããåç
§ã代å
¥ã¯å
¨ã¦ãã¢ã¸ã¥ã¼ã«ã®ã°ãã¼ãã«ãªååã®å
¥ã£ãæå¾ãã2çªç®ã®ã¹ã³ã¼ãã«å¯¾ãã¦ç´æ¥è¡ããã¾ããæå
ã¹ã³ã¼ãã®å¤å´ã«ãã夿°ã«åæç¸ããã«ã¯ã nonlocal æã使ãã¾ããnonlocal ã¨å®£è¨ãããªãã£ã夿°ã¯ãå
¨ã¦èªã¿åºãå°ç¨ã¨ãªãã¾ã (ãã®ãããªå¤æ°ã«å¯¾ããæ¸ãè¾¼ã¿ã¯ãåã« æ°ãã ãã¼ã«ã«å¤æ°ããã£ã¨ãå
å´ã®ã¹ã³ã¼ãã§ä½æããå¤é¨ã®ã¹ã³ã¼ãã®å¤ã¯å¤åãã¾ãã)ã
é常ããã¼ã«ã«ã¹ã³ã¼ã㯠(ããã°ã©ã ããã¹ãä¸ã®) ç¾å¨ã®é¢æ°ã®ãã¼ã«ã«ãªååãåç §ãã¾ãã颿°ã®å¤å´ã§ã¯ããã¼ã«ã«ã¹ã³ã¼ãã¯ã°ãã¼ãã«ãªåå空éã¨åãåå空éãã¢ã¸ã¥ã¼ã«ã®åå空éãåç §ãã¾ããã¯ã©ã¹å®ç¾©ã§ã¯ããã¼ã«ã«ã¹ã³ã¼ãã®ä¸ã«ããä¸ã¤åå空éãç½®ããã¾ãã
ã¹ã³ã¼ãã¯ããã¹ãä¸ã§æ±ºå®ããã¦ããã¨çè§£ãããã¨ãéè¦ã§ããã¢ã¸ã¥ã¼ã«å ã§å®ç¾©ããã颿°ã®ã°ãã¼ãã«ãªã¹ã³ã¼ãã¯ã颿°ãã©ãããå¼ã³åºããã¦ããã©ããªå¥åãã¤ãã¦å¼ã³åºããã¦ãããã®ã¢ã¸ã¥ã¼ã«ã®åå空éã«ãªãã¾ããå対ã«ãå®éã®ååã®æ¤ç´¢ã¯å®è¡æã«åçã«è¡ããã¾ã --- ã¨ã¯ãããè¨èªã®å®ç¾©ã¯ã"ã³ã³ãã¤ã«" æã®éçãªååè§£æ±ºã®æ¹åã«é²åãã¦ããã®ã§ãåçãªåå解決ã«é ¼ã£ã¦ã¯ããã¾ããï¼ (äºå®ããã¼ã«ã«ãªå¤æ°ã¯æ¢ã«éçã«æ±ºå®ããã¦ãã¾ãã)
Python ã®ç¹å¾´ã¨ãã¦ãglobal ã nonlocal æãæå¹ã§ãªãå ´åã¯ãååã«å¯¾ããåç
§ã¯å¸¸ã«æãå
å´ã®ã¹ã³ã¼ãã«å¯¾ãã¦æå¹ã«ãªãã¾ãã
代å
¥ã¯ãã¼ã¿ãã³ãã¼ãã¾ããããªãã¸ã§ã¯ããååã«æç¸ããã ãã§ããåé¤ãåæ§ã§ãdel x ã¯ããã¼ã«ã«ã¹ã³ã¼ãã®åå空éãã x ã«å¯¾ããææãåãé¤ãã¾ãã
ã¤ã¾ãã¨ãããæ°ããååãä¸ãããããªãã¹ã¦ã®æä½ã¯ããã¼ã«ã«ã¹ã³ã¼ãã使ã£ã¦è¡ããã¾ãã import æã颿°ã®å®ç¾©ã¯ãã¢ã¸ã¥ã¼ã«ã颿°åããã¼ã«ã«ã¹ã³ã¼ãã®ååã«ææãã¾ãã
global æã使ãã¨ãç¹å®ã®å¤æ°ãã°ãã¼ãã«ã¹ã³ã¼ãã«åå¨ããããã§åæç¸ããããã¨ãæç¤ºã§ãã¾ãã nonlocal æã¯ãç¹å®ã®å¤æ°ãå¤å´ã®ã¹ã³ã¼ãã«åå¨ããããã§åæç¸ããããã¨ãæç¤ºãã¾ãã
9.2.1. ã¹ã³ã¼ãã¨åå空éã®ä¾Â¶
ç°ãªãã¹ã³ã¼ãã¨åå空éãã©ã®ããã«åç
§ãããããã¾ã global ããã³ nonlocal ã夿°ã®æç¸ã«ã©ãå½±é¿ãããããã®ä¾ã§å®æ¼ãã¾ã:
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
ãã®ã³ã¼ãä¾ã®åºåã¯:
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
ãã®ã¨ããã(ããã©ã«ãã®) ãã¼ã«ã«ãª 代å
¥ã¯ scope_test ä¸ã® spam ã¸ã®æç¸ã夿´ãã¾ããã§ããã nonlocal 代å
¥ã¯ scope_test ä¸ã® spam ã¸ã®æç¸ã夿´ãã global 代å
¥ã¯ã¢ã¸ã¥ã¼ã«ã¬ãã«ã®æç¸ã夿´ãã¾ããã
ã¾ãããããã global 代å
¥ã®åã«ã¯ spam ã«ä½ãæç¸ããã¦ããªãã£ããã¨ãåããã¾ãã
9.3. ã¯ã©ã¹åè¦Â¶
ã¯ã©ã¹ã§ã¯ãæ°ããæ§æãå°ãã¨ãä¸ã¤ã®æ°ããªãªãã¸ã§ã¯ãåãããã¦æ°ããªæå³ä»ããããã¤ãåãå ¥ãã¦ãã¾ãã
9.3.1. ã¯ã©ã¹å®ç¾©ã®æ§æÂ¶
ã¯ã©ã¹å®ç¾©ã®æãåç´ãªå½¢å¼ã¯ã次ã®ããã«ãªãã¾ã:
class ClassName:
<statement-1>
.
.
.
<statement-N>
颿°å®ç¾© (def æ) ã¨åæ§ãã¯ã©ã¹å®ç¾©ã广ããã¤ã«ã¯ã¾ãå®è¡ããªããã°ãªãã¾ããã (ã¯ã©ã¹å®ç¾©ã if æã®åå²å
ã颿°å
é¨ã«ç½®ããã¨ããèãæ¹ã¨ãã¦ã¯ãããã¾ãã)
å®éã«ã¯ãã¯ã©ã¹å®ç¾©ã®å å´ã«ããæã¯ãé常ã¯é¢æ°å®ç¾©ã«ãªãã¾ãããä»ã®æãæ¸ããã¨ãã§ãããããå½¹ã«ç«ã¤ãã¨ãããã¾ã --- ããã«ã¤ãã¦ã¯å¾ã§è¿°ã¹ã¾ããã¯ã©ã¹å ã®é¢æ°å®ç¾©ã¯é常ãã¡ã½ããã®å¼ã³åºãè¦ç´ã§æ±ºããããç¬ç¹ã®å½¢å¼ã®å¼æ°ãªã¹ããæã¡ã¾ã --- ããã«ã¤ãã¦ãå¾ã§è¿°ã¹ã¾ãã
ã¯ã©ã¹å®ç¾©ã«å ¥ãã¨ãæ°ããªåå空éã使ããããã¼ã«ã«ãªåå空éã¨ãã¦ä½¿ããã¾ã --- å¾ã£ã¦ããã¼ã«ã«ãªå¤æ°ã«å¯¾ããå ¨ã¦ã®ä»£å ¥ã¯ãã®æ°ããªåå空éã«å ¥ãã¾ããç¹ã«ã颿°å®ç¾©ãè¡ãã¨ãæ°ããªé¢æ°ã®ååã¯ãã®åå空éã«çµã³ä»ãããã¾ãã
ã¯ã©ã¹å®ç¾©ããæ®éã« (å®ç¾©ã®çµç«¯ã«å°éãã¦) æããã¨ã ã¯ã©ã¹ãªãã¸ã§ã¯ã (class object) ãçæããã¾ããã¯ã©ã¹ãªãã¸ã§ã¯ãã¯ãåºæ¬çã«ã¯ã¯ã©ã¹å®ç¾©ã§ä½æãããåå空éã®å
容ããããã©ããã¼ (wrapper) ã§ããã¯ã©ã¹ãªãã¸ã§ã¯ãã«ã¤ãã¦ã¯æ¬¡ã®ç¯ã§è©³ããå¦ã¶ãã¨ã«ãã¾ãã (ã¯ã©ã¹å®ç¾©ã«å
¥ãåã«æå¹ã ã£ã) å
ã®ãã¼ã«ã«ã¹ã³ã¼ãã復帰ããçæãããã¯ã©ã¹ãªãã¸ã§ã¯ãã¯å¾©å¸°ãããã¼ã«ã«ã¹ã³ã¼ãã«ã¯ã©ã¹å®ç¾©ã®ãããã§æå®ããåå (ä¸ã®ä¾ã§ã¯ ClassName) ã§çµã³ä»ãããã¾ãã
9.3.2. ã¯ã©ã¹ãªãã¸ã§ã¯ã¶
ã¯ã©ã¹ãªãã¸ã§ã¯ãã§ã¯ï¼ç¨®é¡ã®æ¼ç®ã屿§åç §ã¨ã¤ã³ã¹ã¿ã³ã¹çæããµãã¼ããã¦ãã¾ãã
屿§åç
§ (attribute reference) ã¯ãPython ã«ããããã¹ã¦ã®å±æ§åç
§ã§ä½¿ããã¦ããæ¨æºçãªæ§æã obj.name ã使ãã¾ããã¯ã©ã¹ãªãã¸ã§ã¯ããçæãããéã«ã¯ã©ã¹ã®åå空éã«ãã£ãååãã¹ã¦ãæå¹ãªå±æ§åã§ããå¾ã£ã¦ã以ä¸ã®ãããªã¯ã©ã¹å®ç¾©ã§ã¯:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
MyClass.i 㨠MyClass.f ã¯æå¹ãªå±æ§åç
§ã§ãããããããæ´æ°ã¨é¢æ°ãªãã¸ã§ã¯ããè¿ãã¾ããã¯ã©ã¹å±æ§ã代å
¥ã§ããããã代å
¥ã«ãã MyClass.i ã®å¤ãå¤ãããã¾ãã __doc__ ãæå¹ãªå±æ§ã§ããã®ã¯ã©ã¹ã«å±ãã¦ããããã¥ã¡ã³ãã¼ã·ã§ã³æåå(docstring) ããã®å ´å㯠"A simple example class" ãè¿ãã¾ãã
ã¯ã©ã¹ã® ã¤ã³ã¹ã¿ã³ã¹å (instantiation) ã«ã¯é¢æ°è¨æ³ã使ãã¾ããã¯ã©ã¹ãªãã¸ã§ã¯ãã®ãã¨ããã¯ã©ã¹ã®æ°ããã¤ã³ã¹ã¿ã³ã¹ãè¿ãã弿°ã®ãªã颿°ã®ããã«æ±ã£ã¦ãã ãããä¸è¨ã¯ã©ã¹ã§ä¾ç¤ºããã¨:
x = MyClass()
ã¯ãã¯ã©ã¹ã®æ°ãã ã¤ã³ã¹ã¿ã³ã¹ (instance) ãçæãããã®ãªãã¸ã§ã¯ãããã¼ã«ã«å¤æ° x ã¸ä»£å
¥ãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹åæä½ (ã¯ã©ã¹ãªãã¸ã§ã¯ãã® "å¼åºã") ã§ã¯ã空ã®ãªãã¸ã§ã¯ããä½ããã¾ããå¤ãã®ã¯ã©ã¹ã§ã¯ãç¹å®ã®åæç¶æ
ã«ã«ã¹ã¿ãã¤ãºããããªãã¸ã§ã¯ããä½ãããã§ãããã®ããã«ãã¯ã©ã¹ã«ã¯ __init__() ã¨ããååã®ç¹æ®ã¡ã½ãããå®ç¾©ã§ãã¾ããä¾ãã°æ¬¡ã®ããã«ãã¾ã:
def __init__(self):
self.data = []
ã¯ã©ã¹ã __init__() ã¡ã½ãããå®ç¾©ãã¦ããå ´åãã¯ã©ã¹ãã¤ã³ã¹ã¿ã³ã¹åããã¨ãæ°ããä½ãããã¯ã©ã¹ã¤ã³ã¹ã¿ã³ã¹ã«å¯¾ãã¦èªåçã« __init__() ãå¼ã³åºãã¾ãã å¾ã£ã¦ ãã®ä¾ã§ã¯ãæ°ããªåææ¸ã¿ã¤ã³ã¹ã¿ã³ã¹ã次ã®ããã«ãã¦å¾ããã¾ã:
x = MyClass()
ãã¡ããããã大ããªæè»æ§ãæãããããã«ã __init__() ã¡ã½ããã«è¤æ°ã®å¼æ°ããããããã¨ãã§ãã¾ãããã®å ´åãæ¬¡ã®ä¾ã®ããã«ãã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹åæä½ã«æ¸¡ããã弿°ã¯ __init__() ã«æ¸¡ããã¾ããä¾ãã°ã
>>> class Complex:
... def __init__(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
9.3.3. ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ã¶
ã¨ããã§ãã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã使ãã¨ä½ãã§ããã®ã§ããããï¼ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ããçè§£ã§ããå¯ä¸ã®æä½ã¯ã屿§ã®åç §ã§ããæå¹ãªå±æ§åã«ã¯ (ãã¼ã¿å±æ§ããã³ã¡ã½ããã®) äºç¨®é¡ããã¾ãã
ãã¼ã¿å±æ§ (Data attribute) ã¯ã Smalltalk ã® "ã¤ã³ã¹ã¿ã³ã¹å¤æ°" ã C++ã® "ãã¼ã¿ã¡ã³ã" ã«ç¸å½ãã¾ãããã¼ã¿å±æ§ã宣è¨ããå¿
è¦ã¯ããã¾ããããã¼ã«ã«å¤æ°ã¨åæ§ã«ããããã®å±æ§ã¯æåã«ä»£å
¥ãããæç¹ã§æ¹§ãåºã¦ãã¾ããä¾ãã°ãä¸ã§çæãã MyClass ã®ã¤ã³ã¹ã¿ã³ã¹ x ã«å¯¾ãã¦ã次ã®ã³ã¼ããå®è¡ããã¨ãè·¡ãæ®ããå¤ 16 ãå°åãã¾ã:
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print(x.counter)
del x.counter
ããä¸ã¤ã®ã¤ã³ã¹ã¿ã³ã¹å±æ§ã®åç §ã¯ã ã¡ã½ãã ã§ããã¡ã½ããã¨ã¯ããªãã¸ã§ã¯ãã« "å±ãã" 颿°ã®ãã¨ã§ãã
ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã§æå¹ãªã¡ã½ããåã¯ããã®ã¯ã©ã¹ã«ããã¾ããå®ç¾©ã«ãããã¯ã©ã¹ã®å
¨ã¦ã®é¢æ°ãªãã¸ã§ã¯ãã§ãã屿§ãã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã®å¦¥å½ãªã¡ã½ããåã«æ±ºã¾ãã¾ããå¾ã£ã¦ãä¾ã§ã¯ãMyClass.f ã¯é¢æ°ãªã®ã§ãx.f ã¯ã¡ã½ããã®åç
§ã¨ãã¦æå¹ã§ããããããMyClass.i ã¯é¢æ°ã§ã¯ãªãã®ã§ãx.i ã¯ã¡ã½ããã®åç
§ã¨ãã¦æå¹ã§ã¯ããã¾ãããx.f 㯠MyClass.f ã¨åããã®ã§ã¯ããã¾ãã --- 颿°ãªãã¸ã§ã¯ãã§ã¯ãªããã¡ã½ãããªãã¸ã§ã¯ã (method object) ã§ãã
9.3.4. ã¡ã½ãããªãã¸ã§ã¯ã¶
æ®éãã¡ã½ããã¯ãã¤ã³ããããç´å¾ã«å¼ã³åºããã¾ã:
x.f()
ãã x = MyClass() ã§ããã°ãä¸è¨ã®ã³ã¼ãã¯æåå 'hello world' ãè¿ãã§ããããããããªãããå¿
ãããã¡ã½ããããã®å ´ã§å¼ã³åºããªããã°ãªããªãããã§ã¯ããã¾ããã x.f ã¯ã¡ã½ãããªãã¸ã§ã¯ãã§ãããã©ããã«è¨æ¶ãã¦ããã¦å¾ã§å¼ã³åºããã¨ãã§ãã¾ããä¾ãã°æ¬¡ã®ã³ã¼ãã¯:
xf = x.f
while True:
print(xf())
hello world ãæãçµããã¾ã§å°åãç¶ããã§ãããã
ã¡ã½ãããå¼ã³åºãããã¨ãã«ã¯å®éã«ã¯ä½ãèµ·ãã¦ããã®ã§ããããï¼ f() ã®é¢æ°å®ç¾©ã§ã¯å¼æ°ãä¸ã¤æå®ãã¦ããã«ãããããããä¸ã®ä¾ã§ã¯ x.f() ã弿°ãªãã§å¼ã³åºããã¦ãã¾ãã弿°ã¯ã©ããªã£ãã®ã§ããããï¼ãããã弿°ãå¿
è¦ãªé¢æ°ã弿°ç¡ãã§å¼ã³åºãã¨ã Python ãä¾å¤ãéåºããã¯ãã§ã --- ãã¨ããã®å¼æ°ãå®éã«ã¯ä½¿ãããªãã¦ãâ¦ã
ããçã¯æ³åã§ãã¦ããããããã¾ããã:
ã¡ã½ããã«ã¤ãã¦ç¹å¥ãªãã¨ã¨ãã¦ãã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã颿°ã®ç¬¬1弿°ã¨ãã¦æ¸¡ããã¾ãã
ä¾ã§ã¯ã x.f() ã¨ããå¼ã³åºãã¯ã MyClass.f(x) ã¨å³å¯ã«ç価ãªãã®ã§ãã
ä¸è¬ã«ã n åã®å¼æ°ãªã¹ããã£ãã¡ã½ããã®å¼åºãã¯ããã®ã¡ã½ããã®ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ããæåã®å¼æ°ã®åã«æ¿å
¥ãã弿°ãªã¹ãã§ãã¡ã½ããã«å¯¾å¿ãã颿°ãå¼ã³åºããã¨ã¨ç価ã§ãã
ä¸è¬çã«ãã¡ã½ããã¯ä»¥ä¸ã®ããã«åä½ãã¾ããã¤ã³ã¹ã¿ã³ã¹ã®éãã¼ã¿å±æ§ãåç §ãããã¨ãã¯ããã®ã¤ã³ã¹ã¿ã³ã¹ã®ã¯ã©ã¹ãæ¤ç´¢ããã¾ãããã®ååãæå¹ãªã¯ã©ã¹å±æ§ã表ãã¦ãã颿°ãªãã¸ã§ã¯ããªããã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã¨é¢æ°ãªãã¸ã§ã¯ãã®ä¸¡æ¹ã¸ã®åç §ãã¡ã½ãããªãã¸ã§ã¯ãã«ããã¯ããã¾ããã¡ã½ãããªãã¸ã§ã¯ãã弿°ãªã¹ãã¨å ±ã«å¼ã³åºãããã¨ããã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã¨æ¸¡ããã弿°ãªã¹ãããæ°ãã弿°ãªã¹ãã使ãã¦ãå ã®é¢æ°ãªãã¸ã§ã¯ããæ°ãã弿°ãªã¹ãã§å¼ã³åºãã¾ãã
9.3.5. ã¯ã©ã¹ã¨ã¤ã³ã¹ã¿ã³ã¹å¤æ°Â¶
ä¸è¬çã«ãã¤ã³ã¹ã¿ã³ã¹å¤æ°ã¯ããããã®ã¤ã³ã¹ã¿ã³ã¹ã«ã¤ãã¦åºæã®ãã¼ã¿ã®ããã®ãã®ã§ãã¯ã©ã¹å¤æ°ã¯ãã®ã¯ã©ã¹ã®ãã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã«ãã£ã¦å ±æããã屿§ãã¡ã½ããã®ããã®ãã®ã§ã:
class Dog:
kind = 'canine' # å
¨ã¤ã³ã¹ã¿ã³ã¹ã§å
±æãããã¯ã©ã¹å¤æ°
def __init__(self, name):
self.name = name # ã¤ã³ã¹ã¿ã³ã¹ãã¨ã«åºæã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # ãã¹ã¦ã®ç¬ã§å
±æ
'canine'
>>> e.kind # ãã¹ã¦ã®ç¬ã§å
±æ
'canine'
>>> d.name # d åºæ
'Fido'
>>> e.name # e åºæ
'Buddy'
ååã¨ãªãã¸ã§ã¯ãã«ã¤ã㦠ã§è°è«ããããã«ãå ±æãã¼ã¿ã¯ãªã¹ããè¾æ¸ã®ãã㪠mutable ãªãã¸ã§ã¯ããé¢ä¸ããã¨é©ãã¹ã广ãæã¡å¾ã¾ããä¾ãã°ã以ä¸ã®ã³ã¼ãã® tricks ãªã¹ãã¯ã¯ã©ã¹å¤æ°ã¨ãã¦ä½¿ãããã¹ãã§ã¯ããã¾ããããªããªããã£ãä¸ã¤ã®ãªã¹ãããã¹ã¦ã® Dog ã¤ã³ã¹ã¿ã³ã¹ã«ãã£ã¦å ±æããããã¨ã«ãªãå¾ãããã§ã:
class Dog:
tricks = [] # ã¯ã©ã¹å¤æ°ã®ééã£ã使ç¨
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks # æå³ãã ãã¹ã¦ã®ç¬ã§å
±æ
['roll over', 'play dead']
ãã®ã¯ã©ã¹ã®æ£ããè¨è¨ã§ã¯ã¤ã³ã¹ã¿ã³ã¹å¤æ°ã代ããã«ä½¿ç¨ããã¹ãã§ã:
class Dog:
def __init__(self, name):
self.name = name
self.tricks = [] # ç¬ãã¨ã«æ°ãã空ãªã¹ããä½ã
def add_trick(self, trick):
self.tricks.append(trick)
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks
['roll over']
>>> e.tricks
['play dead']
9.4. ãããããªæ³¨æç¹Â¶
ã¤ã³ã¹ã¿ã³ã¹ã¨ã¯ã©ã¹ã®ä¸¡æ¹ã§åã屿§åã使ç¨ããã¦ããå ´åã屿§æ¤ç´¢ã¯ã¤ã³ã¹ã¿ã³ã¹ãåªå ããã¾ãã
>>> class Warehouse:
... purpose = 'storage'
... region = 'west'
...
>>> w1 = Warehouse()
>>> print(w1.purpose, w1.region)
storage west
>>> w2 = Warehouse()
>>> w2.region = 'east'
>>> print(w2.purpose, w2.region)
storage east
ãã¼ã¿å±æ§ã¯ãã¡ã½ããããåç §ã§ããã¨åæã«ãé常ã®ãªãã¸ã§ã¯ãã®ã¦ã¼ã¶ ("ã¯ã©ã¤ã¢ã³ã") ãããåç §ã§ãã¾ããè¨ãæããã¨ãã¯ã©ã¹ã¯ç´ç²ãªæ½è±¡ãã¼ã¿åã¨ãã¦ä½¿ããã¨ãã§ãã¾ãããå®éã Python ã§ã¯ããã¼ã¿é è½ãè£å¼·ããããã®æ©æ§ã¯ãªã«ãããã¾ãã --- ãã¼ã¿ã®é è½ã¯ãã¹ã¦è¦ç´ã«åºã¥ãã¦ãã¾ãã (éã«ãC è¨èªã§æ¸ããã Python ã®å®è£ ã§ã¯å®è£ ã®è©³ç´°ãå®å ¨ã«é è½ããå¿ è¦ã«å¿ãã¦ãªãã¸ã§ã¯ãã¸ã®ã¢ã¯ã»ã¹ãå¶å¾¡ã§ãã¾ãããã®æ©æ§ã¯ C è¨èªã§æ¸ããã Python æ¡å¼µã§ä½¿ããã¨ãã§ãã¾ãã)
ã¯ã©ã¤ã¢ã³ãã¯ãã¼ã¿å±æ§ãæ³¨ææ·±ãæ±ãã¹ãã§ã --- ã¯ã©ã¤ã¢ã³ãã¯ãã¡ã½ãããç¶æãã¦ãããã¼ã¿å±æ§ã®ä¸å¤å¼ãè¸ã¿ã«ãããå°ç¡ãã«ããããããã¾ãããã¯ã©ã¤ã¢ã³ãã¯ãååã®è¡çªãåé¿ããã¦ããéããã¡ã½ããã®æå¹æ§ã«å½±é¿ãåã¼ããã¨ãªãã¤ã³ã¹ã¿ã³ã¹ã«ç¬èªã®å±æ§ã追å ãããã¨ãã§ãããã¨ãããã¨ã«æ³¨æãã¦ãã ãã --- ããã§ããååä»ãã®è¦ç´ã¯é çã®ç¨®ãç¡ããã¦ããã¾ãã
ã¡ã½ããã®ä¸ããããã¼ã¿å±æ§ã (ã¾ãã¯å¥ã®ã¡ã½ãããï¼) åç §ããããã®ç縮ãããè¨æ³ã¯ããã¾ãããç§ã¯ããã®ä»æ§ãã¡ã½ããã®å¯èªæ§ãé«ãã¦ããã¨æãã¦ãã¾ããããã¡ã½ãããçºãã¦ããã¨ãã«ãã¼ã«ã«ãªå¤æ°ã¨ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãã¯ã£ããåºå¥ã§ããããã§ãã
ãããã¡ã½ããã®æåã®å¼æ°ã self ã¨å¼ã³ã¾ãããã®ååä»ãã¯åãªãæ
£ç¿ã§ããããã¾ããã self ã¨ããååã¯ã Python ã§ã¯ä½ãç¹æ®ãªæå³ãæã¡ã¾ãããã¨ã¯ããããã®æ
£è¡ã«å¾ããªãã¨ãã³ã¼ãã¯ä»ã® Python ããã°ã©ãã«ã¨ã£ã¦ããèªã¿ã«ãããã®ã¨ãªãã¾ããã¾ãã ã¯ã©ã¹ãã©ã¦ã¶ (class browser) ããã°ã©ã ããã®æ
£è¡ããã¦ã«ãã¦æ¸ããã¦ããããããã¾ããã
ã¯ã©ã¹å±æ§ã§ãã颿°ãªãã¸ã§ã¯ãã¯ããããããã®ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã®ããã®ã¡ã½ãããå®ç¾©ãã¦ãã¾ãã颿°å®ç¾©ã¯ãããã¹ãä¸ã§ã¯ã©ã¹å®ç¾©ã®ä¸ã«å ¥ã£ã¦ããå¿ è¦ã¯ããã¾ããã颿°ãªãã¸ã§ã¯ããã¯ã©ã¹ã®ãã¼ã«ã«ãªå¤æ°ã®ä¸ã«ä»£å ¥ããã®ã OK ã§ããä¾ãã°ä»¥ä¸ã®ã³ã¼ãã®ããã«ãã¾ã:
# ã¯ã©ã¹å¤ã§å®ç¾©ããã颿°
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return 'hello world'
h = g
ããã§ã f ã g ãããã³ h ã¯ããã¹ã¦ C ã®å±æ§ã§ãã颿°ãªãã¸ã§ã¯ããåç
§ãã¦ãã¾ããå¾ã£ã¦ããããã¯ããã¹ã¦ C ã®ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ããã¨ãªãã¾ã --- h 㯠g ã¨å
¨ãç価ã§ãããããå®è·µãã¦ãã大æµã¯åã«ããã°ã©ã ã®èªè
ã«æ··ä¹±ãããããã ããªã®ã§æ³¨æãã¦ãã ããã
ã¡ã½ããã¯ã self 弿°ã®ã¡ã½ãã屿§ã使ã£ã¦ãä»ã®ã¡ã½ãããå¼ã³åºããã¨ãã§ãã¾ã:
class Bag:
def __init__(self):
self.data = []
def add(self, x):
self.data.append(x)
def addtwice(self, x):
self.add(x)
self.add(x)
ã¡ã½ããã¯ãé常ã®é¢æ°ã¨åãããã«ãã¦ã°ãã¼ãã«ãªååãåç §ãã¾ããããã¡ã½ããã«é¢ããã°ãã¼ãã«ã¹ã³ã¼ãã¯ããã®å®ç¾©ãå«ãã¢ã¸ã¥ã¼ã«ã§ãã(ã¯ã©ã¹ã¯ã°ãã¼ãã«ãªã¹ã³ã¼ãã¨ãã¦ç¨ãããããã¨ã¯ããã¾ããã) ã¡ã½ããã§ã°ãã¼ãã«ãªãã¼ã¿ã使ãè¯ãçç±ã¯ã»ã¨ãã©ããã¾ããããã°ãã¼ãã«ãªã¹ã³ã¼ãã使ãã¹ãå ´é¢ã¯å¤ã ããã¾ããä¸ã¤æããã¨ãã¡ã½ããå ãããã°ãã¼ãã«ãªã¹ã³ã¼ãã« import ããã颿°ãã¢ã¸ã¥ã¼ã«ãããã®ã¢ã¸ã¥ã¼ã«ä¸ã§å®ç¾©ããã颿°ãã¯ã©ã¹ã使ããã¨ãã§ãã¾ããé常ãã¡ã½ããã®å ¥ã£ã¦ããã¯ã©ã¹èªä½ã¯ã°ãã¼ãã«ãªã¹ã³ã¼ãå ã§å®ç¾©ããã¦ãã¾ããæ¬¡ã®ç¯ã§ã¯ãã¡ã½ãããèªåã®ã¯ã©ã¹ãåç §ããçç±ã¨ãã¦æ£å½ãªãã®ãè¦ã¦ã¿ã¾ãããã
åã
ã®å¤ã¯ãªãã¸ã§ã¯ããªã®ã§ã ã¯ã©ã¹ (å ã¨ãè¨ãã¾ã) ãæã£ã¦ãã¾ãããã㯠object.__class__ ã«ä¿æããã¦ãã¾ãã
9.5. ç¶æ¿Â¶
è¨ãã¾ã§ããªããç¶æ¿ã®æ¦å¿µããµãã¼ãããªãè¨èªæ©è½ã¯ "ã¯ã©ã¹" ã¨å¼ã¶ã«å¤ãã¾ãããæ´¾çã¯ã©ã¹ (derived class) ãå®ç¾©ããæ§æã¯æ¬¡ã®ããã«ãªãã¾ã:
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
åºåºã¯ã©ã¹ (base class) ã®åå BaseClassName ã¯ãæ´¾çã¯ã©ã¹å®ç¾©ã®å
¥ã£ã¦ããã¹ã³ã¼ãããã¢ã¯ã»ã¹ã§ããåå空éã§å®ç¾©ããã¦ããªããã°ãªãã¾ãããåºåºã¯ã©ã¹åã®ãããã«ä»»æã®å¼ãå
¥ãããã¨ãã§ãã¾ããããã¯æ¬¡ã®ä¾ã®ããã«ãåºåºã¯ã©ã¹ãå¥ã¢ã¸ã¥ã¼ã«ã§å®ç¾©ããã¦ããã¨ãã«ä¾¿å©ãªãã¨ãããã¾ã:
class DerivedClassName(modname.BaseClassName):
æ´¾çã¯ã©ã¹å®ç¾©ã®å®è¡ã¯ãåºåºã¯ã©ã¹ã®å ´åã¨åãããã«é²ãããã¾ããã¯ã©ã¹ãªãã¸ã§ã¯ããæ§ç¯ãããæãåºåºã¯ã©ã¹ãè¨æ¶ããã¾ããè¨æ¶ãããåºåºã¯ã©ã¹ã¯ã屿§åç §ã解決ããããã«ä½¿ããã¾ããè¦æ±ããã屿§ãã¯ã©ã¹ã«è¦ã¤ãããªãã£ãå ´åãåºåºã¯ã©ã¹ã«æ¤ç´¢ãé²ã¿ã¾ãããã®è¦åã¯ãåºåºã¯ã©ã¹ãä»ã®ä½ããã®ã¯ã©ã¹ããæ´¾çãããã®ã§ãã£ãå ´åãå帰çã«é©ç¨ããã¾ãã
æ´¾çã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹åã§ã¯ãç¹å¥ãªãã¨ã¯ä½ãããã¾ããã DerivedClassName() ã¯ã¯ã©ã¹ã®æ°ããªã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ããã¡ã½ããã®åç
§ã¯æ¬¡ã®ããã«ãã¦è§£æ±ºããã¾ããã¾ã対å¿ããã¯ã©ã¹å±æ§ãæ¤ç´¢ããã¾ããæ¤ç´¢ã¯ãå¿
è¦ã«å¿ããåºåºã¯ã©ã¹é£éãä¸ã£ã¦è¡ãããæ¤ç´¢ã®çµæã¨ãã¦ä½ããã®é¢æ°ãªãã¸ã§ã¯ããããããããå ´åãã¡ã½ããåç
§ã¯æå¹ãªãã®ã¨ãªãã¾ãã
æ´¾çã¯ã©ã¹ã¯åºåºã¯ã©ã¹ã®ã¡ã½ããã䏿¸ã (override) ãããã¨ãã§ãã¾ããã¡ã½ããã¯åããªãã¸ã§ã¯ãã®å¥ã®ã¡ã½ãããå¼ã³åºãéã«ä½ãç¹æ®ãªæ¨©éãæã¡ã¾ããããã®ãããããåºåºã¯ã©ã¹ã®ã¡ã½ããããåãåºåºã¯ã©ã¹ã§å®ç¾©ããã¦ããããä¸ã¤ã®ã¡ã½ããå¼ã³åºããè¡ã£ã¦ããå ´åãæ´¾çã¯ã©ã¹ã§ä¸æ¸ããããä½ããã®ã¡ã½ãããå¼ã³åºããããã¨ã«ãªãããããã¾ããã (C++ ããã°ã©ãã¸: Python ã§ã¯ããã¹ã¦ã®ã¡ã½ããã¯äºå®ä¸ virtual ã§ãã)
æ´¾çã¯ã©ã¹ã§ä¸æ¸ããã¦ããã¡ã½ããã§ã¯ãåºåºã¯ã©ã¹ã®ååã®ã¡ã½ãããç½®ãæããã®ã§ã¯ãªããæ¡å¼µãããã®ããããã¾ãããåºåºã¯ã©ã¹ã®ã¡ã½ãããç´æ¥å¼ã³åºãç°¡åãªæ¹æ³ãããã¾ããåã« BaseClassName.methodname(self, arguments) ãå¼ã³åºãã ãã§ãããã®ä»æ§ã¯ãå ´åã«ãã£ã¦ã¯ã¯ã©ã¤ã¢ã³ãã§ãå½¹ã«ç«ã¡ã¾ãã (ãã®å¼ã³åºãæ¹ãåä½ããã®ã¯ãåºåºã¯ã©ã¹ãã°ãã¼ãã«ã¹ã³ã¼ãã® BaseClassName ã¨ããååã§ã¢ã¯ã»ã¹ã§ããã¨ãã ãã§ãã)
Python ã«ã¯ç¶æ¿ã«é¢ä¿ãã 2 ã¤ã®çµã¿è¾¼ã¿é¢æ°ãããã¾ã:
isinstance()ã使ãã¨ã¤ã³ã¹ã¿ã³ã¹ã®åã調ã¹ããã¾ããisinstance(obj, int)ã¯obj.__class__ãintãintã®æ´¾çã¯ã©ã¹ã®å ´åã«éãTrueã«ãªãã¾ããissubclass()ã使ãã¨ã¯ã©ã¹ã®ç¶æ¿é¢ä¿ã調ã¹ããã¾ããboolã¯intã®ãµãã¯ã©ã¹ãªã®ã§issubclass(bool, int)ã¯Trueã§ããããããfloatã¯intã®ãµãã¯ã©ã¹ã§ã¯ãªãã®ã§issubclass(float, int)ã¯Falseã§ãã
9.5.1. å¤éç¶æ¿Â¶
Python ã§ã¯ãå¤éç¶æ¿ (multiple inheritance) ã®å½¢å¼ããµãã¼ããã¦ãã¾ããè¤æ°ã®åºåºã¯ã©ã¹ããã¤ã¯ã©ã¹å®ç¾©ã¯æ¬¡ã®ããã«ãªãã¾ã:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
ã»ã¨ãã©ã®ã·ã³ãã«ãªå¤éç¶æ¿ã«ããã¦ã親ã¯ã©ã¹ããç¶æ¿ããã屿§ã®æ¤ç´¢ã¯ãæ·±ãåªå
ã§ãå·¦ããå³ã«ãããã¦ç¶æ¿ã®é層ã®ä¸ã§åãã¯ã©ã¹ãè¤æ°åºã¦ããï¼è¨³æ³¨: ãã¤ã¢ã¢ã³ãç¶æ¿ã¨å¼ã°ãã¾ãï¼å ´åã«ï¼åº¦æ¢ç´¢ãããªããã¨èãããã¨ãã§ãã¾ãããªã®ã§ããã屿§ã DerivedClassName ã§è¦ã¤ãããªãå ´åãã¾ã Base1 ããæ¤ç´¢ãããããã¦ï¼å帰çã«ï¼ Base1 ã®åºåºã¯ã©ã¹ããæ¤ç´¢ãããããã§ãè¦ã¤ãããªãã£ãå ´å㯠Base2 ããæ¤ç´¢ããããã¨ãã£ãå
·åã«ãªãã¾ãã
å®éã«ã¯ãããããããå°ãã ãè¤éã§ããå調ç㪠super() ã®å¼ã³åºãã®ããã«ã¡ã½ããã®è§£æ±ºé åºã¯åçã«å¤æ´ããã¾ãããã®ã¢ããã¼ãã¯ä»ã®å¤éç¶æ¿ã®ããè¨èªã§ call-next-method ã¨ãã¦ç¥ããã¦ãããåä¸ç¶æ¿ãããªãè¨èªã® super å¼ã³åºããããå¼·åã§ãã
åçé åºä»ããå¿
è¦ãªã®ã¯ããã¹ã¦ã®å¤éç¶æ¿ã§ï¼ã¤ä»¥ä¸ã®ãã¤ã¤ã¢ã³ãç¶æ¿ (å°ãªãã¨ã 1 ã¤ã®ç¥å
ã¯ã©ã¹ã«å¯¾ãã¦æä¸ä½ã¯ã©ã¹ããå°éããçµè·¯ãè¤æ°ããç¶æ
) ãè¦ãããããã§ããä¾ãã°ãå
¨ã¦ã®æ°å½¢å¼ã®ã¯ã©ã¹ã¯ object ãç¶æ¿ãã¦ããã®ã§ãã©ã®å¤éç¶æ¿ã§ã object ã¸ã®å°éçµè·¯ãè¤æ°ããã¾ããåºåºã¯ã©ã¹ãè¤æ°åã¢ã¯ã»ã¹ãããªãããã«ããããã«ãåçã¢ã«ã´ãªãºã ã§æ¤ç´¢é åºãç·å½¢åãã¾ããããã¯ãåã¯ã©ã¹ã§æå®ããã¦ããå·¦ããå³ã¸ã®é åºã¯å´©ãããåã
ã®ç¥å
ã¯ã©ã¹ãä¸åº¦ã ãå¼ã³åºãããã¤å調ã«ãªã (ã¤ã¾ãç¥å
ã¯ã©ã¹ã®æ¤ç´¢é åºã«å½±é¿ãä¸ããã«ã¯ã©ã¹ããµãã¯ã©ã¹åã§ãã) ããã«è¡ãã¾ããã¾ã¨ããã¨ããããã®ç¹å¾´ã®ãããã§ä¿¡é ¼æ§ã¨æ¡å¼µæ§ã®ããå¤éç¶æ¿ããã¯ã©ã¹ãè¨è¨ãããã¨ãã§ããã®ã§ãã詳細ã¯ã The Python 2.3 Method Resolution Order ãè¦ã¦ãã ããã
9.6. ãã©ã¤ãã¼ã夿°Â¶
ãªãã¸ã§ã¯ãã®ä¸ããããã¢ã¯ã»ã¹åºæ¥ãªã "ãã©ã¤ãã¼ã" ã¤ã³ã¹ã¿ã³ã¹å¤æ°ã¯ã Python ã«ã¯ããã¾ãããããããã»ã¨ãã©ã® Python ã³ã¼ããå¾ã£ã¦ããæ
£ç¿ãããã¾ããã¢ã³ãã¼ã¹ã³ã¢ã§å§ã¾ãåå (ä¾ãã° _spam) ã¯ã (颿°ã§ããã¡ã½ããã§ãããã¼ã¿ã¡ã³ãã§ãã) é public ãªAPIã¨ãã¦æ±ãã¾ãããããã¯ãäºåãªã夿´ããããããããªãå®è£
ã®è©³ç´°ã¨ãã¦æ±ãããã¹ãã§ãã
ã¯ã©ã¹ã®ãã©ã¤ãã¼ãã¡ã³ãã«ã¤ãã¦é©åãªã¦ã¼ã¹ã±ã¼ã¹(ç¹ã«ãµãã¯ã©ã¹ã§å®ç¾©ãããååã¨ã®è¡çªãé¿ããå ´å)ãããã®ã§ãååãã³ã°ãªã³ã° (name mangling) ã¨å¼ã°ãããéå®ããããµãã¼ãæ©æ§ãããã¾ãã __spam (å
é ã«äºå以ä¸ã®ä¸ç·æåãæ«å°¾ã«ä¸å以ä¸ã®ä¸ç·æå) ã¨ããå½¢å¼ã®èå¥åã¯ã _classname__spam ã¸ã¨ããã¹ãç½®æãããããã«ãªãã¾ãããããã§ classname ã¯ãç¾å¨ã®ã¯ã©ã¹åããå
é ã®ä¸ç·æåãã¯ãã¨ã£ãååã«ãªãã¾ãããã®ãããªé£å·å (mangle) ã¯ãèå¥åã®ææ³çãªä½ç½®ã«ãããããè¡ãããã®ã§ãã¯ã©ã¹å®ç¾©å
ã«ç¾ããèå¥åå
¨ã¦ã«å¯¾ãã¦å®è¡ããã¾ãã
åè
詳細ã¨ç¹ä¾ã¯ã private name mangling specifications ã
ååãã³ã°ãªã³ã°ã¯ããµãã¯ã©ã¹ãå é¨ã®ã¡ã½ããå¼ã³åºããå£ããã«ã¡ã½ããããªã¼ãã¼ã©ã¤ãããã®ã«ä¾¿å©ã§ããä¾ãã°:
class Mapping:
def __init__(self, iterable):
self.items_list = []
self.__update(iterable)
def update(self, iterable):
for item in iterable:
self.items_list.append(item)
__update = update # å
ã® update() ã¡ã½ããã®ãã©ã¤ãã¼ãã³ãã¼
class MappingSubclass(Mapping):
def update(self, keys, values):
# update() ã¸ã®æ°ã·ã°ããã£å°å
¥
# ããã __init__() ã¯å£ããªã
for item in zip(keys, values):
self.items_list.append(item)
ä¸ã®ä¾ã¯ããã仮㫠MappingSubclass ã« __update èå¥åãå®è£
ããã¨ãã¦ããã¡ãã¨åãã¾ãã
ãã®çç±ã¯ã Mapping ã¯ã©ã¹ã§ã¯ãã®èå¥åã _Mapping__update ã«ã MappingSubclass ã¯ã©ã¹ã§ã¯ _MappingSubclass__update ã«ããããç½®ãæããããã§ãã
é£å·åã®è¦åã¯ä¸»ã«ä¸æ ®ã®äºæ ãé²ãããã®ãã®ã ã¨ãããã¨ã«æ³¨æãã¦ãã ãã; 確信ç¯çãªæ¹æ³ã§ããã©ã¤ãã¼ãã¨ããã¦ãã夿°ã«ã¢ã¯ã»ã¹ããã夿´ãããã¨ã¯ä¾ç¶ã¨ãã¦å¯è½ãªã®ã§ãããããã¬ã®ãããªç¹æ®ãªç¶æ³ã§ã¯ããã®ä»æ§ã¯ä¾¿å©ã§ããããã¾ãã
exec() ã eval() ã¸æ¸¡ãããã³ã¼ãã§ã¯ãå¼åºãå
ã®ã¯ã©ã¹åãç¾å¨ã®ã¯ã©ã¹ã¨è¦ãªããªããã¨ã«æ³¨æãã¦ãã ããããã®ä»æ§ã¯ global æã®å¹æã¨ä¼¼ã¦ããããã®å¹æãã¾ãåæ§ã«ããã¤ãã³ã³ãã¤ã«ãããã³ã¼ãã«å¶éããã¦ãã¾ããåãå¶ç´ã getattr() 㨠setattr() 㨠delattr() ã«ãé©ç¨ããã¾ããã¾ãã__dict__ ãç´æ¥åç
§ããã¨ãã«ãé©ç¨ããã¾ãã
9.7. æ®ãã®ã¯ãã°ã¶
Pascal ã® "ã¬ã³ã¼ã (record)" ããC è¨èªã® "æ§é ä½ (struct)" ã®ãããªãååã¤ãã®ãã¼ã¿è¦ç´ ãä¸ã¾ã¨ãã«ãããã¼ã¿åãããã¨ä¾¿å©ãªãã¨ãããã¾ããæ
£ç¨çãªææ³ã¨ãã¦ããã®ç®çã®ããã« dataclasses ã使ç¨ãã¾ãã
from dataclasses import dataclass
@dataclass
class Employee:
name: str
dept: str
salary: int
>>> john = Employee('john', 'computer lab', 1000)
>>> john.dept
'computer lab'
>>> john.salary
1000
ããç¹å®ã®æ½è±¡ãã¼ã¿åãè¦æ±ãã Python ã³ã¼ãã®æçã«ããã®ãã¼ã¿åã®ã¡ã½ãããã¨ãã¥ã¬ã¼ã·ã§ã³ããã¯ã©ã¹ã代ããã«æ¸¡ããã¨ãã§ãã¾ããä¾ãã°ããã¡ã¤ã«ãªãã¸ã§ã¯ãããä½ããã®ãã¼ã¿ãæ§ç¯ãã颿°ãããå ´åã read() 㨠readline() ãæã¤ã¯ã©ã¹ãå®ç¾©ãã¦ããã¡ã¤ã«ã§ã¯ãªãæååãããã¡ãããã¼ã¿ãåå¾ããããã«ãã¦ããã弿°ã¨ãã¦æ¸¡ããã¨ãã§ãã¾ãã
Instance method objects ã«ã屿§ãããã¾ãã m.__self__ ã¯ã¡ã½ãã m() ã®å±ãã¦ããã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã§ãm.__func__ ã¯ãã®ã¡ã½ããã«å¯¾å¿ãã function object ã§ãã
9.8. ã¤ãã¬ã¼ã¿ (iterator)¶
ãã§ã«æ°ã¥ãã¦ããã§ããããã for æã使ãã¨ã»ã¨ãã©ã®ã³ã³ãããªãã¸ã§ã¯ãã«ããã£ã¦ã«ã¼ããè¡ããã¨ãã§ãã¾ã:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
ããããè¦ç´ ã¸ã®ã¢ã¯ã»ã¹æ¹æ³ã¯æç¢ºã§ç°¡æ½ã§ä½¿ãæããã®ã§ããã¤ãã¬ã¼ã¿ã®æ´»ç¨ã¯ Python ã¸åºãè¡ã渡ããçµ±ä¸æãæããã¦ãã¾ããè£ã§ã¯ for æã¯ã³ã³ãããªãã¸ã§ã¯ãã«å¯¾ã㦠iter() 颿°ãå¼ãã§ãã¾ãã颿°ã¯ãã³ã³ããã®ä¸ã®è¦ç´ ã«1ã¤ãã¤ã¢ã¯ã»ã¹ãã __next__() ã¡ã½ãããå®ç¾©ããã¦ããã¤ãã¬ã¼ã¿ãªãã¸ã§ã¯ããè¿ãã¾ãããã以ä¸è¦ç´ ãç¡ãå ´åã¯ã __next__() ã¡ã½ãã㯠StopIteration ä¾å¤ãéåºãããã®éç¥ãåã for ã«ã¼ãã¯çµäºãã¾ããçµã¿è¾¼ã¿ã® next() 颿°ã使ã£ã¦ __next__() ã¡ã½ãããç´æ¥å¼ã¶ãã¨ãã§ãã¾ã; ãã®ä¾ã¯é¢æ°ãã©ãåãã®ãã示ãã¦ãã¾ã:
>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x10c90e650>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
ã¤ãã¬ã¼ã¿ãããã³ã«ã®è£ã«ããä»çµã¿ã観å¯ãã¦ããã°ãèªä½ã®ã¯ã©ã¹ã«ã¤ãã¬ã¼ã¿ã¨ãã¦ã®æ¯èãã追å ããã®ã¯ç°¡åã§ãã __next__() ã¡ã½ãããæã¤ãªãã¸ã§ã¯ããè¿ã __iter__() ã¡ã½ãããå®ç¾©ããã®ã§ããã¯ã©ã¹ã __next__() ã¡ã½ãããå®ç¾©ãã¦ããå ´åã __iter__() ã¡ã½ããã¯åã« self ãè¿ããã¨ãå¯è½ã§ã:
class Reverse:
"""ã·ã¼ã±ã³ã¹ãå¾ãããã¾ããã¤ãã¬ã¼ã¿."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>> rev = Reverse('spam')
>>> iter(rev)
<__main__.Reverse object at 0x00A1DB50>
>>> for char in rev:
... print(char)
...
m
a
p
s
9.9. ã¸ã§ãã¬ã¼ã¿ (generator)¶
ã¸ã§ãã¬ã¼ã¿ ã¯ãã¤ãã¬ã¼ã¿ã使ããããã®ç°¡æ½ã§å¼·åãªãã¼ã«ã§ããã¸ã§ãã¬ã¼ã¿ã¯é常ã®é¢æ°ã®ããã«æ¸ããã¾ãããä½ããã®ãã¼ã¿ãè¿ãã¨ãã«ã¯ yield æã使ãã¾ãããã®ã¸ã§ãã¬ã¼ã¿ã«å¯¾ã㦠next() ãå¼ã³åºããããã³ã«ãã¸ã§ãã¬ã¼ã¿ã¯ä»¥åã«ä¸æããå¦çãåéãã¾ã (ã¸ã§ãã¬ã¼ã¿ã¯ãå
¨ã¦ã®ãã¼ã¿å¤ã¨æå¾ã«ã©ã®æãå®è¡ãããããè¨æ¶ãã¦ãã¾ã)ã以ä¸ã®ä¾ãè¦ãã°ãã¸ã§ãã¬ã¼ã¿ãã¨ã¦ãç°¡åã«ä½æã§ãããã¨ããããã¾ã:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
>>> for char in reverse('golf'):
... print(char)
...
f
l
o
g
ã¸ã§ãã¬ã¼ã¿ã§ã§ãããã¨ã¯ãåã®ç¯ã§è§£èª¬ããã¯ã©ã¹ã使ã£ãã¤ãã¬ã¼ã¿ã§ãå®ç¾ã§ãã¾ããã¸ã§ãã¬ã¼ã¿ã®å®ç¾©ãã³ã³ãã¯ãã«ãªãã®ã¯ __iter__() ã¡ã½ãã㨠__next__() ã¡ã½ãããèªåã§ä½æãããããã§ãã
ã¸ã§ãã¬ã¼ã¿ã®ããä¸ã¤ã®éè¦ãªæ©è½ã¯ãå¼ã³åºããã¨ã«ãã¼ã«ã«å¤æ°ã¨å®è¡ç¶æ
ãèªåçã«ä¿åãããã¨ãããã¨ã§ããããã«ããã self.index ã self.data ã¨ãã£ãã¤ã³ã¹ã¿ã³ã¹å¤æ°ã使ã£ãã¢ããã¼ããããç°¡åã«é¢æ°ãæ¸ããã¨ãã§ããããã«ãªãã¾ãã
ã¡ã½ãããèªåçæãããããã°ã©ã ã®å®è¡ç¶æ
ãèªåä¿åããã»ãã«ãã¸ã§ãã¬ã¼ã¿ã¯çµäºæã«èªåçã« StopIteration ãéåºãã¾ãããããã®æ©è½ãçµã¿åãããã¨ãé常ã®é¢æ°ãæ¸ãã®ã¨åãå´åã§ãç°¡åã«ã¤ãã¬ã¼ã¿ãçæã§ãã¾ãã
9.10. ã¸ã§ãã¬ã¼ã¿å¼Â¶
åç´ãªã¸ã§ãã¬ã¼ã¿ãªãå¼ã¨ãã¦ç°¡æ½ã«ã³ã¼ãã£ã³ã°ã§ãã¾ãã ãã®å¼ã¯ãªã¹ãå å 表è¨ã«ä¼¼ãæ§æã使ãã¾ãããè§æ¬å¼§ã§ã¯ãªã丸æ¬å¼§ã§å²ãã¾ãã ã¸ã§ãã¬ã¼ã¿å¼ã¯ã颿°ã®ä¸ã§ã¸ã§ãã¬ã¼ã¿ãããã«ä½¿ããããããªç¶æ³ã®ããã«ç¨æããã¦ãã¾ãã ã¸ã§ãã¬ã¼ã¿å¼ã¯å®å ¨ãªã¸ã§ãã¬ã¼ã¿ã®å®ç¾©ããã³ã³ãã¯ãã§ãããã¡ãã£ã¨èéã®å¹ããªãã¨ãããããã¾ãã åãå 容ãè¿ããªã¹ãå å 表è¨ããã¯ã¡ã¢ãªã«åªãããã¨ãå¤ãã¨ããå©ç¹ãããã¾ãã
ä¾:
>>> sum(i*i for i in range(10)) # å¹³æ¹å
285
>>> xvec = [10, 20, 30]
>>> yvec = [7, 5, 3]
>>> sum(x*y for x,y in zip(xvec, yvec)) # ãããç©
260
>>> unique_words = set(word for line in page for word in line.split())
>>> valedictorian = max((student.gpa, student.name) for student in graduates)
>>> data = 'golf'
>>> list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
èæ³¨