Day10 Python基础之特殊函数(八)
?一些特殊函數(shù)
1.遞歸函數(shù)(recursion)
? ? 遞歸函數(shù)的定義:在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身,這個(gè)函數(shù)就是遞歸函數(shù)。
遞歸函數(shù)的優(yōu)點(diǎn):是定義簡(jiǎn)單,邏輯清晰。理論上,所有的遞歸函數(shù)都可以寫成循環(huán)的方式,但循環(huán)的邏輯不如遞歸清晰。
遞歸函數(shù)的特性:
1. 必須有一個(gè)明確的結(jié)束條件
2. 每次進(jìn)入更深一層遞歸時(shí),問題規(guī)模相比上次遞歸都應(yīng)有所減少
3. 遞歸效率不高(建議少用),遞歸層次過多會(huì)導(dǎo)致棧溢出(在計(jì)算機(jī)中,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,
每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧就會(huì)減一層棧幀。由于棧的大小不是無限的,
? ?所以,遞歸調(diào)用的次數(shù)過多,會(huì)導(dǎo)致棧溢出。)
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 輸出結(jié)果:120 Factorial階乘? 1 # Fibonacci 返回第n項(xiàng)斐波那契數(shù)列的值(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 輸出結(jié)果:21 Fibonacci斐波那契數(shù)列(筆試經(jīng)常考)2.內(nèi)置函數(shù)
| 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() | ? |
重要的內(nèi)置函數(shù):
? ? ? ?1.?filter(function, sequence)
對(duì)sequence中的item依次執(zhí)行function(item),將執(zhí)行結(jié)果為True的item做成一個(gè)filter object的迭代器返回。可以看作是過濾函數(shù)。
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)) #迭代器,占用內(nèi)存空間很小,哆啦A夢(mèng) 9 print(ret) #輸出內(nèi)存地址 10 print(list(ret)) #轉(zhuǎn)換成列表輸出 11 輸出結(jié)果 12 <class 'filter'> 13 <filter object at 0x00B48710> 14 ['b', 'c', 'd'] filter? ??? ?2. map(function, sequence)
對(duì)sequence中的item依次執(zhí)行function(item),將執(zhí)行結(jié)果組成一個(gè)map object迭代器返回.map也支持多個(gè)sequence,這就要求function也支持相應(yīng)數(shù)量的參數(shù)輸入 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 輸出結(jié)果: 13 <class 'map'> 14 <map object at 0x02988790> 15 ['ahello', 'bhello', 'chello', 'dhello'] map
注:map和filter的區(qū)別是:filter只起過濾的作用,map可以對(duì)func2的返回值做處理
??3 reduce(function, sequence, starting_value)
對(duì)sequence中的item順序迭代調(diào)用function,如果有starting_value,還可以作為初始值調(diào)用.
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 輸出結(jié)果: 12 <class 'int'> 13 45 reduce???4 lambda
?匿名函數(shù)的命名規(guī)則,用lamdba?關(guān)鍵字標(biāo)識(shí),冒號(hào)(:)左側(cè)表示函數(shù)接收的參數(shù)(a,b)?,冒號(hào)(:)右側(cè)表示函數(shù)的返回值(a+b)。
因?yàn)閘amdba在創(chuàng)建時(shí)不需要命名,所以,叫匿名函數(shù)
1 #這是函數(shù)式編程的思想()我們通常是命令式編程思想) 2 3 from functools import reduce 4 print(reduce(lambda a,b:a*b,range(1,6))) 5 6 輸出結(jié)果 7 120 lamda?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/weinapang/p/9163633.html
總結(jié)
以上是生活随笔為你收集整理的Day10 Python基础之特殊函数(八)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「日常训练」 Mike and Fun
- 下一篇: SQL查询【根据生日计算】