Day10 Python基础之特殊函数(八)
?一些特殊函數
1.遞歸函數(recursion)
? ? 遞歸函數的定義:在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
遞歸函數的優點:是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。
遞歸函數的特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
3. 遞歸效率不高(建議少用),遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,
每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由于棧的大小不是無限的,
? ?所以,遞歸調用的次數過多,會導致棧溢出。)
1 def fac(n): 2 multi=1 3 for i in range(1,n+1): 4 multi=multi*i 5 return multi 6 7 print(fac(5)) 8 9 10 def fac_new(n): 11 if n==1: 12 return 1 13 return n*fac_new(n-1) 14 15 print(fac_new(5)) 16 17 輸出結果:120 Factorial階乘? 1 # Fibonacci 返回第n項斐波那契數列的值(0,1,1 2 3 5 8 13 21 34...) 2 def fibo(n): 3 if n<=1: 4 return n 5 return fibo(n-1)+fibo(n-2) 6 7 print(fibo(8)) 8 輸出結果:21 Fibonacci斐波那契數列(筆試經常考)2.內置函數
| abs() | dict() | help() | min() | setattr() |
| all() | dir() | hex() | next() | slice() |
| any() | divmod() | id() | object() | sorted() |
| ascii() | enumerate() | input() | oct() | staticmethod() |
| bin() | eval() | int() | open() | str() |
| bool() | exec() | isinstance() | ord() | sum() |
| bytearray() | filter() | issubclass() | pow() | super() |
| bytes() | float() | iter() | print() | tuple() |
| callable() | format() | len() | property() | type() |
| chr() | frozenset() | list() | range() | vars() |
| classmethod() | getattr() | locals() | repr() | zip() |
| compile() | globals() | map() | reversed() | __import__() |
| complex() | hasattr() | max() | round() | ? |
| delattr() | hash() | memoryview() | set() | ? |
重要的內置函數:
? ? ? ?1.?filter(function, sequence)
對sequence中的item依次執行function(item),將執行結果為True的item做成一個filter object的迭代器返回。可以看作是過濾函數。
1 str=['a','b','c','d'] 2 def fun1(n): 3 if n!='a': 4 return n 5 6 ret=filter(fun1,str) 7 8 print(type(ret)) #迭代器,占用內存空間很小,哆啦A夢 9 print(ret) #輸出內存地址 10 print(list(ret)) #轉換成列表輸出 11 輸出結果 12 <class 'filter'> 13 <filter object at 0x00B48710> 14 ['b', 'c', 'd'] filter? ??? ?2. map(function, sequence)
對sequence中的item依次執行function(item),將執行結果組成一個map object迭代器返回.map也支持多個sequence,這就要求function也支持相應數量的參數輸入 1 str=['a','b','c','d'] 2 def fun2(n): 3 return n+'hello' 4 5 ret=map(fun2,str) 6 7 print(type(ret)) 8 print(ret) 9 print(list(ret)) 10 11 12 輸出結果: 13 <class 'map'> 14 <map object at 0x02988790> 15 ['ahello', 'bhello', 'chello', 'dhello'] map
注:map和filter的區別是:filter只起過濾的作用,map可以對func2的返回值做處理
??3 reduce(function, sequence, starting_value)
對sequence中的item順序迭代調用function,如果有starting_value,還可以作為初始值調用.
1 from functools import reduce 2 str=['a','b','c','d'] 3 def fun3(x,y): 4 return x+y 5 6 ret=reduce(fun3,range(1,10)) 7 8 print(type(ret)) 9 print(ret) 10 11 輸出結果: 12 <class 'int'> 13 45 reduce???4 lambda
?匿名函數的命名規則,用lamdba?關鍵字標識,冒號(:)左側表示函數接收的參數(a,b)?,冒號(:)右側表示函數的返回值(a+b)。
因為lamdba在創建時不需要命名,所以,叫匿名函數
1 #這是函數式編程的思想()我們通常是命令式編程思想) 2 3 from functools import reduce 4 print(reduce(lambda a,b:a*b,range(1,6))) 5 6 輸出結果 7 120 lamda?
?
?
?
轉載于:https://www.cnblogs.com/weinapang/p/9163633.html
總結
以上是生活随笔為你收集整理的Day10 Python基础之特殊函数(八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「日常训练」 Mike and Fun
- 下一篇: SQL查询【根据生日计算】