颿°åããã°ã©ãã³ã° HOWTO¶
- Author:
A. M. Kuchling
- Release:
0.32
ãã®ææžã§ã¯ã颿°åã¹ã¿ã€ã«ã§ããã°ã©ã ãå®è£
ããã®ã«ããã¿ãªãª Python ã®æ©èœãèŠãŠãŸããããšã«ããŸãããããŸã颿°åããã°ã©ãã³ã°ãšããæŠå¿µã玹ä»ããããšã iterator ã generator ã®ãããªèšèªæ©èœãããã³ itertools ã functools ãšãã£ãé¢é£ããã©ã€ãã©ãªã¢ãžã¥ãŒã«ãèŠãããšã«ããŸãã
ã¯ããã«Â¶
ãã®ç« ã¯é¢æ°åããã°ã©ãã³ã°ã®åºæ¬æŠå¿µã説æããŸã; Python ã®èšèªæ©èœã«ã€ããŠã ãç¥ããã人ã¯ã次ã®ç« ã® ã€ãã¬ãŒã¿ (iterator) ãŸã§é£ã°ããŠãã ããã
ããã°ã©ãã³ã°èšèªãšã¯åé¡ãåè§£ãããã®ã§ãããåèšèªããµããŒãããåè§£æ¹æ³ã«ã¯ããã€ãã®çš®é¡ããããŸã:
ã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã¯ æç¶ãå ã§ã: ããã°ã©ã ã¯ãå ¥åã«å¯ŸããŠè¡ãã¹ãããšãã³ã³ãã¥ãŒã¿ã«æããæç€ºãªã¹ããšãªããŸãã C, Pascal, ããã«ã¯ Unix ã·ã§ã«ãŸã§ããæç¶ãåèšèªã«å ¥ããŸãã
宣èšå èšèªã§æžãã®ã¯ãè§£ãã¹ãåé¡ã説æãã仿§æžã§ãã£ãŠããããå¹ççã«èšç®åŠçããæ¹æ³ãèŠä»ããã®ã¯èšèªå®è£ ã®åœ¹ç®ã§ããSQL ã¯ããããäžçªããç¥ããã宣èšåèšèªã§ã; SQL ã®ã¯ãšãªã¯ååŸãããããŒã¿ã»ããã説æããŠããã ãã§ãããŒãã«ãèµ°æ»ãããã€ã³ããã¯ã¹ã䜿ãããã©ã®ãµãã¯ããŒãºããå®è¡ãããçã ãæ±ºããã®ã¯ SQL ãšã³ãžã³ãªã®ã§ãã
ãªããžã§ã¯ãæå ããã°ã©ã ã¯ãªããžã§ã¯ãã®éãŸããæäœããŸãããªããžã§ã¯ãã«ã¯å éšç¶æ ãããããã®ç¶æ ã調ã¹ããè²ã ãšå€æŽãããããããã®ã¡ãœããããããŸããSmalltalk ã Java ã¯ãªããžã§ã¯ãæåèšèªã§ãã C++ ãš Python ã¯ãªããžã§ã¯ãæåããã°ã©ãã³ã°ããµããŒãããŠããŸãããé¢é£ããæ©èœã䜿ããªããŠãæ§ããªãããã«ãªã£ãŠããŸãã
颿°å ããã°ã©ãã³ã°ã¯åé¡ãããã€ãã®é¢æ°ã«ãããŠèããŸããçæ³çã«èšããšã颿°ã¯å ¥åãåããŠåºåãåãã ãã§ãåãå ¥åã«å¯ŸããŠç°ãªãåºåããããããªå éšç¶æ ãäžåæã¡ãŸãããæåãªé¢æ°åèšèªã«ã¯ ML äžå®¶ (Standard ML, OCaml çã ) ãš Haskell ããããŸãã
èšèšè ãç¹å®ã®ã¢ãããŒãã匷調ããããšã«ããèšèªããããŸããããããããšå€§æµã¯ãå¥ã®ã¢ãããŒãã䜿ãããã°ã©ã ãæžãã«ãããªããŸããè€æ°ã®ã¢ãããŒãã«å¯Ÿå¿ããèšèªããããLisp, C++, Python ã¯ãããããã«ããã©ãã€ã èšèªã§ã; ãã®äžã®ã©ãã䜿ã£ãŠããåºæ¬çã«æç¶ãåãªããŸãã¯åºæ¬çã«ãªããžã§ã¯ãæåãªããšããåºæ¬çã«é¢æ°åãªããã°ã©ã ãã©ã€ãã©ãªãæžãããšãã§ããŸãã倧ããªããã°ã©ã ã§ã¯ãåéšã§å¥ã ã®ã¢ãããŒãã䜿ã£ãŠæžãããšããããããããŸãã; GUI ã¯ãªããžã§ã¯ãæåã§ãã§ãåŠçããžãã¯ã¯æç¶ãåã颿°åã§ããšãã£ãããã«ã§ãã
颿°åããã°ã©ã ã§ã¯ãå ¥åã¯äžé£ã®é¢æ°ãéã£ãŠæµããŠãããŸããããããã®é¢æ°ã¯å ¥åã«äœããã®äœæ¥ãããŠåºåããŸãã颿°åã¹ã¿ã€ã«ã«ãããŠã¯ãå éšç¶æ ãå€ããŠããŸã£ãããè¿ãå€ã«çŸããªã倿Žãããããšãã£ãå¯äœçšã®ãã颿°ã¯ãããããã«èšãããŠããŸããå¯äœçšã®ãŸã£ãããªã颿°ã¯ çŽç²é¢æ°å ã§ãããšãããŸããå¯äœçšããªãããšããããšã¯ãããã°ã©ã ã®å®è¡äžã«é 次å€åããŠããããŒã¿æ§é ãæããªããã€ãŸãå颿°ã®åºåã¯ãã®å ¥åã«ãã圱é¿ãåããŠã¯ãããªããšããããšã§ãã
ããèšèªã§ã¯çŽç²ãã«ãšãŠãå³ãã a=3 ã c = a + b ã®ãããªä»£å
¥æããååšããªãã»ã©ã§ãããç»é¢ãžã®è¡šç€ºããã£ã¹ã¯ãã¡ã€ã«ãžã®æžã蟌ã¿ãªã©ããã¹ãŠã®å¯äœçšãé¿ããã®ã¯é£ããã§ããå¥ã®äŸãšããŠã print() ã time.sleep() 颿°ã®åŒã³åºãããããŸãããã©ã¡ããæçšãªå€ãè¿ããŸãããç»é¢ã«ããã¹ããéã£ãããå®è¡ã 1 ç§éåããããšãã£ãå¯äœçšã®ããã ãã«åŒã°ããã®ã§ãã
颿°åã¹ã¿ã€ã«ã§æžãã Python ããã°ã©ã ã¯ãµã€ããI/O ãä»£å ¥ãå®å šã«ãªãããšãã£ã極端ãªãšãããŸã§ã¯è¡ããã«ã颿°åã£ãœãèŠããã€ã³ã¿ãŒãã§ãŒã¹ãæäŸãã€ã€ãå éšã§ã¯é颿°åã®æ©èœã䜿ããŸããããšãã°ã颿°å ã§ããŒã«ã«å€æ°ã®ä»£å ¥ã¯äœ¿ããŸãããã°ããŒãã«å€æ°ã¯å€æŽãããä»ã®å¯äœçšããªãããã«å®è£ ããã®ã§ãã
颿°åããã°ã©ãã³ã°ã¯ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®å察ãšèããããšãã§ããŸãããªããžã§ã¯ãæåã«ãããŠããªããžã§ã¯ãã¯å éšç¶æ ãšããã倿Žããã¡ãœããã³ãŒã«ã®å ¥ã£ãã«ãã»ã«ã§ãããããã°ã©ã ã¯ãã®ç¶æ ã驿£ã«å€åãããŠããæé ã§ããäžæ¹ã§ã颿°åããã°ã©ãã³ã°ã¯å¯èœãªãããç¶æ ã®å€æŽãé¿ãã颿°ã©ããã®éãæµããããŒã¿ã ããæ±ãããšããŸããPython ã§ã¯ãã®äºã€ã®ã¢ãããŒããçµã³åãããããšãã§ããŸããã¢ããªã±ãŒã·ã§ã³å ã®ãªããžã§ã¯ã (ã¡ãŒã«ããã©ã³ã¶ã¯ã·ã§ã³ãçã ) ã衚çŸããã€ã³ã¹ã¿ã³ã¹ãã颿°ãåãæž¡ãããããã«ããã®ã§ãã
颿°åãã¶ã€ã³ã¯ãããã®ããããªãå¶çŽã«èŠãããããããŸãããã©ãããŠãªããžã§ã¯ããå¯äœçšããªãã»ããè¯ãã®ã§ãããããå®ã¯ã颿°åã¹ã¿ã€ã«ã«ã¯çè«ãšå®è·µã«åºã¥ã次ã®å©ç¹ãããã®ã§ã:
圢åŒç蚌æå¯èœæ§ã
ã¢ãžã¥ã©ãŒæ§ã
çµåæ§ã
ãããã°ããã¹ãã®ç°¡åãã
圢åŒç蚌æå¯èœæ§Â¶
çè«é¢ã®å©ç¹ãšããŠã¯ãããã°ã©ã ãæ£ããããšã®æ°åŠç蚌æãä»ããç°¡åã«æ§ç¯ã§ãããšããç¹ããããŸãã
ç ç©¶è ãã¡ã¯é·ãããã ãããã°ã©ã ãæ£ããããšãæ°åŠçã«èšŒæããæ¹æ³ã®çºèŠã«è¡éããããŠããŸãããããã¯ãè²ã ãªå ¥åã§ãã¹ãããŠåºåãæ£ããã£ããããŸãæ£ããã ããããšçµè«ããã®ãšãéããŸããããœãŒã¹ã³ãŒããèªãã§ãééãã¯ãªãããã ããšèšãã®ãšãå¥ã®è©±ã§ã; ç®æãã®ã¯ãåºçŸãããå ¥åãã¹ãŠã«å¯ŸããŠããã°ã©ã ãæ£ããçµæãåºãããšã®å³å¯ãªèšŒæãªã®ã§ãã
ããã°ã©ã ã蚌æããããã«äœ¿ãããŠããã®ã¯ äžå€åŒ ãæžãåºããŠãããšãããã¯ããã¯ã§ãäžå€åŒãšã¯å ¥åããŒã¿ãããã°ã©ã 倿°ã®ãã¡åžžã«çã§ããæ§è³ªã®ããšã§ããã³ãŒãã®äžè¡äžè¡ã§ã å®è¡å ã®äžå€åŒ X ãš Y ãçãªã å®è¡åŸã« ã¡ãã£ãšéãäžå€åŒ X' ãš Y' ãçã«ãªãããšã瀺ããŠããããããããã°ã©ã ã®çµãããŸã§ç¶ããããã§ãããããšæçµçãªäžå€åŒã¯ããã°ã©ã ã®åºåã«åã£ãæ¡ä»¶ã«ãªã£ãŠããã¯ãã§ãã
颿°åããã°ã©ãã³ã°ãä»£å ¥ãå«ãã®ã¯ããã®äžå€åŒãã¯ããã¯ã§ã¯ä»£å ¥ãæ±ãã«ããããã§ã; ä»£å ¥ã¯ããããŸã§çã ã£ãäžå€åŒãå£ããŠãããŠãèªåã¯æ¬¡ã®è¡ã«äŒããŠãããäžå€åŒãçã¿åºããªãããšãããã®ã§ãã
æ®å¿µãªãããããã°ã©ã ã®èšŒæã¯ã ãããå®éçã§ããããŸããããPython ãœãããŠã§ã¢ã«ãé¢ä¿ãããŸãããæ¬åœã«ç°¡åãªããã°ã©ã ã§ãã蚌æã«ã¯æ°ããŒãžã«ãããè«æãå¿ èŠãªã®ã§ã; ããçšåºŠã®è€éãªããã°ã©ã ã§ã¯ããå°åžžã§ãªãé·ãã«ãªã£ãŠããŸãã®ã§ãæ¥åžžã§äœ¿ã£ãŠããããã°ã©ã (Python ã€ã³ã¿ããªã¿ãXML ããŒãµããŠã§ããã©ãŠã¶) ã¯ã»ãšãã©ããããã¯ãã¹ãŠãæ£ããã蚌æããã®ã¯äžå¯èœã§ããããä»®ã«èšŒæãæžãåºãããçæãããããŠãããã®èšŒæãæ€èšŒããããã®çããæ®ããŸã; 蚌æã«ééãããããããããããã®å Žåã¯èšŒæãããšèªåã§åæã«æã蟌ãã§ããã ãã«ãªãã®ã§ãã
ã¢ãžã¥ã©ãŒæ§Â¶
ããå®çšçã«ã¯ã颿°åããã°ã©ãã³ã°ããããšåé¡ã现ããåãåããããšã«ãªããšããå©ç¹ããããŸããçµæãšããŠããã°ã©ã ã¯ã¢ãžã¥ã©ãŒåãããŸããè€éãªå€åœ¢ãæœã倧ããªé¢æ°ãæžããããäžã€ã®ããšã«çµã£ãŠããã ããããå°ããªé¢æ°ã®ã»ããæžãããããã®ã§ããããã«ãå°ããã»ããèªãã®ããšã©ãŒããã§ãã¯ããã®ãç°¡åã§ãã
ãããã°ããã¹ãã®ç°¡åã¶
ãã¹ãããããã°ã颿°åããã°ã©ã ãªãç°¡åã§ãã
颿°ãäžè¬çã«å°ãããŠæç¢ºã«æå³ä»ããããŠããã®ã§ããããã°æ¹æ³ã¯åçŽã§ããããã°ã©ã ãæ£ããåããªããšãã«ã¯ã颿°ã²ãšã€ã²ãšã€ãããŒã¿ã®æ£ããããã§ãã¯ãããã€ã³ãã«ãªãã®ã§ãããããã®æç¹ã«ãããå ¥åãšåºåãèŠãŠããã°ããã°ã®åå ãšãªã颿°ãçŽ æ©ãåãåºãããšãã§ããã®ã§ãã
ã²ãšã€ã²ãšã€ã®é¢æ°ããŠããããã¹ãã®å¯Ÿè±¡ã«ãªãåŸãããã§ãããããã¹ããç°¡åã§ãã颿°ã¯ã·ã¹ãã ã®ç¶æ ã«äŸåããŸããã®ã§ããã¹ãã®å®è¡åã«ããããç¶æ ãåçŸããå¿ èŠã¯ãããŸãã; åã«é©åãªå ¥åãåæããŠãåºåãæåŸ ã©ãããã©ãããã§ãã¯ããã ãã§è¯ãã®ã§ãã
çµåæ§Â¶
颿°åã¹ã¿ã€ã«ã®ããã°ã©ã ãäœã£ãŠãããšãè²ã ãªå ¥åãåºåã®ããã«è²ã ãªé¢æ°ãæžãããšã«ãªããŸãã仿¹ãªãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«ç¹åãã颿°ãæžãããšãããã§ãããããã©ãåºç¯ãªããã°ã©ã ã«äœ¿ãã颿°ãããããšã§ããããããšãã°ããã£ã¬ã¯ããªåãåãåã£ãŠãã®äžã® XML ãã¡ã€ã«äžèЧãè¿ã颿°ãããã¡ã€ã«åãåãåã£ãŠå 容ãè¿ã颿°ãªã©ã¯ã倿§ãªå Žé¢ã«é©çšã§ãããã§ãã
æãã€ãã¡ã«èªåã®ç¹è£œã©ã€ãã©ãªããŠãŒãã£ãªãã£ãå å®ããŠãããšãæ°ããããã°ã©ã ããæ¢åã®é¢æ°ã調æŽããŠå°ãä»åã«ç¹åãã颿°ãæžãã ãã§çµã¿ç«ãŠãããããã«ãªããŸãã
ã€ãã¬ãŒã¿ (iterator)¶
ãŸãã¯é¢æ°åã¹ã¿ã€ã«ã®ããã°ã©ã ãæžãéã®åºç€ãšãªãéèŠãª Python æ©èœããèŠãŠãããŸããã: ã€ãã¬ãŒã¿ã§ãã
ã€ãã¬ãŒã¿ã¯é£ç¶ããŒã¿ã衚çŸãããªããžã§ã¯ãã§ã; ãã®ãªããžã§ã¯ãã¯äžåºŠã«äžã€ã®èŠçŽ ãã€ããŒã¿ãè¿ããŸãã Python ã®ã€ãã¬ãŒã¿ã¯ __next__() ãšãããåŒæ°ãåããæ¬¡ã®èŠçŽ ãè¿ãã¡ãœãããå¿
ããµããŒãããŠããŸããããŒã¿ã¹ããªãŒã ã«èŠçŽ ãæ®ã£ãŠããªãå Žåã __next__() ã¯å¿
ã StopIteration äŸå€ãåºããŸãããã ããã€ãã¬ãŒã¿ã®é·ãã¯æéã§ããå¿
èŠã¯ãããŸãã; ç¡éã®ã¹ããªãŒã ãçæããã€ãã¬ãŒã¿ãæžããšããã®ããŸã£ããçã«é©ã£ãããšã§ãã
ãã«ãã€ã³ã® iter() 颿°ã¯ä»»æã®ãªããžã§ã¯ããåããŠã ãã®äžèº«ãèŠçŽ ãè¿ãã€ãã¬ãŒã¿ãè¿ãããšããŸããåŒæ°ã®ãªããžã§ã¯ãã ã€ãã¬ãŒã¿ãäœããªããšã㯠TypeError ãæããŸããPython ã® ãã«ãã€ã³ãªããŒã¿åã«ãããã€ãã€ãã¬ãŒã¿åã®ã§ãããã®ãããã äžã§ããã䜿ãããã®ã¯ãªã¹ããšèŸæžã§ããã€ãã¬ãŒã¿ãäœãã ãªããžã§ã¯ã㯠iterable ãªããžã§ã¯ããšåŒã°ããŸãã
æãåãããŠã€ãã¬ãŒã¿åã®å®éšãããŠã¿ãŸããã:
>>> L = [1, 2, 3]
>>> it = iter(L)
>>> it
<...iterator object at ...>
>>> it.__next__() # same as next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
Python ã¯è²ã
ãªæèã§ã€ãã©ãã«ãªãªããžã§ã¯ããæåŸ
ããŸããã æãéèŠãªã®ã¯ for æã§ãã for X in Y ãšããæã® Y ã¯ã ã€ãã¬ãŒã¿ããããã㯠iter() ã§ã€ãã¬ãŒã¿ãäœãããªããžã§ã¯ãã§ããå¿
èŠããããŸããæ¬¡ã®äºã€ã¯åãæå³ã«ãªããŸã:
for i in iter(obj):
print(i)
for i in obj:
print(i)
ã€ãã¬ãŒã¿ã¯ list() ã tuple() ãšãã£ãã³ã³ã¹ãã©ã¯ã¿é¢æ°ã䜿ã£ãŠãªã¹ããã¿ãã«ã«å
·çŸåããããšãã§ããŸã:
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
ã·ãŒã±ã³ã¹ã®ã¢ã³ããã¯ãã€ãã¬ãŒã¿ã«å¯Ÿå¿ããŠããŸã: ã€ãã¬ãŒã¿ã N åã®èŠçŽ ãè¿ããšããããšãäºåã«ããã£ãŠããã°ãN-ã¿ãã«ã«ã¢ã³ããã¯ããããšãã§ããŸã:
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
ãã«ãã€ã³é¢æ°ã® max() ã min() ãªã©ããã€ãã¬ãŒã¿äžã€ã ããåŒæ°ã«åã£ãŠæå€§ã»æå°ã®èŠçŽ ãè¿ãããšãã§ããŸãã "in" ã "not in" æŒç®åãã€ãã¬ãŒã¿ã«å¯Ÿå¿ããŠããŸã: X in iterator ã¯ããã®ã€ãã¬ãŒã¿ããè¿ãã¹ããªãŒã ã« X ãããã°çã§ããã§ãããã€ãã¬ãŒã¿ãç¡éé·ã ãšãåœç¶ãªããåé¡ã«çŽé¢ããŸã; max(), min() ã¯ãã€ãŸã§ãæ»ã£ãŠæ¥ãŸãããã èŠçŽ X ãã¹ããªãŒã ã«åºãŠããªããã° "in", "not in" ãªãã¬ãŒã¿ãæ»ããŸããã
ã€ãã¬ãŒã¿ã¯æ¬¡ã«é²ãããšããã§ããŸããã®ã§ã泚æãã ãã; åã®èŠçŽ ãæã«å
¥ããããã€ãã¬ãŒã¿ããªã»ããããããã³ããŒãäœã£ããããæ¹æ³ã¯ãããŸãããã€ãã¬ãŒã¿ããªããžã§ã¯ããšããŠããããè¿œå æ©èœã æã€ããšã¯ã§ããŸããããããã³ã«ã§ã¯ __next__() ã¡ãœããã®ããšããæå®ãããŠããŸãããã§ããã颿°ã¯ã€ãã¬ãŒã¿ã®åºåã䜿ãå°œãã㊠ããŸããããããŸããããåãã¹ããªãŒã ã«äœãå¥ã®ããšããã å¿
èŠããããªãæ°ããã€ãã¬ãŒã¿ãäœããªããŠã¯ãããŸããã
ã€ãã¬ãŒã¿å¯Ÿå¿ã®ããŒã¿å¶
ãªã¹ããã¿ãã«ãã€ãã¬ãŒã¿ã«å¯Ÿå¿ããŠããæ¹æ³ã«ã€ããŠã¯æ¢ã«èŠãŸããããå®ã®ãšãã Python ã®ã·ãŒã±ã³ã¹åã¯ã©ãã§ããããšãã°æååãªã©ããèªåã§ã€ãã¬ãŒã¿çæã«å¯Ÿå¿ããŠããŸãã
èŸæžã«å¯Ÿã㊠iter() ãããšãèŸæžã®ããŒã§ã«ãŒããåãã€ãã¬ãŒã¿ãè¿ãããŸã:
>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
... 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
... print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
Python 3.7 ãããèŸæžã®å埩é åºã¯æ¿å ¥é åºãšåãã§ããããšãä¿èšŒãããŠããããšã«æ³šæããŠãã ããã 以åã®ããŒãžã§ã³ã§ã¯ããã®æ¯ãèãã¯ä»æ§ãå®ããããŠããããå®è£ ããšã«ç°ãªãããšããããŸããã
èŸæžã¯ iter() ãé©çšãããšããŒã§ã«ãŒããåããŸãããèŸæžã«ã¯ä»ã®ã€ãã¬ãŒã¿ãè¿ãã¡ãœããããããŸããæç€ºçã«å€ããããã¯ããŒãšå€ã®ãã¢ã§ã€ãã¬ãŒãããããã°ãvalues(), items() ãšããã¡ãœããã§ã€ãã¬ãŒã¿ãäœãããšãã§ããŸãã
éã« dict() ã³ã³ã¹ãã©ã¯ã¿ã¯ãæé㪠(key, value) ã¿ãã«ã®ã¹ããªãŒã ãè¿ãã€ãã¬ãŒã¿ãåãå
¥ããããšãã§ããŸã:
>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
ãã¡ã€ã«ããæåŸã®è¡ãŸã§ readline() ã¡ãœãããåŒãã§ããããšã§ã€ãã¬ãŒã¿åã«å¯Ÿå¿ããŠããŸããã€ãŸããããã£ãŠãã¡ã€ã«ã®åè¡ãèªãã§ããããšãã§ããããã§ã:
for line in file:
# do something for each line
...
ã»ããã¯ã€ãã©ãã«ãåãåããŸããããã®ã»ããã®èŠçŽ ã§ã€ãã¬ãŒãããããšãã§ããŸã:
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
... print(i)
2
3
5
7
11
13
ãžã§ãã¬ãŒã¿åŒãšãªã¹ãå å 衚èšÂ¶
ã€ãã¬ãŒã¿ã®åºåã«å¯ŸããŠãã䜿ãæäœããã 2 ã¯ã(1) ã²ãšã€ãã€å šèŠçŽ ã«æäœãå®è¡ãããããã³ (2) æ¡ä»¶ã«åãèŠçŽ ã§ãµãã»ãããäœããã§ããããšãã°æååã®ãªã¹ããªããåè¡ã®ãããã«ä»ããéªéãªãã¯ã€ãã¹ããŒã¹ãåããããšããç¹å®ã®æååãå«ãéšåãããã¯ã¢ããããããªã©ãšæããããããŸããã
ãªã¹ãå å 衚èšãšãžã§ãã¬ãŒã¿åŒ (ç¥ããŠãlistcompããšãgenexpã) ã¯ãããããæäœåãã®ç°¡æœãªè¡šè𿹿³ã§ããããã¯é¢æ°åããã°ã©ãã³ã°èšèª Haskell (https://www.haskell.org/) ã«ã€ã³ã¹ãã€ã¢ãããŸãããæååã®ã¹ããªãŒã ãããã¯ã€ãã¹ããŒã¹ããã¹ãŠåãã®ã¯æ¬¡ã®ã³ãŒãã§ã§ããŸã:
>>> line_list = [' line 1\n', 'line 2 \n', ' \n', '']
>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)
>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]
ç¹å®ã®èŠçŽ ã ããéžã³åºãã®ã¯ "if" æ¡ä»¶åŒãä»ããããšã§å¯èœã§ã:
>>> stripped_list = [line.strip() for line in line_list
... if line != ""]
ãªã¹ãå
å
衚èšã䜿ããš Python ãªã¹ããè¿ã£ãŠæ¥ãŸã; stripped_list ã¯å®è¡çµæã®è¡ãå
¥ã£ããªã¹ãã§ãã£ãŠãã€ãã¬ãŒã¿ã§ã¯ãããŸããããžã§ãã¬ãŒã¿åŒã¯ã€ãã¬ãŒã¿ãè¿ããããã ãšå¿
èŠã«å¿ããŠã ãå€ãç®åºããŸãã®ã§ããã¹ãŠã®å€ãäžåºŠã«åºãå¿
èŠããããŸãããã€ãŸããªã¹ãå
å
衚èšã®ã»ãã¯ãç¡éé·ã¹ããªãŒã ãèšå€§ãªããŒã¿ãè¿ããããªã€ãã¬ãŒã¿ãæ±ãéã«ã¯ãããŸã圹ã«ç«ããªããšããããšã§ãããããã£ãç¶æ³ã§ã¯ãžã§ãã¬ãŒã¿åŒã®ã»ãã奜ãŸãããšèšããŸãã
ãžã§ãã¬ãŒã¿åŒã¯äžžæ¬åŒ§ "()" ã§å²ãŸãããªã¹ãå å 衚èšã¯è§æ¬åŒ§ "[]" ã§å²ãŸããŸãããžã§ãã¬ãŒã¿åŒã®åœ¢åŒã¯æ¬¡ã®ãšããã§ã:
( expression for expr in sequence1
if condition1
for expr2 in sequence2
if condition2
for expr3 in sequence3
...
if condition3
for exprN in sequenceN
if conditionN )
ãªã¹ãå å 衚èšããå€åŽã®æ¬åŒ§ãéãã ã (äžžã§ã¯ãªãè§æ¬åŒ§) ã§ãããšã¯åãã§ãã
çæãããåºå㯠expression éšåã®å€ãèŠçŽ ãšããŠäžŠã¹ããã®ã«ãªããŸãã if ç¯ã¯ãã¹ãŠããªããŠã倧äžå€«ã§ã; ããã° condition ãçã®ãšãã ã expression ãè©äŸ¡ãããŠåºåã«è¿œå ãããŸãã
ãžã§ãã¬ãŒã¿åŒã¯åžžã«æ¬åŒ§ã®äžã«æžããªããã°ãªããŸãããã颿°ã³ãŒã«ã®ç®å°ã«ãªã£ãŠããæ¬åŒ§ã§ã倧äžå€«ã§ãã颿°ã«ããæž¡ãã€ãã¬ãŒã¿ãäœããããã°ããæžããã®ã§ã:
obj_total = sum(obj.count for obj in list_all_objects())
for...in ç¯ã¯è€æ°ã€ãªããããŸãããã©ãã«ããã€ãã¬ãŒãããããã®ã·ãŒã±ã³ã¹ãå«ãŸããŠããŸãããããã®ã·ãŒã±ã³ã¹ã¯äžŠè¡ã㊠ã§ã¯ãªã ãå·Šããå³ãžé çªã«ã€ãã¬ãŒããããã®ã§ãé·ããåãã§ããå¿
èŠã¯ãããŸããã sequence1 ã®åèŠçŽ ããšã«æ¯åæåãã sequence2 ãã«ãŒãã§åãã®ã§ãããã®åŸ sequence1 ãš sequence2 ããåºãèŠçŽ ãã¢ããšã«ã sequence3 ã§ã«ãŒãããŸãã
å¥ã®æžãæ¹ããããšããªã¹ãå å 衚èšããžã§ãã¬ãŒã¿åŒã¯æ¬¡ã® Python ã³ãŒããšåãæå³ã«ãªããŸã:
for expr1 in sequence1:
if not (condition1):
continue # Skip this element
for expr2 in sequence2:
if not (condition2):
continue # Skip this element
...
for exprN in sequenceN:
if not (conditionN):
continue # Skip this element
# Output the value of
# the expression.
ã€ãŸããè€æ°ã® for...in ç¯ããã£ãŠ if ããªããšãã®æçµåºåã¯ãé·ããåã·ãŒã±ã³ã¹é·ã®ç©ã«çãããªããšããããšã§ããé·ã 3 ã®ãªã¹ãäºã€ãªããåºåãªã¹ãã®é·ã㯠9 èŠçŽ ã§ã:
>>> seq1 = 'abc'
>>> seq2 = (1, 2, 3)
>>> [(x, y) for x in seq1 for y in seq2]
[('a', 1), ('a', 2), ('a', 3),
('b', 1), ('b', 2), ('b', 3),
('c', 1), ('c', 2), ('c', 3)]
Python ã®ææ³ã«ææ§ããçŽã蟌ãŸããªãããã«ã expression ã§ã¿ãã«ãäœããªãæ¬åŒ§ã§å²ããªããŠã¯ãªããŸãããäžã«ãããªã¹ãå
å
衚èšã§ãæåã®ã¯æ§æãšã©ãŒã§ãããäºçªç®ã¯æå¹ã§ã:
# Syntax error
[x, y for x in seq1 for y in seq2]
# Correct
[(x, y) for x in seq1 for y in seq2]
ãžã§ãã¬ãŒã¿ (generator)¶
ãžã§ãã¬ãŒã¿ã¯ãã€ãã¬ãŒã¿ãæžãäœæ¥ãç°¡åã«ãããç¹æ®ãªé¢æ°ã§ããæšæºçãªé¢æ°ã¯å€ãèšç®ããŠè¿ããŸããããžã§ãã¬ãŒã¿ãè¿ãã®ã¯ãäžé£ã®å€ãè¿ãã€ãã¬ãŒã¿ã§ãã
Python ã C ã®æšæºçãªé¢æ°ã³ãŒã«ã«ã€ããŠã¯ããããåãã«éããããŸããã颿°ãåŒã¶ãšãããŒã«ã«å€æ°ãäœããã©ã€ããŒããªåå空éãã§ããŸããããã®é¢æ°ã return æãŸã§æ¥ããšãããŒã«ã«å€æ°ãç Žå£ãããŠãããè¿ãå€ãåŒã³åºãå
ã«è¿ããŸããæ¬¡ã«åã颿°ãããäžåºŠåŒã¶ãšãæ°ãããã©ã€ããŒãåå空éã«æ°èŠã®ããŒã«ã«å€æ°ãäœãããã®ã§ãããããã颿°ãåºããšãã«ããŒã«ã«å€æ°ãæšãŠãªããã°ã©ããªãã§ããããããã®åºãŠãã£ããšãããã颿°ãç¶è¡ã§ãããšããããã©ãã§ãããããããããžã§ãã¬ãŒã¿ãæäŸããæ©èœã§ã; ããªãã¡ããžã§ãã¬ãŒã¿ã¯ç¶è¡ã§ãã颿°ãšèããããšãã§ããŸãã
ããåçŽãªãžã§ãã¬ãŒã¿é¢æ°ã®äŸããã¡ãã«ãããŸã:
>>> def generate_ints(N):
... for i in range(N):
... yield i
yield ããŒã¯ãŒããå«ã颿°ã¯ãã¹ãŠãžã§ãã¬ãŒã¿é¢æ°ã§ã; Python ã® bytecode ã³ã³ãã€ã©ããããæ€åºããŠãç¹å¥ãªæ¹æ³ã§ã³ã³ãã€ã«ããŠãããã®ã§ãã
ãžã§ãã¬ãŒã¿é¢æ°ã¯ãåŒã°ãããšãã«äžåã ãå€ãè¿ãã®ã§ã¯ãªããã€ãã¬ãŒã¿ ãããã³ã«ã«å¯Ÿå¿ãããªããžã§ã¯ããè¿ããŸããäžã®äŸã§ yield ãå®è¡ãããšãã ãžã§ãã¬ãŒã¿ã¯ return æã®ããã«ã㊠i ã®å€ãåºåããŸãã yield ãš return æã®å€§ããªéãã¯ã yield ã«å°éããæ®µéã§ãžã§ãã¬ãŒã¿ã®å®è¡ç¶æ
ãäžæåæ¢ã«ãªã£ãŠãããŒã«ã«å€æ°ãä¿åãããç¹ã§ãã æ¬¡åãã®ãžã§ãã¬ãŒã¿ã® __next__() ãåŒã¶ãšããããã颿°ãå®è¡ãåéããŸãã
äžèš generate_ints() ãžã§ãã¬ãŒã¿ã®äœ¿çšäŸã¯ãã¡ãã§ã:
>>> gen = generate_ints(3)
>>> gen
<generator object generate_ints at ...>
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
File "stdin", line 1, in <module>
File "stdin", line 2, in generate_ints
StopIteration
åãã for i in generate_ints(5) ã a, b, c = generate_ints(3) ãšãã£ãæžãæ¹ãã§ããŸãã
ãžã§ãã¬ãŒã¿é¢æ°ã®äžã§ã¯ãreturn value 㯠__next__() ã¡ãœããããéåºããã StopIteration(value) ãåŒãèµ·ãããŸãããããçºçããå Žåãã颿°ã®çµããã«å°éããå Žåã¯ãå€ã®çæãçµäºããŠãžã§ãã¬ãŒã¿ãŒããã以äžã®å€ãè¿ããªãã
èªåã§ã¯ã©ã¹ãæžããŠããžã§ãã¬ãŒã¿ã§èšããšããã®ããŒã«ã«å€æ°ãã€ã³ã¹ã¿ã³ã¹å€æ°ãšããŠå
šéšä¿ç®¡ããŠããã°ãåã广ãåŸãããšã¯å¯èœã§ããããšãã°æŽæ°ã®ãªã¹ããè¿ãã®ã¯ã self.count ã 0 ã«ããŠã __next__() ã¡ãœããã self.count ãã€ã³ã¯ãªã¡ã³ãããŠè¿ãããã«ããã°ã§ããŸããããããªãããããçšåºŠè€éãªãžã§ãã¬ãŒã¿ã«ãªã£ãŠãããšãåãããšãããã¯ã©ã¹ãæžãã®ã¯æ Œæ®µã«ãããããããšã«ãªããŸãã
Python ã®ã©ã€ãã©ãªã«å«ãŸããŠãããã¹ãã¹ã€ãŒã Lib/test/test_generators.py ã«ã¯ãã»ãã«ãè峿·±ãäŸãæ°å€ãå ¥ã£ãŠããŸããããã¯äºåæšã®éãããé (in-order) æ¢çŽ¢ãååž°ã§å®è£ ãããžã§ãã¬ãŒã¿ã§ãã
# A recursive generator that generates Tree leaves in in-order.
def inorder(t):
if t:
for x in inorder(t.left):
yield x
yield t.label
for x in inorder(t.right):
yield x
ã»ãã«ã test_generators.py ã«ã¯ãN-Queens åé¡ (NÃN ã³ãã®ãã§ã¹ç€ã«ãäºãã«æ»æã§ããªããããªé
眮㧠N åã®ã¯ã€ãŒã³ã眮ã) ããã€ãã»ãã¢ãŒ (NÃN ç€ã®å
šã³ãããã€ããäžåºŠãã€éããããªçµè·¯ãæ¢ã) ã®è§£ãåºãäŸãå
¥ã£ãŠããŸãã
ãžã§ãã¬ãŒã¿ã«å€ãæž¡ã¶
Python 2.4 ãŸã§ã®ãžã§ãã¬ãŒã¿ã¯åºåããããšããã§ããŸããã§ããããžã§ãã¬ãŒã¿ã®ã³ãŒããå®è¡ããŠã€ãã¬ãŒã¿ãäœã£ãŠããŸã£ãããšã§ããã®é¢æ°ãåéãããšãã«æ°ããæ å ±ãæž¡ãææ®µã¯ãªãã£ãã®ã§ãããžã§ãã¬ãŒã¿ãã°ããŒãã«å€æ°ãèŠãããã«ãããããã¥ãŒã¿ãã«ãªãªããžã§ã¯ããæž¡ããŠãããŠåŒã³åºãå ã§ããšããããã倿Žãããããšãã£ãããã¯ã¯å¯èœã§ããããã©ãããŽãã£ãŽãã£ããŠããŸããã
Python 2.5 ã§ããžã§ãã¬ãŒã¿ã«å€ãæž¡ãç°¡åãªææ®µãã§ããŸããã yield ãã倿°ã«ä»£å
¥ãããæŒç®ãããã§ããå€ãè¿ãåŒã«ãªã£ãã®ã§ã:
val = (yield i)
äžã®ããã«ãè¿ãå€ã§äœãããããšã㯠yield åŒã®ååŸã« å¿
ã æ¬åŒ§ãä»ãããããå§ãããŸããæ¬åŒ§ã¯åžžã«å¿
èŠãªããã§ã¯ãããŸããããã©ããªãšãä»ããªããŠè¯ãã®ããèŠããŠããããããã€ãä»ããŠããã»ããæ¥œã§ãããã
(PEP 342 ããã®èŠåãæ£ç¢ºã«èª¬æããŠããŸãããããã«ãããš yield-åŒã¯ã代å
¥åŒã§å³èŸºã®ãããã¬ãã«ã«ãããšã以å€ã¯ãã€ãæ¬åŒ§ãä»ããå¿
èŠããããŸããã€ãŸã val = yield i ãšã¯æžããŸããã val = (yield i) + 12 ã®ããã«æŒç®åããããšãã¯æ¬åŒ§ã䜿ããªããŠã¯ãããŸããã)
ãžã§ãã¬ãŒã¿ã«å€ãéãã«ã¯ send(value) ã¡ãœãããåŒã³ãŸãã ãããšãžã§ãã¬ãŒã¿ã®ã³ãŒããå®è¡ãåéãã yield åŒããã®å€ãè¿ãã®ã§ãããµã€ãã® __next__() ã¡ãœãããåŒã¶ãšã yield 㯠None ãè¿ããŸãã
äžã«ããã®ã¯ 1 ãã€å¢ããåçŽãªã«ãŠã³ã¿ã§ãããå éšã«ãŠã³ã¿ã®å€ã倿Žããããšãã§ããããã«ãªã£ãŠããŸãã
def counter(maximum):
i = 0
while i < maximum:
val = (yield i)
# If value provided, change counter
if val is not None:
i = val
else:
i += 1
ãããŠã«ãŠã³ã¿å€æŽã®äŸããã¡ãã§ã:
>>> it = counter(10)
>>> next(it)
0
>>> next(it)
1
>>> it.send(8)
8
>>> next(it)
9
>>> next(it)
Traceback (most recent call last):
File "t.py", line 15, in <module>
it.next()
StopIteration
yield ã None ãè¿ãããšã¯ããããã®ã§ãããããããªã£ãŠããªããã©ããå¿
ããã§ãã¯ããŠããã¹ãã§ãããžã§ãã¬ãŒã¿é¢æ°ãåéããããã«äœ¿ãã¡ãœããã send() ãããªãã®ã ãšç¢ºå®ããŠãã®ã§ãªãéããåŒã®å€ããã®ãŸãŸäœ¿ã£ãŠã¯ãããŸããã
ãžã§ãã¬ãŒã¿ã«ã¯ã send() ã®ã»ãã«ãã¡ãœãããäºã€ãããŸã:
throw(value)ã¯ãžã§ãã¬ãŒã¿å ã§äŸå€ãæããããã«äœ¿ããŸã; ãã®äŸå€ã¯ãžã§ãã¬ãŒã¿ã®å®è¡ã忢ãããšããã®yieldåŒã«ãã£ãŠæããããŸããclose()sends aGeneratorExitexception to the generator to terminate the iteration. On receiving this exception, the generator's code must either raiseGeneratorExitorStopIteration; catching the exception and doing anything else is illegal and will trigger aRuntimeError.close()will also be called by Python's garbage collector when the generator is garbage-collected.GeneratorExitãèµ·ãã£ããšãã«ã¯ãªãŒã³ã¢ããäœæ¥ãããå¿ èŠããããªããGeneratorExitãææããã®ã§ã¯ãªãtry: ... finaly:ãããããå§ãããŸãã
ãããã®å€æŽã®åããæã§ããžã§ãã¬ãŒã¿ã¯æ å ±ã®äžæ¹çãªçç£è ãããçç£è ãã€æ¶è²»è ãšããååšã«å€è²ãéããã®ã§ãã
ãžã§ãã¬ãŒã¿ã¯ ã³ã«ãŒãã³ ãšãããããäžè¬åããã圢åŒã®ãµãã«ãŒãã³ã«ããªããŸãããµãã«ãŒãã³ã¯äžã«æ (颿°ã®åé ) ããå
¥ã£ãŠå¥ã®äžã«æ (return æ) ããåºãã ãã§ãããã³ã«ãŒãã³ã¯ãããããªå Žæ (yield æ) ããå
¥ã£ããåºããåéãããã§ããã®ã§ãã
çµã¿èŸŒã¿é¢æ° (built-in function)¶
ããã€ãã¬ãŒã¿ãšäžç·ã«äœ¿ããã«ãã€ã³é¢æ°ã«ã€ããŠããã£ãšè©³ããèŠãŠãããŸãããã
Python ã®ãã«ãã€ã³é¢æ° map() ãš filter() ã¯ãæ©èœããžã§ãã¬ãŒã¿åŒãšéè€ããŠããŸã:
map(f, iterA, iterB, ...)ã¯ä»¥äžã®ã·ãŒã±ã³ã¹ã®ã€ãã¬ãŒã¿ãè¿ããŸãf(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ....>>> def upper(s): ... return s.upper()
>>> list(map(upper, ['sentence', 'fragment'])) ['SENTENCE', 'FRAGMENT'] >>> [upper(s) for s in ['sentence', 'fragment']] ['SENTENCE', 'FRAGMENT']
ãã¡ããããªã¹ãå å 衚èšã§ãåãçµæãåŸãããŸãã
filter(predicate, iter) ã¯ããæ¡ä»¶ãæºããèŠçŽ ã«æž¡ãã€ãã¬ãŒã¿ãè¿ãã®ã§ãåæ§ã«ãªã¹ãå
å
衚èšã§åçŸã§ããŸãã
predicate ã¯ãããæ¡ä»¶ã«å¯Ÿããçåœå€ãè¿ã颿°ã§ã;
filter() ã§äœ¿ãã«ã¯ããã®é¢æ°ã®åŒæ°ã¯äžã€ã§ãªããã°ãªããŸããã
>>> def is_even(x):
... return (x % 2) == 0
>>> list(filter(is_even, range(10)))
[0, 2, 4, 6, 8]
ããã¯ãªã¹ãå å 衚èšã§ãæžããŸã:
>>> list(x for x in range(10) if is_even(x))
[0, 2, 4, 6, 8]
enumerate(iter, start=0) ã¯ã€ãã©ãã«ã®èŠçŽ ã«é çªã«çªå·ãæ¯ã£ãŠããã(start ããæ°ãå§ãããšãã®) çªå·ãšããããã®èŠçŽ ãå«ã 2 ã¿ãã«ãè¿ããŸãã
>>> for item in enumerate(['subject', 'verb', 'object']):
... print(item)
(0, 'subject')
(1, 'verb')
(2, 'object')
enumerate() ã¯ããããªã¹ãã«å¯ŸããŠã«ãŒããããŠãæ¡ä»¶ã«åãæã«å°ãä»ããŠãããšãã«äœ¿ãããŸã:
f = open('data.txt', 'r')
for i, line in enumerate(f):
if line.strip() == '':
print('Blank line at line #%i' % i)
sorted(iterable, key=None, reverse=False) ã¯ã€ãã©ãã«ã®èŠçŽ ããã¹ãŠéãããªã¹ããäœãããœãŒãããŠè¿ããŸãã åŒæ° key ããã³ reverse ã¯ããªã¹ãã® sort() ã¡ãœããã«ãã®ãŸãŸæž¡ãããŸãã
>>> import random
>>> # Generate 8 random numbers between [0, 10000)
>>> rand_list = random.sample(range(10000), 8)
>>> rand_list
[769, 7953, 9828, 6431, 8442, 9878, 6213, 2207]
>>> sorted(rand_list)
[769, 2207, 6213, 6431, 7953, 8442, 9828, 9878]
>>> sorted(rand_list, reverse=True)
[9878, 9828, 8442, 7953, 6431, 6213, 2207, 769]
(ãœãŒãã«é¢ãã詳现ãªè«è°ã¯ ãœãŒãã®ãã¯ãã㯠ãåç §)
çµã¿èŸŒã¿ã® any(iter) ããã³ all(iter) 㯠iterable ã®å€ã®çåœã調ã¹ãŸãã any() ã¯èŠçŽ ã®ã©ãããçå€ãªã True ãè¿ãã all() ã¯èŠçŽ ãå
šãŠçå€ãªã True ãè¿ããŸã:
>>> any([0, 1, 0])
True
>>> any([0, 0, 0])
False
>>> any([1, 1, 1])
True
>>> all([0, 1, 0])
False
>>> all([0, 0, 0])
False
>>> all([1, 1, 1])
True
zip(iterA, iterB, ...) ã¯ããããã® iterable ãã1ã€ã®èŠçŽ ãåããããããã¿ãã«ã«å
¥ããŠè¿ããŸã:
zip(['a', 'b', 'c'], (1, 2, 3)) =>
('a', 1), ('b', 2), ('c', 3)
It doesn't construct an in-memory list and exhaust all the input iterators before returning; instead tuples are constructed and returned only if they're requested. (The technical term for this behaviour is lazy evaluation.)
ãã®ã€ãã¬ãŒã¿ã®çšéã«ã¯ããã¹ãŠåãé·ãã®ã€ãã©ãã«ãæ³å®ããŠããŸããé·ããéã£ãŠããã°ãåºåãããã¹ããªãŒã ã¯äžçªçãã€ãã©ãã«ãšåãé·ãã«ãªããŸãã
zip(['a', 'b'], (1, 2, 3)) =>
('a', 1), ('b', 2)
ãšã¯èšããããããã£ãŠããŸããšé·ãã€ãã¬ãŒã¿ããèŠçŽ ãã²ãšã€ç¡é§ã«å€ãåã£ãŠæšãŠãŠããŸããããããŸããã®ã§ããããŠãããã»ããè¯ãã§ãããã®æšãŠãããèŠçŽ ãæãããŠããŸãå±éºãããã®ã§ããããã®ã€ãã¬ãŒã¿ã¯ãã以äžäœ¿ããªããªã£ãŠããŸããŸãã
itertools ã¢ãžã¥ãŒã«Â¶
itertools ã¢ãžã¥ãŒã«ã«ã¯ããã䜿ãã€ãã¬ãŒã¿ããã€ãã¬ãŒã¿å士ã®é£çµã«äœ¿ã颿°ãããããå«ãŸããŠããŸãããã®ç« ã§ã¯ããã®ã¢ãžã¥ãŒã«ã®å
容ãå°ããªäŸã§ç޹ä»ããŠãããããšæããŸãã
ãã®ã¢ãžã¥ãŒã«ã®é¢æ°ã倧ãŸãã«åãããšãããªããŸã:
æ¢åã®ã€ãã¬ãŒã¿ã«åºã¥ããŠæ°ããã€ãã¬ãŒã¿ãäœã颿°ã
ã€ãã¬ãŒã¿ã®èŠçŽ ãåŒæ°ãšããŠæ±ã颿°ã
ã€ãã¬ãŒã¿ã®åºåããäžéšãåãåºã颿°ã
ã€ãã¬ãŒã¿ã®åºåãã°ã«ãŒãåããã颿°ã
æ°ããã€ãã¬ãŒã¿ãäœã¶
itertools.count(start, step) ã¯å€ã®ééãäžå®ã®ç¡éã¹ããªãŒã ãè¿ããŸãã
ãªãã·ã§ã³ã§éå§ããæ° (ããã©ã«ã㯠0) ãæ°ã©ããã®éé (ããã©ã«ã㯠1) ãäžããããŸã:
itertools.count() =>
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
itertools.count(10) =>
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
itertools.count(10, 5) =>
10, 15, 20, 25, 30, 35, 40, 45, 50, 55, ...
itertools.cycle(iter) ã¯äžããããã€ãã©ãã«ã®å
容ãã³ããŒããŠã ãã®èŠçŽ ãæåããæåŸãŸã§ç¡éã«ç¹°ãè¿ããŠããã€ãã¬ãŒã¿ãè¿ããŸãã
itertools.cycle([1, 2, 3, 4, 5]) =>
1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
itertools.repeat(elem, [n]) ã¯ãäžããããèŠçŽ ã n åè¿ããŸããã n ããªããã°æ°žé ã«è¿ãç¶ããŸãã
itertools.repeat('abc') =>
abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ...
itertools.repeat('abc', 5) =>
abc, abc, abc, abc, abc
itertools.chain(iterA, iterB, ...) takes an arbitrary
number of iterables as input, and returns all the elements of the first
iterator, then all the elements of the second, and so on, until all of the
iterables have been exhausted.
itertools.chain(['a', 'b', 'c'], (1, 2, 3)) =>
a, b, c, 1, 2, 3
itertools.islice(iter, [start], stop, [step]) ã¯ãã€ãã¬ãŒã¿ã® ã¹ã©ã€ã¹ãã¹ããªãŒã ã§è¿ããŸãã stop åŒæ°ã ãã ãšãæåã® stop åã®èŠçŽ ãè¿ããŸããéå§ã€ã³ããã¯ã¹ãæž¡ããš stop-start åã§ã step ã®å€ãæž¡ãã°ããã«å¿ããŠèŠçŽ ãæãããŸããPython ã«ãããæååããªã¹ãã®ã¹ã©ã€ã¹ãšã¯éã£ãŠããã€ãã¹ã®å€ã¯ start, stop, step ã«äœ¿ããŸããã
itertools.islice(range(10), 8) =>
0, 1, 2, 3, 4, 5, 6, 7
itertools.islice(range(10), 2, 8) =>
2, 3, 4, 5, 6, 7
itertools.islice(range(10), 2, 8, 2) =>
2, 4, 6
itertools.tee(iter, [n]) ã¯ã€ãã¬ãŒã¿ãè€è£œããŸã; å
ã®ã€ãã¬ãŒã¿ã®å
容ãåãããã«è¿ããç¬ç«ãã n åã®ã€ãã¬ãŒã¿ãè¿ãã®ã§ãã n ã®å€ã¯ãæå®ããªããã°æ¢å®ã 2 ã«ãªã£ãŠããŸããè€è£œããã«ã¯å
ã®ã€ãã¬ãŒã¿ã®å
容ãäžéšä¿åããŠããå¿
èŠããããŸãããã倧ããªã€ãã¬ãŒã¿ããè€è£œãããã¡ã®äžã€ãä»ãããé²ãã§ãã£ãŠããŸããšã倧éã®ã¡ã¢ãªãæ¶è²»ããããšããããŸãã
itertools.tee( itertools.count() ) =>
iterA, iterB
where iterA ->
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
and iterB ->
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
èŠçŽ ã«å¯ŸããŠé¢æ°ãåŒã¶Â¶
ããŸäœ¿ã£ã operator ã¢ãžã¥ãŒã«ã«ã¯ãPython ã®æŒç®åã«å¯Ÿå¿ãã颿°ãå
¥ã£ãŠããŸããããã€ãäŸãæãããšã operator.add(a, b) (äºã€ã®å€ãå ç®)ã operator.ne(a, b) (a != b ãšåã)ã operator.attrgetter('id') (.id 屿§ãååŸããã³ãŒã©ãã«ãè¿ã) ãšãã£ã颿°ã§ãã
itertools.starmap(func, iter) ã¯ãã€ãã©ãã«ãã¿ãã«ã®ã¹ããªãŒã ãè¿ããšã¿ãªããŠã ãã®ã¿ãã«ãåŒæ°ã«äœ¿ã£ãŠ func ãåŒã³ãŸã:
itertools.starmap(os.path.join,
[('/bin', 'python'), ('/usr', 'bin', 'java'),
('/usr', 'bin', 'perl'), ('/usr', 'bin', 'ruby')])
=>
/bin/python, /usr/bin/java, /usr/bin/perl, /usr/bin/ruby
èŠçŽ ãéžæãã¶
ããã«å¥ã®ã°ã«ãŒããšããŠãè¿°èª (predicate) ã«åºã¥ããŠã€ãã¬ãŒã¿ã®èŠçŽ ãããµãã»ãããéžã³åºã颿°ããããŸãã
itertools.filterfalse(predicate, iter) 㯠filter() ãšã¯å察ã«ã è¿°èªãåœãè¿ãèŠçŽ ããã¹ãŠè¿ããŸã:
itertools.filterfalse(is_even, itertools.count()) =>
1, 3, 5, 7, 9, 11, 13, 15, ...
itertools.takewhile(predicate, iter) ã¯è¿°èªãçãè¿ããŠããéã ãèŠçŽ ãè¿ããŸããäžåºŠã§ãè¿°èªãåœãè¿ããšãã€ãã¬ãŒã¿ã¯åºåçµäºã®åå³ãããŸãã
def less_than_10(x):
return x < 10
itertools.takewhile(less_than_10, itertools.count()) =>
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
itertools.takewhile(is_even, itertools.count()) =>
0
itertools.dropwhile(predicate, iter) ã¯ãè¿°èªãçãè¿ããŠãããã¡ã¯èŠçŽ ãç¡èŠããåœã«ãªã£ãŠããæ®ãã®åºåããã¹ãŠè¿ããŸãã
itertools.dropwhile(less_than_10, itertools.count()) =>
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
itertools.dropwhile(is_even, itertools.count()) =>
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...
itertools.compress(data, selectors) takes two
iterators and returns only those elements of data for which the corresponding
element of selectors is true, stopping whenever either one is exhausted:
itertools.compress([1, 2, 3, 4, 5], [True, True, False, False, True]) =>
1, 2, 5
çµåã颿°Â¶
itertools.combinations(iterable, r) ã¯ã iterable ãã r-tuple éžæããå
šãŠã®çµã¿åãããæäŸããã€ãã¬ãŒã¿ãè¿ããŸã
itertools.combinations([1, 2, 3, 4, 5], 2) =>
(1, 2), (1, 3), (1, 4), (1, 5),
(2, 3), (2, 4), (2, 5),
(3, 4), (3, 5),
(4, 5)
itertools.combinations([1, 2, 3, 4, 5], 3) =>
(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5),
(2, 3, 4), (2, 3, 5), (2, 4, 5),
(3, 4, 5)
ããããã®ã¿ãã«å
ã§ã¯ãèŠçŽ ã¯ iterable ããããè¿ããã®ãšåãé åºãä¿ã¡ãŸããäŸãã°äžã®äŸã§ããã°ã 1 ã¯ãã€ã§ã 2, 3, 4, 5 ã®åã«æ¥ãŸãã䌌ããããªé¢æ°ã« itertools.permutations(iterable, r=None) ãããããã¡ãã¯ãã®é åºã«ã€ããŠã®å¶çŽããªãã r åéžæããå
šãŠã®é åãè¿ããŸãã
itertools.permutations([1, 2, 3, 4, 5], 2) =>
(1, 2), (1, 3), (1, 4), (1, 5),
(2, 1), (2, 3), (2, 4), (2, 5),
(3, 1), (3, 2), (3, 4), (3, 5),
(4, 1), (4, 2), (4, 3), (4, 5),
(5, 1), (5, 2), (5, 3), (5, 4)
itertools.permutations([1, 2, 3, 4, 5]) =>
(1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5),
...
(5, 4, 3, 2, 1)
r ãäžããªãå Žå㯠iterable ã®é·ãã䜿ãããŸããã€ãŸã iterable ã®å šãŠã®èŠçŽ ãéžãã é åãè¿ããŸãã
ãããã®é¢æ°ãçæããçµã¿åããã¯ãäœçœ®ãåºæºã§ãã®ã§ã iterable ã®å 容ãäžæã§ãªããšãè¯ãããšã«æ³šç®ããŠãã ãã:
itertools.permutations('aba', 3) =>
('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'),
('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a')
å
šãåãã¿ãã« ('a', 'a', 'b') ã 2床çŸããŠããŸããããã㯠2ã€ã® 'a' ãå¥ã®äœçœ®ããã®ãã®ã ããã§ãã
itertools.combinations_with_replacement(iterable, r) 颿°ã¯å¥ã®å¶çŽãåãæããŸã: äžåã®éžæã§åãèŠçŽ ãç¹°ãè¿ãéžãã§ãè¯ããæŠå¿µçã«ã¯ãããããã®ã¿ãã«ã®æåã®ãã®ãšããŠäžã€èŠçŽ ãéžã°ããç¶ã㊠2ã€ç®ã®éžæã®ãããã«ããã§çœ®ãæãããŸã
itertools.combinations_with_replacement([1, 2, 3, 4, 5], 2) =>
(1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
(2, 2), (2, 3), (2, 4), (2, 5),
(3, 3), (3, 4), (3, 5),
(4, 4), (4, 5),
(5, 5)
èŠçŽ ãã°ã«ãŒãåããã¶
æåŸã«è°é¡ã«äžãã颿° itertools.groupby(iter, key_func=None) ã¯ã ãããŸã§ã§æãè€éã§ãã key_func(elem) ã¯ãã€ãã©ãã«ããè¿ã£ãŠããèŠçŽ ããããã®ããŒå€ãèšç®ãã颿°ã§ãããã®é¢æ°ãæå®ãããŠããªããã°ã ããŒã¯åã«åèŠçŽ ãã®ãã®ã«ãªããŸãã
groupby() ã¯ãå
ã«ãªãã€ãã©ãã«ããåãããŒå€ãæã€é£ç¶ããèŠçŽ ãéããŠãããŒå€ãšãã®ããŒã«å¯Ÿå¿ããèŠçŽ ã®ã€ãã¬ãŒã¿ã® 2-ã¿ãã«ã®ã¹ããªãŒã ãè¿ããŸãã
city_list = [('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL'),
('Anchorage', 'AK'), ('Nome', 'AK'),
('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ'),
...
]
def get_state(city_state):
return city_state[1]
itertools.groupby(city_list, get_state) =>
('AL', iterator-1),
('AK', iterator-2),
('AZ', iterator-3), ...
where
iterator-1 =>
('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL')
iterator-2 =>
('Anchorage', 'AK'), ('Nome', 'AK')
iterator-3 =>
('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ')
groupby() ã¯ãå
ã«ãªãã€ãã©ãã«ã®å
容ãããŒå€ã§ãœãŒããããç¶æ
ã§äžããããããšãæ³å®ããŠããŸããããã§ãè¿ãããã€ãã¬ãŒã¿èªäœãå
ã®ã€ãã©ãã«ã䜿ããšããããšã«æ³šæããŠãã ããããã®ããã iterator-1 ã®çµæãèªã¿çµãããŸã§ã¯ iterator-2 ãšããã«å¯Ÿå¿ããããŒå€ãèŠæ±ããããšã¯ã§ããŸããã
functools ã¢ãžã¥ãŒã«Â¶
functools ã¢ãžã¥ãŒã«ã«ã¯ãé«é颿°ãããã€ãå
¥ã£ãŠããŸãã é«é颿° ãšã¯ãå
¥åãšããŠé¢æ°ãåãåã£ãŠæ°ããªé¢æ°ãè¿ã颿°ã§ãããã®ã¢ãžã¥ãŒã«ã§äžçªäŸ¿å©ãªããŒã«ã¯ functools.partial() 颿°ã§ãã
颿°åã¹ã¿ã€ã«ã®ããã°ã©ã ã§ã¯ææãæ¢åã®é¢æ°ããäžéšã®ãã©ã¡ãŒã¿ãåããå€çš®ãäœããããªãããšããããŸããPython ã®é¢æ° f(a, b, c) ãšãããã®ããããšããŠãã ãã; f(1, b, c) ãšåãæå³ã® g(b, c) ãšãã颿°ãäœããããªãããšããããŸã; ã€ãŸã f() ã®ãã©ã¡ãŒã¿ãäžã€åããããã§ããããã¯ã颿°ã®éšåé©çšããšåŒã°ããŠããŸãã
partial() ã®ã³ã³ã¹ãã©ã¯ã¿ã¯ (function, arg1, arg2, ..., kwarg1=value1, kwarg2=value2) ãšããåŒæ°ãåããŸããã§ãããã£ããªããžã§ã¯ãã¯ã³ãŒã©ãã«ãªã®ã§ããããåŒã¹ã°ãåŒæ°ã®åãŸã£ãç¶æ
ã§ function ãå®è¡ããã®ãšåãããšã«ãªããŸãã
以äžã«ããã®ã¯ãå°ããããã©ãçŸå®çãªäžã€ã®äŸã§ã:
import functools
def log(message, subsystem):
"""Write the contents of 'message' to the specified subsystem."""
print('%s: %s' % (subsystem, message))
...
server_log = functools.partial(log, subsystem='server')
server_log('Unable to open socket')
functools.reduce(func, iter, [initial_value])
cumulatively performs an operation on all the iterable's elements and,
therefore, can't be applied to infinite iterables. func must be a function
that takes two elements and returns a single value. functools.reduce()
takes the first two elements A and B returned by the iterator and calculates
func(A, B). It then requests the third element, C, calculates
func(func(A, B), C), combines this result with the fourth element returned,
and continues until the iterable is exhausted. If the iterable returns no
values at all, a TypeError exception is raised. If the initial value is
supplied, it's used as a starting point and func(initial_value, A) is the
first calculation.
>>> import operator, functools
>>> functools.reduce(operator.concat, ['A', 'BB', 'C'])
'ABBC'
>>> functools.reduce(operator.concat, [])
Traceback (most recent call last):
...
TypeError: reduce() of empty iterable with no initial value
>>> functools.reduce(operator.mul, [1, 2, 3], 1)
6
>>> functools.reduce(operator.mul, [], 1)
1
operator.add() ã functools.reduce() ã§äœ¿ããšã iterable ã®å
šèŠçŽ ãåèšããããšã«ãªããŸããããã¯äœ¿çšé »åºŠãé«ãã®ã§ããã®ããã® sum() ãšãããã«ãã€ã³é¢æ°ããããŸã:
>>> import functools, operator
>>> functools.reduce(operator.add, [1, 2, 3, 4], 0)
10
>>> sum([1, 2, 3, 4])
10
>>> sum([])
0
ãšã¯ãããå€ãã®å Žå functools.reduce() ã䜿ãããã¯ãåã« for ã«ãŒããæžããã»ãããããããããªããŸã:
import functools
# Instead of:
product = functools.reduce(operator.mul, [1, 2, 3], 1)
# You can write:
product = 1
for i in [1, 2, 3]:
product *= i
é¢é£ãã颿°ã¯ itertools.accumulate(iterable, func=operator.add) ã§ãããã®é¢æ°ã¯åãèšç®ãããŸãããæçµçµæãè¿ãã®ã§ã¯ãªãã accumulate() ã¯ããããã®äžéçµæãçæããã€ãã¬ãŒã¿ãè¿ãå€ãšãªããŸãã
itertools.accumulate([1, 2, 3, 4, 5]) =>
1, 3, 6, 10, 15
itertools.accumulate([1, 2, 3, 4, 5], operator.mul) =>
1, 2, 6, 24, 120
operator ã¢ãžã¥ãŒã«Â¶
operator ã¢ãžã¥ãŒã«ã¯ãæ¢ã«åãäžããŸããããPython ã®æŒç®åã«å¯Ÿå¿ãã颿°ãå
¥ã£ãŠããã¢ãžã¥ãŒã«ã§ãã颿°åã¹ã¿ã€ã«ã®ã³ãŒãã«ãããŠãæŒç®ãäžã€å®è¡ããã ãã®ãã ããªã颿°ãæžããã«æžãã®ã§ãããäžè©±ã«ãªããŸãã
ãã®ã¢ãžã¥ãŒã«ã®é¢æ°ãäžéšã ã玹ä»ããŸããã:
æ°åŠæŒç®å:
add(),sub(),mul(),floordiv(),abs(), ...è«çæŒç®å:
not_(),truth()ãããæŒç®å:
and_(),or_(),invert()æ¯èŒ:
eq(),ne(),lt(),le(),gt(),ge()ãªããžã§ã¯ãèå¥:
is_(),is_not()
ã¡ãããšããäžèŠ§ã¯ operator ã¢ãžã¥ãŒã«ã®ææžã§ã芧ãã ããã
å°ããªé¢æ°ãšã©ã ãåŒÂ¶
颿°åã¹ã¿ã€ã«ã®ããã°ã©ã ãæžããŠãããšãè¿°èªãšããŠåããããäœããã®åœ¢ã§èŠçŽ ãã€ãªãåãããããããããµã€ãºã®é¢æ°ãå¿ èŠãšããããšããããããŸãã
ã¡ããã©è¯ã颿°ããã«ãã€ã³ãã¢ãžã¥ãŒã«ã§ååšããŠããã°ãæ°ãã颿°ãå®çŸ©ããå¿ èŠã¯ãŸã£ãããããŸãã:
stripped_lines = [line.strip() for line in lines]
existing_files = filter(os.path.exists, file_list)
ããããæ¬²ãã颿°ããªããªãæžããããããŸãããããããå°ããªé¢æ°ãæžãæ¹æ³ã® äžã€ã lambda åŒã§ãã lambda ã¯åŒæ°ãšããŠè€æ°ã®ãã©ã¡ãŒã¿ãš ãããã€ãªãåŒãåãããã®åŒã®å€ãè¿ãç¡åã®é¢æ°ãäœããŸã:
adder = lambda x, y: x+y
print_assign = lambda name, value: name + '=' + str(value)
ããäžã€ã®éžæè¢ã¯ããµã€ãã« def æã§é¢æ°ãå®çŸ©ããã ãã§ã:
def adder(x, y):
return x + y
def print_assign(name, value):
return name + '=' + str(value)
ã©ã¡ãã®ã»ããè¯ãã®ã§ãããããããã¯å¥œã¿ã®åé¡ã§ã; èè
ã®ã¹ã¿ã€ã«ãšããŠã¯ã§ããã ã lambda ã䜿ããªãããã«ããŠããŸãã
ãã®ããã«ããŠããçç±ã®äžã€ã«ãlambda ã¯å®çŸ©ã§ãã颿°ãéåžžã«éãããŠãããšããç¹ããããŸããäžã€ã®åŒãšããŠç®åºã§ããçµæã«ããªããã°ãããŸããã®ã§ãif... elif... else ã try... except ã®ãããªåå²ãæã€ããšãã§ããªãã®ã§ããlambda æã®äžã§ããããã®ããšãããããšãããããšããã¡ããã¡ãããŠèªã¿ã«ããåŒã«ãªã£ãŠããŸããŸããããŠã次ã®ã³ãŒãã¯äœãããŠããã§ãããããçŽ æ©ããçããã ãã!
import functools
total = functools.reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
ãããã«ã¯ãããã§ãããããäœãã©ããªã£ãŠããã®ãçŽè§£ããŠããã«ã¯æéããããã¯ãã§ããçã def æã§å
¥ãåã«ãããšãå°ãèŠéããè¯ããªããŸãã:
import functools
def combine(a, b):
return 0, a[1] + b[1]
total = functools.reduce(combine, items)[1]
ã§ãåçŽã« for ã«ãŒãã«ããã°è¯ãã£ãã®ã§ã:
total = 0
for a, b in items:
total += b
ããã㯠sum() ãã«ãã€ã³ãšãžã§ãã¬ãŒã¿åŒã§ãè¯ãã§ãã:
total = sum(b for a, b in items)
å€ãã®å Žåã functools.reduce() ã䜿ã£ãŠãããšãã㯠for ã«ãŒãã« æžãçŽããã»ããèŠãããã§ãã
Fredrik Lundh ã¯ä»¥å lambda å©çšã®ãªãã¡ã¯ã¿ãªã³ã°ã«é¢ããŠä»¥äžã®æéãææ¡ããããšããããŸã:
ã©ã ã颿°ãæžãã
ãã®ã©ã ããäžäœããããäœãããŠããã®ãã³ã¡ã³ãã§èª¬æããã
ãã®ã³ã¡ã³ãããã°ããç ç©¶ããŠãæ¬è³ªããšãããååãèããã
ã©ã ãããã®ååã§ def æã«æžãæããã
ã³ã¡ã³ããæ¶ãã
èè ã¯ãã®æéãæ¬åœã«æ°ã«å ¥ã£ãŠããŸãããããããã©ã ããªãã¹ã¿ã€ã«ãä»ããåªããŠãããã©ããã«ã€ããŠãç°è«ã¯èªããŸãã
æŽæ°å±¥æŽãšè¬èŸÂ¶
The author would like to thank the following people for offering suggestions, corrections and assistance with various drafts of this article: Ian Bicking, Nick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike Krell, Leandro Lameiro, Jussi Salmela, Collin Winter, Blake Winton.
Version 0.1: posted June 30 2006.
Version 0.11: posted July 1 2006. Typo fixes.
Version 0.2: posted July 10 2006. Merged genexp and listcomp sections into one. Typo fixes.
Version 0.21: Added more references suggested on the tutor mailing list.
Version 0.30: Adds a section on the functional module written by Collin
Winter; adds short section on the operator module; a few other edits.
åèè³æÂ¶
äžè¬è«Â¶
èšç®æ©ããã°ã©ã ã®æ§é ãšè§£éãHarold AbelsonãšGerald Jay SussmanãJulie Sussmanèããã®æ¬ã¯ https://mitpress.mit.edu/sicp ã§èŠããŸãããã®èšç®æ©ç§åŠã®å€å žçãªæç§æžã§ã¯ã2ç« ãš3ç« ã§ã·ãŒã±ã³ã¹ãšã¹ããªãŒã ã䜿ã£ãŠããã°ã©ã å ã®ããŒã¿ãããŒãæŽçããæ¹æ³ã«ã€ããŠèª¬æããŠããŸãããã®æ¬ã§ã¯äŸã« Scheme ã䜿ã£ãŠããŸããããããã®ç« ã§èª¬æãããŠããèšèšã¢ãããŒãã®å€ãã¯ã颿°åã¹ã¿ã€ã«ã® Python ã³ãŒãã«ãé©çšã§ããŸãã
https://defmacro.org/2006/06/19/fp.html: A general introduction to functional programming that uses Java examples and has a lengthy historical introduction.
https://en.wikipedia.org/wiki/Functional_programming: 颿°ããã°ã©ãã³ã°ã«é¢ããäžè¬çãªå 容ã®èšäºã
https://en.wikipedia.org/wiki/Coroutine: ã³ã«ãŒãã³ã«é¢ããèšäºã
https://en.wikipedia.org/wiki/Partial_application: 颿°ã®éšåé©çšã®æŠå¿µã«ã€ããŠã®èšäºã
https://en.wikipedia.org/wiki/Currying: ã«ãªãŒåã®æŠå¿µã«é¢ããèšäºã
Python ç¹æã®è©±Â¶
https://gnosis.cx/TPiP/: David Mertz's ã®æ¬ã®æåã®ç« Text Processing in Python ã§ã¯ææžåŠçã®ããã®é¢æ°ããã°ã©ãã³ã°ã«ã€ããŠè°è«ããŠããŸãããã®è°è«ã®ç¯ã«ã¯ "Utilizing Higher-Order Functions in Text Processing" ãšããã¿ã€ãã«ãã€ããŠããŸãã
Mertz also wrote a 3-part series of articles on functional programming for IBM's DeveloperWorks site; see part 1, part 2, and part 3,
Python ææžÂ¶
itertools ã¢ãžã¥ãŒã«ã®ææžã
functools ã¢ãžã¥ãŒã«ã«ã€ããŠã®ããã¥ã¡ã³ãã
operator ã¢ãžã¥ãŒã«ã®ææžã
PEP 289: "Generator Expressions"
PEP 342: "Coroutines via Enhanced Generators" describes the new generator features in Python 2.5.