>Ever since the creation of the world his eternal power dan divine nature, invisible though they are , have been understood and seen through the things ha has made. So they are without excuse; for they knew God, they did not honor him as God or give thanks to him, but they became futile in their thinking, and their senseless minds were darkened. Claiming to be wise, they became fools; and they exchange the glory of the immorrtal God for images resembling a mortal human being or birds or four-footed animals or reptiles. (ROMANS 1:20-23) #彿°(6) ##å ä¸ªç¹æ®å½æ° å¨pythonä¸ï¼æå 个ç¹å«ç彿°ï¼å®ä»¬å¸¸å¸¸è¢«ç忝Pythonè½å¤è¿è¡æè°â彿°å¼ç¼ç¨âçè§è¯ï¼è½ç¶æè®¤ä¸ºPythonä¸å¯è½èµ°ä¸é£æ¡åå±éè·¯ã >妿以忲¡æå¬è¿ï¼çä½ å¼å§è¿å ¥ç¼ç¨çï¼ä¹ä¼ç»å¸¸å¬äººè¯´â彿°å¼ç¼ç¨âãâé¢å对象ç¼ç¨âãâæä»¤å¼ç¼ç¨âçå±äºãå®ä»¬æ¯ä»ä¹å¢ï¼è¿ä¸ªè¯é¢è¦ä»âç¼ç¨èå¼â讲起ãï¼ä»¥ä¸å 容æºèªç»´åºç¾ç§ï¼ >ç¼ç¨èåæç¼ç¨èå¼ï¼è±è¯ï¼Programming paradigmï¼ï¼ï¼è峿¨¡è乿ï¼èå¼å³æ¨¡å¼ãæ¹æ³ï¼ï¼æ¯ä¸ç±»å ¸åçç¼ç¨é£æ ¼ï¼æ¯æä»äºè½¯ä»¶å·¥ç¨çä¸ç±»å ¸åç飿 ¼ï¼å¯ä»¥å¯¹ç §æ¹æ³å¦ï¼ãå¦ï¼å½æ°å¼ç¼ç¨ãç¨åºç¼ç¨ãé¢å对象ç¼ç¨ãæä»¤å¼ç¼ç¨çç为ä¸åçç¼ç¨èåã >ç¼ç¨èåæä¾äºï¼åæ¶å³å®äºï¼ç¨åºå对ç¨åºæ§è¡ççæ³ãä¾å¦ï¼å¨é¢å对象ç¼ç¨ä¸ï¼ç¨åºå认为ç¨åºæ¯ä¸ç³»åç¸äºä½ç¨ç对象ï¼èå¨å½æ°å¼ç¼ç¨ä¸ä¸ä¸ªç¨åºä¼è¢«ç使¯ä¸ä¸ªæ ç¶æç彿°è®¡ç®ç串è¡ã >æ£å¦è½¯ä»¶å·¥ç¨ä¸ä¸åç群ä½ä¼æå¡ä¸åçâæ¹æ³å¦â䏿 ·ï¼ä¸åçç¼ç¨è¯è¨ä¹ä¼æå¡ä¸åçâç¼ç¨èåâãä¸äºè¯è¨æ¯ä¸é¨ä¸ºæä¸ªç¹å®çèå设计çï¼å¦SmalltalkåJavaæ¯æé¢å对象ç¼ç¨ï¼èHaskellåScheme忝æå½æ°å¼ç¼ç¨ï¼ï¼åæ¶è¿æå¦ä¸äºè¯è¨æ¯æå¤ç§èåï¼å¦RubyãCommon LispãPythonåOzï¼ã >ç¼ç¨èååç¼ç¨è¯è¨ä¹é´çå ³ç³»å¯è½åå夿ï¼ç±äºä¸ä¸ªç¼ç¨è¯è¨å¯ä»¥æ¯æå¤ç§èåãä¾å¦ï¼C++设计æ¶ï¼æ¯æè¿ç¨åç¼ç¨ãé¢å对象ç¼ç¨ä»¥åæ³åç¼ç¨ãç¶èï¼è®¾è®¡å¸åç¨åºå们è¦èèå¦ä½ä½¿ç¨è¿äºèåå ç´ æ¥æå»ºä¸ä¸ªç¨åºãä¸ä¸ªäººå¯ä»¥ç¨C++ååºä¸ä¸ªå®å ¨è¿ç¨åçç¨åºï¼å¦ä¸ä¸ªäººä¹å¯ä»¥ç¨C++ååºä¸ä¸ªçº¯ç²¹çé¢å对象ç¨åºï¼çè³è¿æäººå¯ä»¥ååºææäºä¸¤ç§èåçç¨åºã ä¸ç®¡è¯»è æ¯åå¦è¿æ¯èæ²¹æ¡ï¼é½å»ºè®®å°ä¸é¢è¿æ®µè¯è®¤ç读å®ï¼ä¸ç®¡çè§£è¿æ¯ä¸çè§£ï¼æ»è½æç¹æè§çã æ£å¦åé¢å¼æä¸æè¯´çï¼Pythonæ¯æ¯æå¤ç§èåçè¯è¨ï¼å¯ä»¥è¿è¡æè°å½æ°å¼ç¼ç¨ï¼å ¶çªåºä½ç°å¨æè¿ä¹å ä¸ªå½æ°ï¼filterãmapãreduceãlambdaãyieldã æäºå®ä»¬ï¼æå¤§ç好夿¯ç¨åºæ´ç®æ´ï¼æ²¡æå®ä»¬ï¼ç¨åºä¹å¯ä»¥ç¨å«çæ¹å¼å®ç°ï¼ä¹ä¸ä¸å®éº»ç¦ï¼æè ç¸å·®æ å ã å æ¤ï¼å¨ç¼ç¨å®è·µä¸ï¼å¯ä»¥ä¸ç¨è¿äºç¹æ®å½æ°ï¼ä½æ¬çèºä¸åèº«çæ³æ³ï¼è¿æ¯è¦ä»ç»ï¼å¹¶ä¸æ°å½å°ä½¿ç¨è¿å ä¸ªå½æ°ï¼è½è®©å«äººæè§ä½ æ´çXã ï¼æ³¨ï¼æ¬èä¸å¯¹yieldè¿è¡ä»ç»ï¼è¯·é 读[ãçæå¨ã](./215.md)ï¼ ###lambda lambda彿°ï¼æ¯ä¸ä¸ªåªç¨ä¸è¡å°±è½è§£å³é®é¢ç彿°ï¼å¬çæ¯å¤ä¹è¯±äººåãçä¸é¢çä¾åï¼ >>> def add(x): ... x += 3 ... return x ... >>> numbers = range(10) >>> numbers [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> new_numbers = [] >>> for i in numbers: ... new_numbers.append(add(i)) ... >>> new_numbers [3, 4, 5, 6, 7, 8, 9, 10, 11, 12] å¨è¿ä¸ªä¾åä¸ï¼add()åªæ¯ä¸ä¸ªä¸é´æä½ãå½ç¶ï¼ä¸é¢çä¾åå®å ¨å¯ä»¥ç¨å«çæ¹å¼å®ç°ãæ¯å¦ï¼ >>> new_numbers = [ i+3 for i in numbers ] >>> new_numbers [3, 4, 5, 6, 7, 8, 9, 10, 11, 12] é¦å 说æï¼è¿ç§å表解æçæ¹å¼æ¯é常é常好çã 使¯ï¼æä»¬ååè¦ç¨lambdaè¿ä¸ªå½æ°æ¿ä»£`add(x)`ã >>> lam = lambda x:x+3 >>> n2 = [] >>> for i in numbers: ... n2.append(lam(i)) ... >>> n2 [3, 4, 5, 6, 7, 8, 9, 10, 11, 12] è¿éç`lam`å°±ç¸å½äº`add(x)`ï¼è¿ä¸è¡`lambda x:x+3`就宿`add(x)`彿°ä½éé¢ç两è¡ãè¿å¯ä»¥åè¿æ ·çä¾åï¼ >>> g = lambda x, y: x + y >>> g(3, 4) 7 >>> (lambda x : x ** 2)(4) #è¿å4çå¹³æ¹ 16 éè¿ä¸é¢ä¾åï¼æ»ç»ä¸ä¸lambda彿°çä½¿ç¨æ¹æ³ï¼ - å¨lambdaåé¢ç´æ¥è·åé - åéå颿¯åå· - åå·å颿¯è¡¨è¾¾å¼ï¼è¡¨è¾¾å¼è®¡ç®ç»æå°±æ¯æ¬å½æ°çè¿åå¼ ä¸ºäºç®ææ¼è¦ï¼ç¨ä¸ä¸ªå¼å表示æ¯å¿ è¦çï¼ lambda arg1, arg2, ...argN : expression using arguments è¦ç¹å«æéï¼è½ç¶lambda 彿°å¯ä»¥æ¥æ¶ä»»æå¤ä¸ªåæ° (å æ¬å¯éåæ°) å¹¶ä¸è¿åå个表达å¼çå¼ï¼ä½æ¯**lambda 彿°ä¸è½å å«å½ä»¤ï¼å å«ç表达å¼ä¸è½è¶ è¿ä¸ä¸ªãä¸è¦è¯å¾å lambda 彿°ä¸å¡å ¥å¤ªå¤çä¸è¥¿ï¼å¦æä½ éè¦æ´å¤æçä¸è¥¿ï¼åºè¯¥å®ä¹ä¸ä¸ªæ®é彿°ï¼ç¶åæ³è®©å®å¤é¿å°±å¤é¿ã** å°±lambdaèè¨ï¼å®å¹¶æ²¡æç»ç¨åºå¸¦æ¥æ§è½ä¸çæåï¼å®å¸¦æ¥çæ¯ä»£ç çç®æ´ãæ¯å¦ï¼è¦æå°ä¸å表ï¼éé¢ä¾æ¬¡æ¯æä¸ªæ°åç1次æ¹ï¼äºæ¬¡æ¹ï¼ä¸æ¬¡æ¹ï¼å次æ¹ãç¨lambdaå¯ä»¥è¿æ ·åï¼ >>> lamb = [ lambda x:x, lambda x:x**2, lambda x:x**3, lambda x:x**4 ] >>> for i in lamb: ... print i(3), ... 3 9 27 81 lambdaå为ä¸ä¸ªåè¡ç彿°ï¼å¨ç¼ç¨å®è·µä¸ï¼å¯ä»¥éæ©ä½¿ç¨ã ##map å çä¸ä¸ªä¾åï¼è¿æ¯ä¸é¢è®²è¿°lambdaçæ¶å第ä¸ä¸ªä¾åï¼ç¨mapä¹è½å¤å®ç°ï¼ >>> numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> map(add, numbers) [3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >>> map(lambda x: x+3, numbers) #ç¨lambdaå½ç¶å¯ä»¥å¦ [3, 4, 5, 6, 7, 8, 9, 10, 11, 12] map()æ¯pythonçä¸ä¸ªå ç½®å½æ°ï¼å®çåºæ¬æ ·å¼æ¯`map(func,seq)`ã funcæ¯ä¸ä¸ªå½æ°ï¼seqæ¯ä¸ä¸ªåºå对象ã卿§è¡çæ¶åï¼åºå对象ä¸çæ¯ä¸ªå ç´ ï¼æç §ä»å·¦å°å³ç顺åºï¼ä¾æ¬¡è¢«ååºæ¥ï¼å¡å ¥å°funcé£ä¸ªå½æ°éé¢ï¼å¹¶å°funcçè¿åå¼ä¾æ¬¡åå°ä¸ä¸ªå表ä¸ã å¨åºç¨ä¸ï¼mapçæè½å®ç°çï¼ä¹å¯ä»¥ç¨å«çæ¹å¼å®ç°ãæ¯å¦ï¼ >>> items = [1,2,3,4,5] >>> squared = [] >>> for i in items: ... squared.append(i**2) ... >>> squared [1, 4, 9, 16, 25] >>> def sqr(x): return x**2 ... >>> map(sqr,items) [1, 4, 9, 16, 25] >>> map(lambda x: x**2, items) [1, 4, 9, 16, 25] >>> [ x**2 for x in items ] #è¿ä¸ªææå欢äºï¼ä¸è¬æ åµä¸é度足å¤å¿«ï¼èä¸å¯è¯»æ§å¼º [1, 4, 9, 16, 25] æ¡æ¡å¤§è·¯éç½é©¬ï¼ä»¥ä¸æ¹æ³ï¼å¨ç¼ç¨ä¸ï¼èªå·±æ ¹æ®éè¦æ¥éç¨å¦ã å¨ä»¥ä¸ææ§è®¤è¯çåºç¡ä¸ï¼å¨æ¥æµè§æå ³map()ç宿¹è¯´æï¼è½å¤æ´æç½ä¸äºã >map(function, iterable, ...) >Apply function to every item of iterable and return a list of the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. If one iterable is shorter than another it is assumed to be extended with None items. If function is None, the identity function is assumed; if there are multiple arguments, map() returns a list consisting of tuples containing the corresponding items from all iterables (a kind of transpose operation). The iterable arguments may be a sequence or any iterable object; the result is always a list. çè§£è¦ç¹ï¼ - 对å¯è¿ä»£å¯¹è±¡ä¸çæ¯ä¸ªå ç´ ï¼ä¾æ¬¡åºç¨functionçæ¹æ³ï¼å½æ°ï¼ï¼è¿æ¬è´¨ä¸å°±æ¯ä¸ä¸ªfor循ç¯ï¼ã - å°ææç»æè¿åä¸ä¸ªå表ã - 妿忰å¾å¤ï¼å对é£äºåæ°å¹¶è¡æ§è¡functionã ä¾å¦ï¼ >>> lst1 = [1, 2, 3, 4, 5] >>> lst2 = [6, 7, 8, 9, 0] >>> map(lambda x, y: x + y, lst1, lst2) #å°ä¸¤ä¸ªå表ä¸ç对åºé¡¹å èµ·æ¥ï¼å¹¶è¿åä¸ä¸ªç»æå表 [7, 9, 11, 13, 5] ä¸é¢è¿ä¸ªä¾å妿ç¨forå¾ªç¯æ¥åï¼è¿ä¸æ¯å¾é¾ï¼å¦ææ©å±ä¸ä¸ï¼ä¸é¢çä¾åç¨foræ¥æ¹åï¼å°±è¦å°å¿äºï¼ >>> lst1 = [1, 2, 3, 4, 5] >>> lst2 = [6, 7, 8, 9, 0] >>> lst3 = [7, 8, 9, 2, 1] >>> map(lambda x,y,z: x+y+z, lst1, lst2, lst3) [14, 17, 20, 15, 6] è¿ææ¾ç¤ºåºmapçç®æ´ä¼é ã ##reduce é¦å 声æï¼å¦æè¯»è 使ç¨çæ¯Python3ï¼è·ä¸é¢æç¹ä¸ä¸æ ·ï¼å 为å¨Python3ä¸ï¼`reduce()`å·²ç»ä»å ¨å±å½å空é´ä¸ç§»é¤ï¼æ¾å°äºfunctools模åä¸ï¼å¦æè¦æ¯ç¨ï¼éè¦ç¨`from functools import reduce`å¼å ¥ä¹ã åçè¿ä¸ªï¼ >>> reduce(lambda x,y: x+y,[1, 2, 3, 4, 5]) 15 请ä»ç»è§å¯ï¼æ¯å¦è½å¤çåºæ¯å¦ä½è¿ç®çå¢ï¼ç»ä¸ä¸ªå¾ï¼  è¿è®°å¾mapæ¯æä¹è¿ç®çåï¼å¿äºï¼ç代ç ï¼ >>> list1 = [1,2,3,4,5,6,7,8,9] >>> list2 = [9,8,7,6,5,4,3,2,1] >>> map(lambda x,y: x+y, list1,list2) [10, 10, 10, 10, 10, 10, 10, 10, 10] 对æ¯ä¸ä¸ï¼å°±ç¥é两个çåºå«äºã忥mapæ¯ä¸ä¸è¿ç®ï¼reduceæ¯æ¨ªçé个å ç´ è¿è¡è¿ç®ã æå¨çè§£éæ¥èªå®ç½ï¼ >reduce(function, iterable[, initializer]) >Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned. Roughly equivalent to: def reduce(function, iterable, initializer=None): it = iter(iterable) if initializer is None: try: initializer = next(it) except StopIteration: raise TypeError('reduce() of empty sequence with no initial value') accum_value = initializer for x in it: accum_value = function(accum_value, x) return accum_value å¦æç¨æä»¬çæçforå¾ªç¯æ¥åä¸é¢reduceçäºæ ï¼å¯ä»¥è¿æ ·æ¥åï¼ >>> lst = range(1,6) >>> lst [1, 2, 3, 4, 5] >>> r = 0 >>> for i in range(len(lst)): ... r += lst[i] ... >>> r 15 foræ®ä¸çï¼reduceæ¯ç®æ´çã 为äºé»ç¼æç»´ï¼çè¿ä¹ä¸ä¸ªé®é¢ï¼æä¸¤ä¸ªlistï¼`a = [3,9,8,5,2]`ï¼`b=[1,4,9,2,6]`ï¼è®¡ç®ï¼a[0]*b[0]+a[1]*b[1]+...çç»æã >>> a = [3, 9, 8, 5, 2] >>> b = [1, 4, 9, 2, 6] >>> zip(a,b) #å¤ä¹ ä¸ä¸zipï¼ä¸é¢çæ¹æ³ä¸è¦ç¨å° [(3, 1), (9, 4), (8, 9), (5, 2), (2, 6)] >>> sum(x*y for x,y in zip(a,b)) #è§£æåç´æ¥æ±å 133 >>> new_list = [x*y for x,y in zip(a,b)] >>> #è¿æ ·ä¹å¯ä»¥ï¼new_tuple = (x*y for x,y in zip(a,b))ï¼ä¸ä¸é¢çåºå«ï¼åç»ä¼è®²å° >>> new_list [3, 36, 72, 10, 12] >>> sum(new_list) #æè :sum(new_tuple) 133 >>> reduce(lambda sum,(x,y): sum+x*y,zip(a,b),0) #è¿ä¸ªæ¹æ³æ¯å¨èé ·å¢åï¼ 133 >>> from operator import add, mul #èé ·çæ¹æ³ä¹ä¸æ¢ä¸ä¸ª >>> reduce(add, map(mul, a, b)) 133 >>> reduce(lambda x,y: x+y, map(lambda x,y: x*y, a,b)) #map,reduce,lambdaé½é½å ¨äºï¼æ´é ·åï¼ 133 å¨Python 2ä¸ï¼å¦æä½¿ç¨map/reduceä¹ç±»ï¼å¯è½æéå°æ§è½ä¸ç¨³å®çæ åµï¼å¦ææ¯Python 3ï¼å°±æ¾å¿å¤äºï¼ä¸ä» æ§è½ç¨³å®ï¼èä¸é度足å¤å¿«ã 使¯ï¼æè¿æ¯æ´æ¨è使ç¨å表解æï¼å 为å®å¯è¯»æ§æ´å¥½ï¼ä½ æ æ³ä¿è¯éåé½è·ä½ 䏿 ·ã ##filter filterç䏿å«ä¹æ¯âè¿æ»¤å¨âï¼å¨Pythonä¸ï¼å®å°±æ¯èµ·å°äºè¿æ»¤å¨çä½ç¨ãé¦å ç宿¹è¯´æï¼ >filter(function, iterable) >Construct a list from those elements of iterable for which function returns true. iterable may be either a sequence, a container which supports iteration, or an iterator. If iterable is a string or a tuple, the result also has that type; otherwise it is always a list. If function is None, the identity function is assumed, that is, all elements of iterable that are false are removed. >Note that filter(function, iterable) is equivalent to [item for item in iterable if function(item)] if function is not None and [item for item in iterable if item] if function is None. è¿æ¬¡ççä¸ç¿»è¯äºï¼å¥½å以å¾ä¹æ²¡ææä¹ç¿»è¯åï¼ï¼èä¸ä¹ä¸è§£éè¦ç¹äºã请åä½å¡å¿ èªå·±é 读ä¸é¢çæåï¼å¹¶ä¸çè§£å ¶å«ä¹ãè±è¯ï¼æ 论æä¹å¼ºè°é½æ¯ä¸è¿åçï¼åªææ¯åä¹ä¸ï¼è¯´ä¸¤å¥è±è¯ï¼æ²¡åè¿å¯ä»¥è®¨å°è±éç¾å å¢ã éè¿ä¸é¢ä»£ç ä½ä¼ï¼ >>> numbers = range(-5,5) >>> numbers [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] >>> filter(lambda x: x>0, numbers) [1, 2, 3, 4] >>> [x for x in numbers if x>0] #ä¸ä¸é¢é£å¥çæ [1, 2, 3, 4] >>> filter(lambda c: c!='i', 'qiwsir') #è½ä¸è½å¯¹åºä¸é¢ææ¡£è¯´æé£å¥è¯å¢ï¼ 'qwsr' #âIf iterable is a string or a tuple, the result also has that type;â è³æ¤ï¼ä»ç»äºå ä¸ªå½æ°ï¼è¿äºå½æ°å¨å¯¹ç¨åºçæ§è½æé«ä¸ï¼å¹¶æ²¡ææ¾èæè 稳å®é¢æï¼ä½æ¯ï¼å¨ä»£ç çç®æ´ä¸ï¼æ¯æç®å ±ç¹çãææ¶åæ¯å¯ä»¥ç¨æ¥ç§ä¸ç§ï¼å½°æ¾pythonçä¼é åèªå·±èé ·ãå¦ä½ç¨ãæä¹ç¨ï¼çä½ èªå·±çå好äºã ä¸è¿ï¼ç¼ç¨çæ¶åï¼å¾å¾ä¸è½é å纯èªå·±çå好ï¼è¿å¾èèéåã ------ [æ»ç®å½](./index.md) | [ä¸èï¼å½æ°(5)](./242.md) | [ä¸èï¼å½æ°ç»ä¹ ](./205.md) å¦æä½ è®¤ä¸ºæå¿ è¦æèµæï¼è¯·éè¿æ¯ä»å®ï¼**[email protected]**,ä¸èææ¿ã