1. 程式人生 > >python基礎之內置函數補充、匿名函數、遞歸函數

python基礎之內置函數補充、匿名函數、遞歸函數

round if判斷 就會 ssi 如果 生成 code hello 定義

內置函數補充

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基礎之內置函數補充、匿名函數、遞歸函數