python基礎之內置函數補充、匿名函數、遞歸函數
內置函數補充
python divmod()函數:把除數和余數運算結果結合起來,返回一個包含商和余數的元組(a // b, a % b)
語法:
1 divmod(a, b) #a、b為數字,a為除數,b為被除數
示例:
1 >>> divmod(7, 2) 2 (3, 1) #3為商,1為余數 3 >>> divmod(7, 2.5) 4 (2.0, 2.0)
應用:web前端頁數計算
1 total_count=73 2 per_count=23 3 res=divmod(total_count,per_count) 4 if res[1] > 0: 5 page_count=res[0]+1 6 print(page_count)
enumerate()函數:用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。
語法:
1 enumerate(sequence, [start=0]) 2 # sequence -- 一個序列、叠代器或其他支持叠代對象 3 # start -- 下標起始位置
示例:
1 l=[‘a‘,‘b‘,‘c‘] 2 for i in enumerate(l): 3 print(i) 4 輸出結果: 5 (0, ‘a‘) 6 (1, ‘b‘) 7 (2, ‘c‘)
frozenset()函數:返回一個凍結的集合,凍結後集合不能再添加或刪除任何元素
語法:
1 frozenset([iterable]) #iterable為可叠代對象
示例:
1 >>> dir(set) #包含add、clear、pop、remove等修改方法 2 [‘__and__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__iand__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__ior__‘, ‘__isub__‘, ‘__iter__‘, ‘__ixor__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__or__‘, ‘__rand__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__ror__‘, ‘__rsub__‘, ‘__rxor__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__sub__‘, ‘__subclasshook__‘, ‘__xor__‘, ‘add‘, ‘clear‘, ‘copy‘, ‘difference‘, ‘difference_update‘, ‘discard‘, ‘intersection‘, ‘intersection_update‘, ‘isdisjoint‘, ‘issubset‘, ‘issuperset‘, ‘pop‘, ‘remove‘, ‘symmetric_difference‘, ‘symmetric_difference_update‘, ‘union‘, ‘update‘] 3 >>> dir(frozenset) #凍結並不包含任何可修改方法 4 [‘__and__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__or__‘, ‘__rand__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__ror__‘, ‘__rsub__‘, ‘__rxor__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__sub__‘, ‘__subclasshook__‘, ‘__xor__‘, ‘copy‘, ‘difference‘, ‘intersection‘, ‘isdisjoint‘, ‘issubset‘, ‘issuperset‘, ‘symmetric_difference‘, ‘union‘] 5 6 s=frozenset({1,2,3})
globals()函數:以字典類型返回當前位置的全部全局變量,對應的為locals()返回當前位置的局部變量
語法:
1 globals()
示例:
1 >>> globals() 2 {‘__name__‘: ‘__main__‘, ‘__doc__‘: None, ‘__package__‘: None, ‘__loader__‘: <class ‘_frozen_importlib.BuiltinImporter‘>, ‘__spec__‘: None, ‘__annotations__‘: {}, ‘__builtins__‘: <module ‘builtins‘ (built-in)>} 3 >>> locals() 4 {‘__name__‘: ‘__main__‘, ‘__doc__‘: None, ‘__package__‘: None, ‘__loader__‘: <class ‘_frozen_importlib.BuiltinImporter‘>, ‘__spec__‘: None, ‘__annotations__‘: {}, ‘__builtins__‘: <module ‘builtins‘ (built-in)>}
hash()函數:用於獲取取一個對象(字符串或者數值等)的哈希值
語法:
1 hash(object) #對象可以是數字、字符串、元組等不可變類型
示例:
1 >>> hash(‘test‘) 2 -2819287477203653805 3 >>> hash((1,2,3)) 4 2528502973977326415
isinstance()函數:來判斷一個對象是否是一個已知的類型,類似 type()
語法:
1 isinstance(object, classinfo) 2 #object -- 實例對象。 3 #classinfo -- 可以是直接或間接類名、基本類型或者有它們組成的元組。
示例:
1 >>> isinstance(1,int) 2 True 3 >>> isinstance(1,(int,float,list)) #類型可以用一個元組包含多個,只要有一個匹配上就返回True 4 True
iter()函數:用來生成叠代器
語法:
1 iter(object[, sentinel]) 2 # object -- 支持叠代的集合對象 3 # sentinel -- 如果傳遞了第二個參數,則參數 object 必須是一個可調用的對象(如,函數),此時,iter 創建了一個叠代器對象,每次調用這個叠代器對象的__next__()方法時,都會調用 object
示例:
1 for i in iter([1,2,3]): #[1,2,3].__iter__() 2 print(i) 3 輸出結果: 4 1 5 2 6 3
pow()函數:返回 xy(x的y次方)的值
語法:
1 pow(x, y[, z]) 2 #函數是計算x的y次方,如果z在存在,則再對結果進行取模,其結果等效於pow(x,y) %z
示例:
1 >>> pow(5,2,2) #計算5的2次方的2的余數 2 1
range()函數:可創建一個整數列表,一般用在 for 循環中
語法:
1 range(start, stop[, step]) 2 #start: 計數從 start 開始。默認是從 0 開始。例如range(5)等價於range(0, 5); 3 #end: 計數到 end 結束,但不包括 end。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5 4 #step:步長,默認為1。例如:range(0, 5) 等價於 range(0, 5, 1)
示例:
1 for i in range(0,5,2): #0 2 4 2 print(i) 3 for i in range(5,0,-1): #反向取 4 print(i)
reverse()函數:用於反向列表中元素
語法:
1 list.reverse()
示例:
1 >>> l1=[3,5,1,2] 2 >>> list(reversed(l1)) 3 [2, 1, 5, 3] 4 >>> reversed(l1) #本身是個叠代器 5 <list_reverseiterator object at 0x0000023CA11E3D30>
round()函數:返回浮點數的四舍五入值
語法:
1 round( x [, n] ) #x為浮點數,n為四舍五入位數
示例:
1 >>> round(80.23456, 2) 2 80.23 3 >>> round(100.0010056, 3) 4 100.001 5 >>> round(-100.0030056, 3) 6 -100.003
slice()函數:返回一個切片對象,主要用在切片操作函數裏的參數傳遞
語法:
1 slice(start, stop[, step]) 2 #start -- 起始位置 3 #stop -- 結束位置 4 #step -- 間距,步長
示例:
1 >>> l=[‘a1‘,‘a2‘,‘a3‘,‘a4‘,‘a5‘,‘a6‘,‘a7‘,‘a8‘,‘a9‘] 2 >>> l[2:5:2] 3 [‘a3‘, ‘a5‘] 4 >>> x=slice(2,5,2) 5 >>> l[x] 6 [‘a3‘, ‘a5‘]
sorted()函數:對所有可叠代的對象進行排序操作,產生一個新的對象,不對原對象生效
語法:
1 sorted(iterable[, cmp[, key[, reverse]]]) 2 #iterable -- 可叠代對象。 3 #cmp -- 比較的函數,這個具有兩個參數,參數的值都是從可叠代對象中取出,此函數必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0。 4 #key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可叠代對象中,指定可叠代對象中的一個元素來進行排序。 5 #reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
示例:
1 >>> l=[1,2,4,9,-1] 2 >>> sorted(l) #從小到大 3 [-1, 1, 2, 4, 9] 4 >>> sorted(l,reverse=True) #從大到小 5 [9, 4, 2, 1, -1]
sum()函數:對系列進行求和計算
語法:
1 sum(iterable[, start]) 2 #iterable -- 可叠代對象,如列表。 3 #start -- 指定相加的參數,如果沒有設置這個值,默認為0。
示例:
1 >>> sum([0,1,2]) 2 3 3 >>> sum((2, 3, 4), 1) # 元組計算總和後再加 1 4 10 5 >>> sum([0,1,2,3,4], 2) # 列表計算總和後再加 2 6 12
zip()函數:用於將可叠代的對象作為參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。
如果各個叠代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操作符,可以將元組解壓為列表
語法:
1 zip([iterable, ...]) #一個或多個叠代器,zip函數返回的是一個叠代器
示例1:
1 s=‘hello‘ 2 l=[1,2,3] 3 for i in zip(s,l): 4 print(i) 5 輸出結果: 6 (‘h‘, 1) 7 (‘e‘, 2) 8 (‘l‘, 3)
示例2:
1 s=‘hello‘ 2 l=[1,2,3] 3 zipped = zip(s,l,) # 打包為元組的列表 4 for x in zip(*zipped): # 與 zip 相反,可理解為解壓,返回二維矩陣式 5 print(x)
匿名函數
匿名函數,即沒有名字的函數。
有名函數使用def定義,通過函數名字調用,匿名函數是用lambda定義,直接調用或者人為指定一個函數名字定義。
比如定義函數,返回一個值的平方,有名函數定義如下:
1 def func1(x): 2 return x**2 3 print(func1(5))
匿名函數定義:
1 func=lambda x:x**2 #x為函數接收的值,x**2相當於有名函數的return x**2 2 print(func(5))
其他示例:
1 f1=lambda x,y:x+y 2 print(f1(1,2)) #返回值為3 3 # 4 f2=lambda x:x>1 5 print(f2(3)) #返回值為True
匿名函數如果不人為指定一個名字,那麽在定義完了之後就會在內存中刪除,所以匿名函數一般只會使用一次,主要應用在內置函數max、min、map、reduce和filter中。
max()函數:返回給定參數的最大值,參數可以為序列,max類似於for循環,一個個遍歷
語法:
1 max( x, y, z, .... [key] ) #key為比較的值類型,是一個函數
示例:
>>> max(-20, 100, 400) 400 >>> max(-80, -20, -10) -10 >>> max(0, 100, -400) 100 >>> max(‘abc‘,‘bcd‘,‘aaa‘) #字符串比較大小是根據字母順序,越靠後越大。先比較第一個字符,如果第一個字符一樣,比較第二個,依次 ‘bcd‘
結合匿名函數應用:
1 #普通方法:輸出工資最高的人的名字 2 salaries={ 3 ‘egon‘:3000, 4 ‘alex‘:100000000, 5 ‘wupeiqi‘:10000, 6 ‘yuanhao‘:2000 7 } 8 9 print(max(salaries)) #比較的是名字字符串的大小,輸出的是名字 10 print(max(salaries.values())) #比較的是工資大小,輸出的是工資數 11 res=zip(salaries.values(),salaries.keys()) #拉鏈函數將key和value做成元組 12 print(max(res)[1]) #比較元組的0索引位置,輸出索引位置1的值 13 輸出結果: 14 yuanhao 15 100000000 16 alex 17 18 #===========分割線君============ 19 #結合lambda應用:輸出工資最高的人的名字 20 salaries={ 21 ‘egon‘:3000, 22 ‘alex‘:100000000, 23 ‘wupeiqi‘:10000, 24 ‘yuanhao‘:2000 25 } 26 #def func(x): #定義函數,輸出一個key的value值 27 # return salaries[x] 28 print(max(salaries,key=lambda x:salaries[x])) #key是指定一個函數作為比較對象,默認比較的是字典key的大小,通過lambda的返回值,變成了對應value的比較
min()函數:返回給定參數的最小值,參數可以為序列,類似於max的使用方法
語法:
略
示例:
略
map()函數:會根據提供的函數對指定序列做映射
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。
語法:
1 map(function, iterable) 2 #function -- 函數 3 #iterable -- 一個或多個序列
示例1:
1 l=[1,2,3,4] 2 m=map(lambda x:x**2,l) 3 print(list(m)) 4 輸出結果 5 [1, 4, 9, 16]
示例2:
names=[‘bob‘,‘natasha‘,‘lisa‘] print(list(map(lambda item:item+‘_sb‘,names))) 輸出結果 [‘bob_sb‘, ‘natasha_sb‘, ‘lisa_sb‘]
reduce()函數:對參數序列中元素進行合並。
函數將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給reduce中的函數 function(有兩個參數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個數據用 function 函數運算,最後得到一個結果。
語法:
1 reduce(function, iterable[, initializer]) 2 #function -- 函數 3 #iterable -- 可叠代對象 4 #initializer -- 可選,初始參數
示例:
1 #普通方法實現0-100(不包括100)的和 2 res=0 3 for i in range(100): 4 res+=i 5 print(res) 6 7 #==============分割線君============= 8 from functools import reduce 9 #reduce方法實現0-100的和,加了默認值 10 print(reduce(lambda x,y:x+y,range(100),100))
filter()函數:用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。
語法:
1 filter(function, iterable) 2 #function -- 判斷函數。 3 #iterable -- 可叠代對象
示例:
1 names=[‘bob_sb‘,‘natasha_sb‘,‘lisa_sb‘,‘egon‘] 2 print(list(filter(lambda name:name.endswith(‘_sb‘),names))) #篩選出_sb結尾的元素 3 輸出結果 4 [‘bob_sb‘, ‘natasha_sb‘, ‘lisa_sb‘]
遞歸函數
遞歸調用:在調用一個函數的過程中,直接或者間接調用了該函數本身
直接調用:
1 def func(): 2 print(‘====>func‘) 3 func() 4 func() 5 #會陷入死循環報錯,默認遞歸層級限制,可改
間接調用:
1 def foo(): 2 print(‘from foo‘) 3 bar() 4 def bar(): 5 print(‘from bar‘) 6 foo() 7 foo() 8 #會陷入死循環報錯,默認遞歸層級限制,可改
示例1:計算年齡
1 def age(n): 2 if n == 5: 3 return 18 4 return age(n+1)+2 5 print(age(1))
遞歸函數有兩個過程:遞推和回溯
遞推的過程中需要有一個中斷點,即示例1中的if判斷,如果沒有中斷點,將陷入死循環,導致內存溢出
回溯即從斷點處返回求值
示例2:
1 l=[1,[2,3,[4,5,[6,7,[8,9,[10,11,[12,13]]]]]]] 2 def func(l): 3 for i in l: 4 if isinstance(i,list): 5 func(i) 6 else: 7 print(i) 8 func(l)
python基礎之內置函數補充、匿名函數、遞歸函數