標籤:... lob -- n+1 enum 第一個 年齡 rom 分享
內建函數補充
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=732 per_count=233 res=divmod(total_count,per_count)4 if res[1] > 0:5 page_count=res[0]+16 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 -28192874772036538053 >>> hash((1,2,3))4 2528502973977326415
isinstance()函數:來判斷一個對象是否是一個已知的類型,類似 type()
文法:
1 isinstance(object, classinfo)2 #object -- 執行個體對象。3 #classinfo -- 可以是直接或間接類名、基本類型或者有它們組成的元組。
樣本:
1 >>> isinstance(1,int)2 True3 >>> isinstance(1,(int,float,list)) #類型可以用一個元組包含多個,只要有一個匹配上就返回True4 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 15 26 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]沒有54 #step:步長,預設為1。例如:range(0, 5) 等價於 range(0, 5, 1)
樣本:
1 for i in range(0,5,2): #0 2 42 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.233 >>> round(100.0010056, 3)4 100.0015 >>> 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 33 >>> sum((2, 3, 4), 1) # 元組計算總和後再加 14 105 >>> sum([0,1,2,3,4], 2) # 列表計算總和後再加 26 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**23 print(func1(5))
匿名函數定義:
1 func=lambda x:x**2 #x為函數接收的值,x**2相當於有名函數的return x**22 print(func(5))
其他樣本:
1 f1=lambda x,y:x+y 2 print(f1(1,2)) #傳回值為33 #4 f2=lambda x:x>15 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 yuanhao15 10000000016 alex17 18 #===========分割線君============19 #結合lambda應用:輸出工資最高的人的名字20 salaries={21 ‘egon‘:3000,22 ‘alex‘:100000000,23 ‘wupeiqi‘:10000,24 ‘yuanhao‘:200025 }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 184 return age(n+1)+25 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基礎之內建函數補充、匿名函數、遞迴函式