# è¿ä»£å¨åçæå¨ 1.å¯è¿ä»£å¯¹è±¡ï¼å¨é»è¾ä¸å®ä¿åäºä¸ä¸ªåºåï¼å¨è¿ä»£ç¯å¢ä¸ä¾æ¬¡è¿ååºåä¸çä¸ä¸ªå ç´ å¼ã >å¯è¿ä»£å¯¹è±¡ä¸ä¸å®æ¯åºåï¼ä½æ¯åºåä¸å®æ¯å¯è¿ä»£å¯¹è±¡ 2.è¿ä»£åè®®ï¼`.__next__()`æ¹æ³ã * ä»»ä½å¯¹è±¡åªè¦å®ç°äºè¿ä»£åè®®ï¼åå®å°±æ¯ä¸ä¸ªè¿ä»£å¨å¯¹è±¡ * è¿ä»£å¨å¯¹è±¡è°ç¨`.__next__()`æ¹æ³ï¼ä¼å¾å°ä¸ä¸ä¸ªè¿ä»£ç»æ * å¨ä¸ç³»åè¿ä»£ä¹åå°è¾¾è¿ä»£å¨å°¾é¨ï¼è¥å次è°ç¨`.__next__()`æ¹æ³ï¼åä¼è§¦å`StopIteration`å¼å¸¸ * è¿ä»£å¨å¨Python䏿¯ç¨Cè¯è¨çé度è¿è¡çï¼å æ¤é度æå¿«  3.Python3æä¾äºä¸ä¸ªå ç½®ç`next()`彿°ï¼å®èªå¨è°ç¨è¿ä»£å¨ç`.__next__()`æ¹æ³ãå³ç»å®ä¸ä¸ªè¿ä»£å¨å¯¹è±¡`x`ï¼`next(x)`çåäº`x.__next__()`  4.å ç½®ç`iter()`彿°ç¨äºä»åºåãåå ¸ã`set`以åå ¶ä»å¯è¿ä»£å¯¹è±¡ä¸è·åè¿ä»£å¨ã * 对任ä½è¿ä»£å¨å¯¹è±¡`iterator`ï¼è°ç¨`iter(iterator)`è¿å宿¬èº« * è¿ä»£å¨å¯¹è±¡å®ç°äºè¿ä»£åè®® * æä»¶å¯¹è±¡æ¬èº«æ¯ä¸ä¸ªè¿ä»£å¨å¯¹è±¡ãå³æä»¶å¯¹è±¡å®ç°äºè¿ä»£åè®®ï¼å æ¤æå¼å¤ä¸ªæä»¶ä¼è¿ååä¸ä¸ªæä»¶å¯¹è±¡ * å表ãå ç»ãåå ¸ã`set`ãå符串çä¸éè¿ä»£å¨å¯¹è±¡ï¼ä»ä»¬æ²¡æå®ç°è¿ä»£åè®®ãå æ¤æ¯æ¬¡è°ç¨`iter()`åè¿åä¸ä¸ªæ°è¿ä»£å¨å¯¹è±¡ãä»ä»¬æ¯æå®è£ å¤ä¸ªè¿ä»£å¨ï¼æ¯ä¸ªè¿ä»£å¨ç¶æä¸å * å¨åå°ä¿®æ¹å表ã`set`ãåå ¸æ¶ï¼ä¼å®æ¶åæ å°å®ä»¬çè¿ä»£å¨ä¸  5.æä»¶è¿ä»£å¨ï¼æä»¶å¯¹è±¡æ¬èº«æ¯ä¸ä¸ªè¿ä»£å¨ï¼è¿éæä»¶å¯¹è±¡è¦æ¯è¯»æå¼ï¼ãå®ç`.__next__()`æ¹æ³æ¯æ¬¡è°ç¨æ¶ï¼è¿åæä»¶ä¸çä¸ä¸è¡ãå½å°è¾¾æä»¶æ«å°¾æ¶ï¼`.__next__()`æ¹æ³ä¼å¼å`StopIteration`å¼å¸¸ã >`.readline()`æ¹æ³å¨å°è¾¾æä»¶æ«å°¾æ¶è¿å空å符串  6.åå ¸çè¿ä»£å¨ï¼åå ¸çè¿ä»£å¨å¨è¿ä»£ç¯å¢ä¸ï¼æ¯æ¬¡è¿ä»£è¿åçæ¯ä¸ä¸ªé®ã  7.æ©å±çå表解æè¡¨è¾¾å¼ï¼ `[ x+y for x in 'abc' if x!='a' for y in 'lmn' if y!='l']` å ¶éç¨ç»æä¸ºï¼ ``` [ expression for target1 in iterable1 [if condition1] for target2 in iterable2 [if condition2] ....] ``` >æä»¬æ»æ¯å¯ä»¥ç¨`for`å¾ªç¯æå¨æå»ºå表解æè¡¨è¾¾å¼çç»æï¼ä½æ¯å表解æè¡¨è¾¾å¼æ§è½æ´å¥½  8.`for`循ç¯ãå表解æã`in`æåå ³ç³»æµè¯ã`map()`å ç½®å½æ°ã`sorted()`å ç½®å½æ°ã`zip()`å ç½®å½æ°ç齿¯ç¨è¿ä»£åè®®æ¥å®æå·¥ä½ 9.常è§çè¿ä»£å½æ°ï¼ * `map(func,iterable)`ï¼å®å°å½æ°`func`åºç¨äºä¼ å ¥çè¿ä»£å¨çæ¯ä¸ªè¿ä»£è¿åå ç´ ï¼è¿åä¸ä¸ªæ°çè¿ä»£å¨ï¼å½æ°æ§è¡ç»æä½ä¸ºæ°è¿ä»£å¨çè¿ä»£å¼ > `map()`å¯ä»¥ç¨äºå¤ä¸ªå¯è¿ä»£å¯¹è±¡ï¼`map(func,[1,2,3],[2,3,4])`ï¼å ¶ä¸`func(first,second)` çä¸¤ä¸ªåæ°åå«ä»ä¸¤ä¸ªå¯è¿ä»£å¯¹è±¡ä¸è·åï¼å½æ°ç»æä½ä¸ºæ°è¿ä»£å¨çè¿ä»£å¼  * `zip(iterable1,iterable2,...)`ï¼å®ç»åå¯è¿ä»£å¯¹è±¡`iterable1`ã`iterable2`ã`...`ä¸çå项ï¼è¿åä¸ä¸ªæ°çè¿ä»£å¨ãæ°è¿ä»£å¨é¿åº¦ç±`iterable1`ã`iterable2`ã`...`æççé£ä¸ªå³å®ã  * `enumerate(iterable,start)`ï¼è¿åä¸ä¸ªè¿ä»£å¨å¯¹è±¡ï¼å®è¿ä»£ç»ææ¯æ¯æ¬¡è¿ä»£è¿åä¸ä¸ª`(index,value)`å ç»  * `filter(func,iterable)`ï¼è¿åä¸ä¸ªè¿ä»£å¨å¯¹è±¡ï¼å®çè¿ä»£ç»æå¾å°`iterable`ä¸é¨åå ç´ ï¼å ¶ä¸è¿äºå ç´ ä½¿å¾`func()`彿°è¿å为ç  * `reduce(func,iterable,initial)`ï¼å¯¹`iterable`䏿¯ä¸é¡¹æå¯¹å°è¿è¡`func`ï¼è¿åæç»å¼ > `reduce`彿°ä½äº`functools`å å  * `sorted(iterable,key=None,reverse=False)`ï¼æåºå¹¶è¿åæå¥½çæ°å表  * `sum(iterable,start)`ï¼è¿åå¯è¿ä»£å¯¹è±¡ä¸çç´¯å å¼  * `any(iterable)`ï¼åªè¦å¯è¿ä»£å¯¹è±¡`iterable`è¿ä»£è¿åçæä¸ªå ç´ ä¸ºçåè¿å`True` * `all(iterable)`ï¼åªæå¯è¿ä»£å¯¹è±¡`iterable`è¿ä»£è¿åçææå ç´ ä¸ºçåè¿å`True`  * `max(iterable,key=func)`ï¼è¿åæå¤§å ç´ ãè¥æå®`func`ï¼åè¿åæ¯`func(num)`æå¤§çé£ä¸ªå ç´ * `min(iterable,key=func)`ï¼è¿åæå°å ç´ ãè¥æå®`func`ï¼åè¿åæ¯`func(num)`æå°çé£ä¸ªå ç´  10.`set`è§£æãåå ¸è§£ææ¯æå表解æçæ©å±è¯æ³  11.Python3ä¸ï¼`range`å¯¹è±¡ä¸æ¯æ`.__next__()`ï¼å æ¤å®æ¬èº«ä¸æ¯è¿ä»£å¨ï¼è`map`ã`zip`ã`filter`å¯¹è±¡é½æ¯è¿ä»£å¨ã * `range`ä¸ç´æ¥çæå表çä¼ç¹æ¯è约å åç©ºé´ * ç±äº`map`ã`zip`ã`filter`å¯¹è±¡é½æ¯è¿ä»£å¨ï¼å æ¤ä¸æ¯æå¨å®ä»¬èº«ä¸å®è£ å¤ä¸ªæ´»è·çè¿ä»£å¨ã对ä»ä»¬è°ç¨`iter()`å ¶å®è¿åçæ¯å®ä»¬æ¬èº«ã  12.åå ¸çè§å¾ï¼é®è§å¾ãå¼è§å¾ãåå ¸è§å¾é½æ²¡æ`.__next__()`æ¹æ³ï¼å æ¤ä»ä»¬é½ä¸æ¯è¿ä»£å¨  13.é常åè¡¨è§£ææ§è¡é度æå¿«ï¼`map()`é度次ä¹ï¼`for`循ç¯éåº¦ææ ¢ãå两è 以Cè¯è¨é度æ§è¡ãåè å¨Pythonèææºä¸æ§è¡ 14.çæå¨å½æ°ï¼ç¼å为常è§ç`def`è¯å¥ï¼ä½æ¯ç¨`yield`è¯å¥ä¸æ¬¡è¿åä¸ä¸ªç»æãæ¯æ¬¡ä½¿ç¨çæå¨å½æ°æ¶ä¼ç»§ç»ä¸ä¸è½®çç¶æã >çæå¨å½æ°ä¼ä¿å䏿¬¡æ§è¡çç¶æ å®ä¹çæå¨å½æ°çè¯æ³ä¸ºï¼ ``` def genFunc(num): for i in range(num): yield i**2 ``` * çæå¨å½æ°æ§è¡æ¶ï¼å¾å°ä¸ä¸ªçæå¨å¯¹è±¡ï¼å®`yield`ä¸ä¸ªå¼ï¼è䏿¯è¿åä¸ä¸ªå¼ã * çæå¨å¯¹è±¡èªå¨å®ç°è¿ä»£åè®®ï¼å®æä¸ä¸ª`.__next__()`æ¹æ³ * 对çæå¨å¯¹è±¡è°ç¨`.__next__()`æ¹æ³ä¼ç»§ç»çæå¨å½æ°çè¿è¡å°ä¸ä¸ä¸ª`yield` ç»ææå¼åä¸ä¸ª`StopIteration`å¼å¸¸ * `yield`è¯å¥ä¼æèµ·çæå¨å½æ°å¹¶åè°ç¨è åéä¸ä¸ªå¼ãå½ä¸ä¸è½®ç»§ç»æ¶ï¼å½æ°ä¼å¨ä¸ä¸ä¸ª`yield`表达å¼è¿ååç»§ç»æ§è¡ï¼å ¶æ¬å°åéæ ¹æ®ä¸ä¸è½®ä¿æçç¶æç»§ç»ä½¿ç¨ * çæå¨å½æ°è¿è¡ä»£ç éæ¶é´äº§çä¸ç³»åçå¼ï¼è䏿¯ä¸æ¬¡æ§è®¡ç®å®ä»¬ãè¿ä¼è约å åå¹¶å è®¸è®¡ç®æ¶é´åæ£ã  15.`for`循ç¯ï¼åå ¶å®è¿ä»£ç¯å¢ï¼éè¿éå¤è°ç¨`.__next__()`æ¹æ³ç´å°æè·ä¸ä¸ªå¼å¸¸ãè¥ä¸ä¸ªä¸æ¯æè¿ä»£åè®®ç对象æ³ç¨å·¥ä½å¨è¿ç§ç¯å¢ä¸ï¼`for`循ç¯ä¼å°è¯ä½¿ç¨ç´¢å¼åè®®è¿ä»£ã 16.çæå¨å¯¹è±¡æä¸ä¸ª`.send(arg)`æ¹æ³ãè¯¥æ¹æ³ä¼å°`arg`åæ°åéç»çæå¨ä½ä¸º`yield`表达å¼çè¿åå¼ï¼åæ¶çæå¨ä¼è§¦åçæå¨ä½(ç¸å½äºè°ç¨äºä¸æ¬¡`.__next__()`æ¹æ³ã > `yield`表达å¼çè¿åå¼åçæå¼æ¯ä¸åçã > è¿å弿¯ç¨äºçæå¨å½æ°å é¨ï¼`yield`表达å¼é»è®¤è¿åå¼ä¸º`None`ï¼ > èçæå¼æ¯ç¨äºçæå¨å½æ°å¤é¨çè¿ä»£è¿åã * çæå¨å¯¹è±¡å¿ é¡»å å¯å¨ãå¯å¨æå³çå®ç¬¬ä¸æ¬¡è¿è¡å°`yield`ä¹åæèµ·  * è¦æ³å¯å¨çæå¨ï¼å¯ä»¥ç´æ¥ä½¿ç¨`next(generatorable)`彿°ï¼ä¹å¯ä»¥ä½¿ç¨`generatorable.send(None)`æ¹æ³ï¼æè `generatorable.__next__()`æ¹æ³ >`next(generatorable)`彿°ç¸å½äºä½¿ç¨`generatorable.send(None)`æ¹æ³ * `generatorable.send(None)`æ¹æ³ä¼å¨ä¼ é`yield`表达å¼çå¼ï¼é»è®¤ä¸º`None`è¿åå¼ï¼ï¼ä¸ä¸è½®è¿ä»£ä»`yield`表达å¼è¿åå¼å§ >æ¯ä¸è½®æèµ·æ¶ï¼`yield`è¡¨è¾¾å¼ yield ä¸ä¸ªæ°ï¼ä½æ¯å¹¶æ²¡æè¿åï¼æèµ·äºè¯¥`yield`表达å¼ï¼  17.çæå¨è¡¨è¾¾å¼ï¼ç±»ä¼¼äºå表解æï¼ä½æ¯å®æ¯å¨åæ¬å·ä¸çï¼è䏿¯æ¹æ¬å·ä¸çã * çæå¨è¡¨è¾¾å¼è¿åçæ¯ä¸ä¸ªçæå¨å¯¹è±¡ * å表解æçç»æçåäº`list()`å åæ°ä¸ºä¸ä¸ªçæå¨è¡¨è¾¾å¼ * å½çæå¨è¡¨è¾¾å¼å¨å ¶ä»æ¬å·ä¹å æ¶ï¼å®æ¬èº«ç忬å·å¯ä»¥ä¸å * åæ ·çè¿ä»£å¯ä»¥ç¨çæå¨å½æ°æè ä¸ä¸ªçæå¨è¡¨è¾¾å¼ * çæå¨å½æ°å¯ä»¥å 嫿´å¤çé»è¾ * çæå¨è¡¨è¾¾å¼æ´ç®æ´ï¼æ²¡æå½æ°è°ç¨äº§ççæå¨çè¿ç¨ * çæå¨å½æ°ä¸çæå¨è¡¨è¾¾å¼æ¯æèªå¨è¿ä»£ä¸æå¨è¿ä»£ * çæå¨å¯¹è±¡æ¬èº«æ¯è¿ä»£å¨ï¼å æ¤åªæ¯æä¸ä¸ªæ´»è·çè¿ä»£å¨ã  18.çæå¨å½æ°å¯ä»¥æ`return`ï¼å®å¯ä»¥åºç°å¨å½æ°å ä»»ä½å°æ¹ãçæå¨å½æ°å éå°`return`å触å`StopIteration`å¼å¸¸ï¼åæ¶`return`çå¼ä½ä¸ºå¼å¸¸è¯´æ  19.å¯ä»¥è°ç¨çæå¨å¯¹è±¡ç`.close()`æ¹æ³å¼ºå¶å ³éå®ãè¿æ ·å次ç»å®`send()`ä»»ä½ä¿¡æ¯ï¼é½ä¼æåº`StopIteration`å¼å¸¸ï¼è¡¨ææ²¡æä»ä¹å¯ä»¥çæçäº  20.`yield from`ï¼ä»`PEP 380`å¼å ¥çæ°ç¹æ§ã * `yield from`å¯ä»¥å°ä¸ä¸ªå¤§ççæå¨ååæå°çæå¨ï¼ ``` def generator(): #该çæå¨yieldæ°å[0~19] for i in range(10): yield i for j in range(10,20): yield j ``` å¦æä½ æ³ååæä¸¤ä¸ªè¿ä»£å¨ï¼å¯ä»¥è¿ä¹åï¼ ``` def generator2(): for i in range(10): yield i def generator3(): for j in range(10): yield j def generator(): for i in generator2(): yield i for j in generator3(): yield j ``` å¼å ¥`yield from`ä¹åä½ å¯ä»¥è¿ä¹åï¼ ``` def generator2(): for i in range(10): yield i def generator3(): for j in range(10): yield j def generator(): yield from generator2() yield from generator3() ``` * `yield from`è½å®ç°ä»£ççæå¨ï¼ ``` def generator(): inner_gen=generator2() yield from inner_gen #为äºä¾¿äºè¯´æï¼è¿éå两è¡å gen=generator() ``` * 对`inner_gen`è¿ä»£äº§ççæ¯ä¸ªå¼é½ç´æ¥ä½ä¸º`gen` yieldå¼ * ææ`gen.send(val)`åéå°`gen`çå¼`val`é½ä¼è¢«ç´æ¥ä¼ éç»`inner_gen`ã * `inner_gen`æåºå¼å¸¸ï¼ * 妿`inner_gen`产çäº`StopIteration`å¼å¸¸ï¼ å`gen`ä¼ç»§ç»æ§è¡`yield from`ä¹åçè¯å¥ * 妿坹`inner_gen`产çäºé`StopIteration`å¼å¸¸ï¼åä¼ å¯¼è³`gen`ä¸ï¼ 导è´`gen`卿§è¡`yield from`çæ¶åæåºå¼å¸¸ * `gen`æåºå¼å¸¸ï¼ * 妿`gen`产çäºé¤`GeneratorExit`以å¤çå¼å¸¸ï¼å该å¼å¸¸ç´æ¥ throw å°`inner_gen`ä¸ * 妿`gen`产çäº`GeneratorExit`å¼å¸¸ï¼æè `gen`ç`.close()`æ¹æ³è¢«è°ç¨ï¼ å`inner_gen`ç`.close()`æ¹æ³è¢«è°ç¨ã * `gen`ä¸`yield from`è¡¨è¾¾å¼æ±èç»ææ¯`inner_gen`è¿ä»£ç»ææ¶æåºç`StopIteration`å¼å¸¸ç第ä¸ä¸ªåæ° * `inner_gen`ä¸ç`return xxx`è¯å¥å®é ä¸ä¼æåºä¸ä¸ª`StopIteration(xxx)`å¼å¸¸ï¼ æä»¥`inner_gen`ä¸ç`return`å¼ä¼æä¸º`gen`ä¸ç`yield from`表达å¼çè¿åå¼ã