5.4 ã€åŸºç¡€ã€‘å¿…å¦é«˜é˜¶å‡½æ•° ======================== 1. map 函数 ----------- map å‡½æ•°ï¼Œå®ƒæŽ¥æ”¶ä¸¤ä¸ªå‚æ•°ï¼Œç¬¬ä¸€ä¸ªå‚数是一个函数对象(当然也å¯ä»¥æ˜¯ä¸€ä¸ªlambda表达å¼ï¼‰ï¼Œç¬¬äºŒä¸ªå‚数是一个åºåˆ—。 它å¯ä»¥å®žçŽ°æ€Žæ ·çš„åŠŸèƒ½å‘¢ï¼Œæˆ‘ä¸¾ä¸ªä¾‹åä½ å°±æ˜Žç™½äº†ã€‚ .. code:: python >>> map(lambda x: x*2, [1,2,3,4,5]) [2, 4, 6, 8, 10] å¯ä»¥å¾ˆæ¸…楚地看到,它å¯ä»¥å°†åŽé¢åºåˆ—ä¸çš„æ¯ä¸€ä¸ªå…ƒç´ åšä¸ºå‚æ•°ä¼ å…¥lambdaä¸ã€‚ 当我们ä¸ä½¿ç”¨ map å‡½æ•°æ—¶ï¼Œä½ ä¹Ÿè®¸ä¼šè¿™æ ·å写。 .. code:: python mylist=[] for i in [1,2,3,4,5]: mylist.append(i*2) 2. filter 函数 -------------- filter 函数,和 map å‡½æ•°ç›¸ä¼¼ã€‚åŒæ ·ä¹Ÿæ˜¯æŽ¥æ”¶ä¸¤ä¸ªå‚数,一个lambda 表达å¼ï¼Œä¸€ä¸ªåºåˆ—。它会é历åŽé¢åºåˆ—䏿¯ä¸€ä¸ªå…ƒç´ ,并将其åšä¸ºå‚æ•°ä¼ å…¥lambda表达å¼ä¸ï¼Œå½“表达å¼è¿”回 Trueï¼Œåˆ™å…ƒç´ ä¼šè¢«ä¿ç•™ä¸‹æ¥ï¼Œå½“表达å¼è¿”回 False ï¼Œåˆ™å…ƒç´ ä¼šè¢«ä¸¢å¼ƒã€‚ 下é¢è¿™ä¸ªä¾‹å,将过滤出一个列表ä¸å°äºŽ0çš„å…ƒç´ ã€‚ .. code:: python >>>filter(lambda x: x < 0, range(-5, 5)) [-5, -4, -3, -2, -1] 3. reduce 函数 -------------- reduce 函数,也是类似的。它的作用是先对åºåˆ—ä¸çš„第 1ã€2 ä¸ªå…ƒç´ è¿›è¡Œæ“作,得到的结果å†ä¸Žç¬¬ä¸‰ä¸ªæ•°æ®ç”¨ lambda 函数è¿ç®—,将其得到的结果å†ä¸Žç¬¬å››ä¸ªå…ƒç´ 进行è¿ç®—,以æ¤ç±»æŽ¨ä¸‹åŽ»ç›´åˆ°åŽé¢æ²¡æœ‰å…ƒç´ 了。 .. image:: http://image.iswbm.com/20200930175131.png 这边举个例åä½ ä¹Ÿå°±æ˜Žç™½äº†ã€‚ .. code:: python >>>reduce(lambda x,y: x+y, [1,2,3,4,5]) 15 它的è¿ç®—è¿‡ç¨‹åˆ†è§£ä¸€ä¸‹æ˜¯è¿™æ ·çš„ã€‚ .. code:: python 1+2=3 3+3=6 6+4+10 10+5=15 4. 注æ„点 --------- ä»¥ä¸Šå‡ ä¸ªå‡½æ•°ï¼Œç†Ÿç»ƒçš„æŽŒæ¡å®ƒä»¬çš„写法,å¯ä»¥è®©æˆ‘们的代ç çœ‹èµ·æ¥æ›´åŠ çš„ Pythonic ,在æŸä¸€ç¨‹åº¦ä¸Šä»£ç çœ‹èµ·æ¥æ›´åŠ çš„ç®€æ´ã€‚ å¦‚æžœä½ æ˜¯æ–°æ‰‹å‘¢ï¼Œä½ éœ€è¦æ³¨æ„的是,以上示例是在 Python2.x 环境下演示的。而在 Python3.x ä¸ï¼Œå´æœ‰æ‰€ä¸åŒï¼Œä½ å¯ä»¥è‡ªå·±å°è¯•一下。 这里总结一下: 第一点,map å’Œ filter 函数返回的都ä¸å†æ˜¯ä¸€ä¸ªåˆ—表,而是一个è¿ä»£å™¨å¯¹è±¡ã€‚这里以map为例 .. code:: python >>> map_obj = map(lambda x: x*2, [1,2,3,4,5]) >>> from collections.abc import Iterator >>> isinstance(map_obj, Iterator) True >>> next(map_obj) 2 >>> list(map_obj) [4, 6, 8, 10] 第二点,reduce ä¸å¯ä»¥ç›´æŽ¥è°ƒç”¨ï¼Œè€Œæ˜¯è¦å…ˆå¯¼å…¥æ‰èƒ½ä½¿ç”¨ï¼Œ .. code:: python from functools import reduce