python全棧開發-Day12 三元表達式、函數遞歸、匿名函數、內置函數
一、 三元表達式
一 、三元表達式
僅應用於:
1、條件成立返回,一個值
2、條件不成立返回 ,一個值
def max2(x,y): #普通函數定義 if x > y: return x else: return y res=max2(10,11) print(res) # res=x if x > y else y #三元表達式 # print(res) #def max2(x,y): #return x if x > y else y #代碼簡潔,方便#print(max2(10,11))
二、 遞歸
一 、遞歸調用的定義
遞歸調用是函數嵌套調用的一種特殊形式,函數在調用時,直接或間接調用了自身,就是遞歸調用
#直接調用 def foo(): print(‘from foo‘) foo() #foo() #間接調用 def bar(): print(‘from bar‘) foo() def foo(): print(‘from foo‘) bar() #foo()
二、 遞歸分為兩個階段:遞推,回溯
1、回溯
(註意:一定要在滿足某種條件結束回溯,否則就會無限遞歸)
#圖解。。。 # salary(5)=salary(4)+300 # salary(4)=salary(3)+300 # salary(3)=salary(2)+300 # salary(2)=salary(1)+300 # salary(1)=100 # # salary(n)=salary(n-1)+300 n>1 # salary(1) =100 n=1 def salary(n): if n == 1: return 100 return salary(n-1)+300 print(salary(5))
三 、python中的遞歸效率低且沒有尾遞歸優化
總結遞歸的使用:
1、 必須有一個明確的結束條件
2、 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
3、 遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,
棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出
四 、可以修改遞歸最大深度
import sys sys.getrecursionlimit() #系統默認的可遞歸次數1000 sys.setrecursionlimit(2000) # 調整可遞歸為2000
三、 匿名函數
一 、什麽是匿名函數?
#匿名就是沒有名字 def func(x,y,z=1): return x+y+z #匿名 lambda x,y,z=1:x+y+z #與函數有相同的作用域,但是匿名意味著引用計數為0,使用一次就釋放,除非讓其有名字 func=lambda x,y,z=1:x+y+z func(1,2,3) #讓其有名字就沒有意義
二、匿名的特點:
1、匿名的目的就是沒有名字,給匿名函數賦給一個名字是沒有意義的
2、匿名函數的參數規則、作用域關系與有名函數是一樣
3、匿名函數的函數體通常應該是一個表達式,該表達式必須要有一個返回值
三 、有名字的函數與匿名函數的對比
有名函數:循環使用,保存了名字,通過名字就可以重復引用函數功能
匿名函數:一次性使用,隨時隨時定義 應用:max,min,sorted,map,filter
salaries={ ‘egon‘:3000, ‘alex‘:100000000, ‘wupeiqi‘:10000, ‘yuanhao‘:2000 } # 求工資最高的那個人是誰 #print(max(salaries,key=lambda x:salaries[x])) #‘egon‘ 3000 # 求工資最低的那個人是誰 # print(min(salaries,key=lambda x:salaries[x]))
四、內置模塊
註意:內置函數id()可以返回一個對象的身份,返回值為整數。
這個整數通常對應與該對象在內存中的位置,但這與python的具體實現有關,不應該作為對身份的定義,即不夠精準,最精準的還是以內存地址為準。
is運算符用於比較兩個對象的身份,等號比較兩個對象的值,內置函數type()則返回一個對象的類型
#更多內置函數:https://docs.python.org/3/library/functions.html?highlight=built#ascii
二、內置函數詳情
1、abs(x)
功能:取數的絕對值
1 2 |
>>> abs ( - 1 ) #取-1的絕對值
1
|
2、all(iterable)
功能:如果這個可叠代的元素都為真,則返回真(非0的就為真,負數也是為真)
1 2 3 4 |
>>> all ([ 0 , 9 ,- 3 ]) #有0,說明為假
False
>>> all ([- 1 ,
5 , 6 ]) #負數也是為真
True
|
3、any(iterable)
功能:可叠代的元素中,有一個為真,則返回真,沒有真或空列表返回假。
1 2 3 4 |
>>> any ([ 0 , 0 , 2 ]) #有一個為真,則為真
True
>>> any ([]) #空列表為假
False
|
4、ascii(object)
功能:把內存對象變成一個可打印的字符串格式
1 2 |
>>> a = ascii([ 1 , 2 , 3 , 4 ])
>>> print(type(a),[a])
|
5、bin(x)
功能:把一個整數轉換成二進制
1 2 3 4 |
>>> bin ( 300 ) #把300轉換成二進制
‘0b100101100‘
>>> bin ( 1 )
‘0b1‘
|
6、bool([x])
功能:返回一個布爾值,空列表為假,不為空為真
1 2 3 4 5 6 |
>>> bool ([]) #空列表
False
>>> bool ([ 1 , 2 ]) #不為空列表
True
>>> bool ([ 0 ])
True
|
7、bytes([source[, encoding[, errors]]])
功能:把字符串轉換成字節
1 2 3 4 5 6 7 8 9 |
>>> b = bytes( "abcd" ,encoding = "utf-8" ) #聲明字節
>>> b
b ‘abcd‘
>>> b[ 0 ] #訪問到‘a‘字符對應的ASCII值
97
>>> b[ 0 ] = 100 #不可以修改裏面的值,不然會報錯
Traceback (most recent call last):
File "<input>" , line 1 , in <module>
TypeError: ‘bytes‘ object does not support item assignment
|
9、callable(object)
功能:判斷一個對象是否可以被調用,只有在後面有括號的,表示可以調用,比如:函數,類。
1 2 3 4 5 |
>>> callable ([]) #列表後面不加括號
False
>>> def sayhi(): pass #定義一個函數
>>> callable (sayhi) #函數調用,後面需要加括號
True
|
10、chr(i)
功能:通過ascii的值(必須是數字),找到對應的字符
1 2 |
>>> chr ( 97 )
‘a‘
|
11、ord(c)
功能:根據字符(必須ascii的字符),找到對應的ascii值
1 2 |
>>> ord ( ‘a‘ )
97
|
13、dict(**kwarg)、dict(mapping, **kwarg)、dict(iterable, **kwarg)
功能:返回一個字典
1 2 3 4 5 6 7 8 |
>>> dict () #定義一個字典
{}
>>> dict (name = ‘qianduoduo‘ ,age = 18 ) #傳入非固定關鍵字參數
{ ‘name‘ : ‘qianduoduo‘ , ‘age‘ : 18 }
>>> dict ([( ‘name‘ , ‘qianduoduo‘ ),( ‘age‘ , 18 )]) #傳入一個列表
{ ‘name‘ : ‘zhangqigao‘ , ‘age‘ : 18 }
>>> dict ([[ ‘name‘ , ‘qianduoduo‘ ],[ ‘age‘ , 18 ]]) #傳入一個列表
{ ‘name‘ : ‘qianduoduo‘ , ‘age‘ : 18 }
|
17、dir([object])
功能:看一個對象有哪些方法
1 2 3 4 5 6 7 8 |
>>> name = []
>>> dir (name) #顯示name下的所有的方法
[ ‘__add__‘ , ‘__class__‘ , ‘__contains__‘ , ‘__delattr__‘ , ‘__delitem__‘ , ‘__dir__‘ , ‘__doc__‘ ,
‘__eq__‘ , ‘__format__‘ , ‘__ge__‘ , ‘__getattribute__‘ , ‘__getitem__‘ , ‘__gt__‘ , ‘__hash__‘ ,
‘__iadd__‘ , ‘__imul__‘ , ‘__init__‘ , ‘__iter__‘ , ‘__le__‘ , ‘__len__‘ , ‘__lt__‘ , ‘__mul__‘ , ‘__ne__‘ ,
‘__new__‘ , ‘__reduce__‘ , ‘__reduce_ex__‘ , ‘__repr__‘ , ‘__reversed__‘ , ‘__rmul__‘ ,
‘__setattr__‘ , ‘__setitem__‘ , ‘__sizeof__‘ , ‘__str__‘ , ‘__subclasshook__‘ , ‘append‘ , ‘clear‘ ,
‘copy‘ , ‘count‘ , ‘extend‘ , ‘index‘ , ‘insert‘ , ‘pop‘ , ‘remove‘ , ‘reverse‘ , ‘sort‘ ]
|
18、divmod(a,b)
功能:地板除,獲得一個元組,元組第一個元素是商,第二個元素是余數。
1 2 |
>>> divmod ( 5 , 2 )
( 2 , 1 ) #2是商,1是余數
|
19、enumerate(iterable,start=0) 購物車的列表用到了,
功能:遍歷一個可叠代對象,獲取索引和對應的元素的
1 2 3 4 5 |
>>> seasons = [ ‘Spring‘ , ‘Summer‘ , ‘Fall‘ , ‘Winter‘ ]
>>> list ( enumerate (seasons))
[( 0 , ‘Spring‘ ), ( 1 , ‘Summer‘ ), ( 2 , ‘Fall‘ ), ( 3 , ‘Winter‘ )]
>>> list ( enumerate (seasons, start = 1 ))
[( 1 , ‘Spring‘ ), ( 2 , ‘Summer‘ ), ( 3 , ‘Fall‘ ), ( 4 , ‘Winter‘ )]
|
20、eval(expression, globals=None, locals=None)
功能:把字典類型的字符串變成字典,把一個整數類型的字符變成int類型,或者加減乘除這種簡單轉換成表達式。
1 2 3 4 |
>>> eval ( ‘1‘ ) #字符類型轉換成int類型
1
>>> eval ( "1+3/2*6" ) #字符串轉換為表達式
10.0
|
22、filter(function, iterable)
功能:通過function過濾條件,去獲取iterable中你想要的數據。
1 2 3 4 5 6 7 8 9 |
>>> res = filter ( lambda n:n> 5 , range ( 10 ))
>>> res #得到一個叠代器
< filter object at 0x0000000003093BE0 >
>>> for i in res:
print (i)
6
7
8
9
|
23、map(function, iterable)
功能:對傳入的每一個值進行處理,處理完了再返回,再把原來的結果覆蓋掉。
1 2 3 4 5 6 7 8 9 10 |
>>> res = map ( lambda n:n * 2 , range ( 5 )) #n*2是處理方式
>>> res
< map object at 0x00000000031B4BE0 >
>>> for i in res:
print (i)
0
2
4
6
8
|
未完待續!
python全棧開發-Day12 三元表達式、函數遞歸、匿名函數、內置函數