#ä¼ è¯´ä¸ç彿°ç¼åæ¡è§
å
³äºå½æ°çäºæ
ï¼æ»æ¯è¯´ä¸å®çï¼ä¸é¢å°±ç½åä¸äºç¼å彿°ç注æäºé¡¹ãç¹å«å£°æï¼è¿äºäºé¡¹ä¸æ¯ææ»ç»çï¼ææ¯ä»ä¸æ¬åå为ãLearning Pythonãç书éé¢æè¿æ¥çï¼é¡ºä¾¿åæäºæ±è¯ï¼å½ç¶ï¼æ¯æç
§èªå·±çè§è§ç¿»è¯çï¼éé¢ä¹å¤¹æäºä¸äºèªå·±çè§ç¹ãçå®ä¹å¯ä»¥ç解为æºäºãLearning Pythonãä½åæç¹å¿ä¸åã
- 彿°å
·æç¬ç«æ§ãä¹å°±æ¯å¸¸è¯´çä¸è¦æå¤ªå¼ºçè¦åæ§ãè¦è®©å½æ°è½å¤ç¬ç«äºå¤é¨çä¸è¥¿ãåæ°åreturnè¯å¥å°±æ¯å®ç°è¿ç§ç¬ç«æ§çæå¥½æ¹æ³ã
- å°½éä¸è¦ä½¿ç¨å
¨å±åéï¼è¿ä¹æ¯è®©å½æ°å
·æä½è¦ååº¦çæ¹æ³ãå
¨å±åéè½ç¶è¿è¡äºå½æ°å
å¤éä¿¡ï¼ä½æ¯å®å¼ºåäºå½æ°å¯¹å¤é¨çä¾èµï¼å¸¸å¸¸è®©å½æ°çä¿®æ¹åç¨åºè°è¯æ¯è¾éº»ç¦ã
- 妿忰ç对象æ¯å¯åç±»åçæ°æ®ï¼å¨å½æ°ä¸ï¼ä¸è¦å对å®çä¿®æ¹æä½ãå½ç¶ï¼æ´å¤æ¶åï¼åæ°ä¼ å
¥çæå¥½æ¯ä¸å¯åçã
- 彿°å®ç°çåè½åç®æ è¦åä¸åãæ¯ä¸ªå½æ°çå¼å¤´ï¼é½è¦æç®ççä¸å¥è¯æ¥è¯´ææ¬å½æ°çåè½åç®æ ã
- 彿°ä¸è¦å¤ªå¤§ï¼è½å°åå°ï¼æ ¹æ®å䏿¡çååï¼åè½ç®æ åä¸ï¼åä»£ç æ¡æ°å°±å°äºã妿æè§æç¹å¤§ï¼ççè½ä¸è½æè§£å¼ï¼åå«ä¸ºå ä¸ªå½æ°ã
- ä¸è¦ä¿®æ¹å¦å¤ä¸ä¸ªæ¨¡åæä»¶ä¸çåéãè¿è·åé¢çéçæ¯ä¸æ ·çï¼ç®çæ¯éä½è¦åæ§ã
##å°è¯ä¸ä¸éå½
对äºå¨pythonä¸ä½¿ç¨éå½ï¼æä¸é¡¹æè°¨æ
æåº¦ï¼è½ä¸ç¨å°±ä¸ç¨ï¼ä¸ºä»ä¹å¢ï¼ä¸æ¹é¢æ·±æèªå·±å¦èºä¸ç²¾ï¼å¦å¤ï¼éå½ä¸ä»
æ¶èèµæºï¼èä¸å¾å¤æ¶åé度ä¹ä¸å¦for循ç¯å¿«ã
ä¸è¿ï¼å为ç¨åºåï¼éå½è¿æ¯éè¦äºè§£çãè¿éå°±å举ä¸ä¸ªç®åçä¾åã
>>> def newsum(lst):
... if not lst:
... return 0
... else:
... return lst[0] + newsum(lst[1:])
...
>>> newsum([1,2,3])
6
è¿æ¯ä¸ä¸ªå¯¹listè¿è¡æ±åç彿°ï¼çå®å¯è½æ³å°äºï¼ä¸æ¯å¨python䏿ä¸ä¸ªsumå
ç½®å½æ°æ¥æ±åä¹ï¼ä¸ºä»ä¹è¦èªå·±åå¢ï¼æ¯çï¼å¨å®é
çç¼ç¨ä¸ï¼æ²¡æå¿
è¦èªå·±åï¼ç¨sumå°±å¯ä»¥äºãè¿éç¨è¿ä¸ªä¾åï¼çº¯ç²¹æ¯ä¸ºäºè¯´æéå½ï¼æ²¡æç¼ç¨å®è·µçæä¹ï¼ï¼å½ç¶ï¼ææ²¡æå¤æä¼ ç»å½æ°çåæ°æ¯å¦ä¸ºå®å
¨ç±æ°åç»æçlistï¼æä»¥ï¼å¦æè¾å
¥çlistä¸åæ¯ï¼å°±ä¼ç¼ç¨è¿æ ·äºï¼
>>> newsum([1,2,3,'q'])
Traceback (most recent call last):
File "", line 1, in
File "", line 5, in newsum
File "", line 5, in newsum
File "", line 5, in newsum
File "", line 5, in newsum
TypeError: cannot concatenate 'str' and 'int' objects
è¿å°±æ¯æ¬å½æ°ç缺æ¾äºã使¯ï¼ä¸ºäºè¯´æéå½ï¼æä»¬å°±é¡¾ä¸äºè¿ä¹å¤äºãæä¸å¿½ç¥è¿ä¸ªç¼ºæ¾ãç宿³¨æä¸é¢ç彿°ä¸ï¼æä¸å¥ï¼return lst(0)+newsum(lst[1:])ï¼å¨è¿å¥è¯ä¸ï¼åè°ç¨äºä¸è¾¹å½æ°æ¬èº«ã对äºï¼è¿å°±éå½ï¼å¨å½æ°ä¸è°ç¨æ¬å½æ°èªå·±ãå½ç¶ï¼åºå«å¨äºä¼ å
¥çåæ°æååäºãä¸ºäºæ¸
é¤å½æ°çè°ç¨æµç¨ï¼æä»¬å¯ä»¥å°æ¯æ¬¡ä¼ å
¥çåæ°æå°åºæ¥ï¼
>>> def newsum(lst):
... print lst
... if not lst:
... return 0
... else:
... return lst[0] + newsum(lst[1:])
...
>>> newsum([1,2,3])
[1, 2, 3]
[2, 3]
[3]
[]
6
è¿å°±æ¯éå½äºã
å
¶å®ï¼çå®æè®¸å·²ç»æ³å°äºï¼å³ä½¿ä¸ç¨sumï¼ä¹å¯ä»¥ç¨foræ¥äºé¡¹ä¸è¿°æä½ã
>>> lst = [1,2,3]
>>> sum_result = 0
>>> for x in lst: sum_result += x
...
>>> sum_result
6
##éè®°ï¼å½æ°æ¯å¯¹è±¡
è¿è®°å¾ï¼å¨ç¬¬ä¸é¨åå¦ä¹ çæ¶åï¼ä¸æå¼ºè°çï¼**åéæ ç±»åï¼æ°æ®æç±»å**ï¼é£æ¶åéå°çæ°æ®å
æ¬åç¬¦ä¸²ãæ°å¼ãå表ãå
ç»ãåå
¸ãæä»¶ï¼è¿äºä¸è¥¿ï¼é½è¢«è§ä¸ºå¯¹è±¡ã彿°è·å®ä»¬ç±»ä¼¼ï¼ä¹æ¯å¯¹è±¡ãå æ¤å°±å¯ä»¥å以åçå¯¹è±¡ä¸æ ·è¿è¡èµå¼ãä¼ éç»å
¶å®å½æ°ãåµå
¥å°æ°æ®ç»æãä»ä¸ä¸ªå½æ°è¿åç»å¦ä¸ä¸ªå½æ°ççé¢å对象çæä½ãå½ç¶ï¼å½æ°è¿ä¸ªå¯¹è±¡ä¹æç¹æ®æ§ï¼å°±æ¯å®å¯ä»¥ç±ä¸ä¸ªå½æ°è¡¨è¾¾å¼åé¢çæ¬å·ä¸çåè¡¨åæ°è°ç¨ã
>>> def newsum(lst): #ä¾ç¶ä»¥è¿ä¸ªéå½ç彿°ä¸ºä¾
... print lst
... if not lst:
... return 0
... else:
... return lst[0] + newsum(lst[1:])
...
>>> lst = [1,2,3]
>>> newsum(lst) #è¿æ¯åé¢å·²ç»å¸¸ç¨çæ¹æ³
[1, 2, 3]
[2, 3]
[3]
[]
6
>>> recusion_fun = newsum #éè¿èµå¼è¯å¥ï¼è®©åérecusion_funä¹å¼ç¨äºå½æ°newsum(lst)对象
>>> recusion_fun(lst) #ä»èåéè½å¤å®ç°çå彿°è°ç¨çæä½
[1, 2, 3]
[2, 3]
[3]
[]
6
åçä¸ä¸ªä¾åï¼å¨è¿ä¸ªä¾åä¸ï¼ä¸å®è¦è°¨è®°å½æ°æ¯å¯¹è±¡ãç宿¾è®°å¦ï¼å¨listä¸ï¼å¯ä»¥å®¹çº³ä»»ä½å¯¹è±¡ï¼é£ä¹ï¼æ¯å¦è½å¤å®¹çº³ä¸ä¸ªå½æ°ä¸å¢ï¼
>>> fun_list = [(newsum,[1,2,3]),(newsum,[1,2,3,4,5])]
>>> for fun,arg in fun_list:
... fun(arg)
...
[1, 2, 3]
[2, 3]
[3]
[]
6
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
15
彿°ï¼ççå°±æ¯å¯¹è±¡åã
æ¢ç¶æ¯å¯¹è±¡ï¼å°±å¯ä»¥ç¨dir(object)æ¹å¼æ¥çæå
³ä¿¡æ¯å½ï¼
>>> dir(newsum)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
>>> dir(newsum.__code__)
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']
>>> newsum.__code__.__doc__
'code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.'
>>> newsum.__code__.co_varnames
('lst',)
>>> newsum.__code__.co_argcount
1
æä»¥ï¼åä½çå®ï¼å¨ä½¿ç¨å½æ°çæ¶åï¼é¦å
è¦æå®æ¾å¨å¯¹è±¡çå±é¢èéï¼å®ä¸æ¯ä»ä¹ç¹æ®çä¸è¥¿ï¼å°½ç®¡æä»¬ä½¿ç¨äºä¸å°ç¯å¹
讲述å®ï¼ä½å®ç»å½è¿æ¯ä¸ä¸ªå¯¹è±¡ã