python 內建函式與匿名函式
內建函式
內建函式是python提供的可以直接呼叫的函式,截至版本3.6.2,python一共有68個內建函式,根據作用不同可以分為作用域相關、迭代器生成器相關、基礎資料型別相關和其他
作用域相關
locals(): 以字典的形式返回當前作用域內的內容
globals():以字典的形式返回全域性作用域內的內容
迭代器生成器相關
range: 建立一個整數物件,通常用於for迴圈
next: 內部實際使用了__next__方法,返回迭代器的下一個專案
基礎資料型別相關
1. 數字相關
bool: 將給定引數轉化成bool型別,如果沒有引數返回False
int: 將字串和數字轉化成整型,int有三點需要注意
(1) int轉化浮點數是向0取整,int(2.8) = 2, int(-3.9) = -3
(2) int("0b1101", base=2) = 13,base=2表示字串中的數字以二進位制表示
(3) int("hey", base=35) = 21349,base=35表示字串中的數字以35進製表示,這裡的有效base範圍為2~36(10+26)
2. 數學運算
abs:函式返回數字的絕對值。
divmod:計算除數與被除數的結果,返回一個包含商和餘數的元組(a // b, a % b)。
round:保留浮點數的小數位數,預設保留整數。
pow:求x**y次冪。(三個引數為x**y的結果對z取餘)
print(abs(-5)) # 5 print(divmod(7,2)) # (3, 1) print(round(7/3,2)) # 2.33 print(round(7/3)) # 2 print(round(3.32567,3)) # 3.326 print(pow(2,3)) # 兩個引數為2**3次冪 print(pow(2,3,3)) # 三個引數為2**3次冪,對3取餘。View Code
sum:對可迭代物件進行求和計算(可設定初始值)。
min:返回可迭代物件的最小值(可加key,key為函式名,通過函式的規則,返回最小值)。
max:返回可迭代物件的最大值(可加key,key為函式名,通過函式的規則,返回最大值)。
print(sum([1,2,3])) print(sum((1,2,3),100)) print(min([1,2,3])) # 返回此序列最小值 ret = min([1,2,-5,],key=abs) # 按照絕對值的大小,返回此序列最小值 print(ret) dic = {'a':3,'b':2,'c':1} print(min(dic,key=lambda x:dic[x])) # x為dic的key,lambda的返回值(即dic的值進行比較)返回最小的值對應的鍵 print(max([1,2,3])) # 返回此序列最大值 ret = max([1,2,-5,],key=abs) # 按照絕對值的大小,返回此序列最大值 print(ret) dic = {'a':3,'b':2,'c':1} print(max(dic,key=lambda x:dic[x])) # x為dic的key,lambda的返回值(即dic的值進行比較)返回最大的值對應的鍵View Code
3. 資料結構
總結
匿名函式
來看一個函式
def func(x, y): return x + y print(func(3, 4))
像這樣函式體只有return語句的函式可以改寫成一行的匿名函式(lambda),如下
func2 = lambda x, y: x + y
下面來寫一個匿名函式,傳入三個引數,返回三個數相乘的結果
func = lambda x, y, z: x*y*z
總結一下,匿名函式的特點:
1. 只有返回值的函式可以用lambda函式代替
2. 匿名函式只能用一行
3. 匿名函式的語法為lambda 引數1,引數2,... : 返回值
4. 匿名函式多與內建函式相結合
需要注意的是匿名函式在記憶體中只有一個,下面來看一個例子
v = [lambda:x for x in range(10)] print(v) print(v[0]) print(v[0]())
執行結果
[<function <listcomp>.<lambda> at 0x000001DAFD64B950>, <function <listcomp>.<lambda> at 0x000001DAFD64BA60>, <function <listcomp>.<lambda> at 0x000001DAFD64B9D8>, <function <listcomp>.<lambda> at 0x000001DAFD64BAE8>, <function <listcomp>.<lambda> at 0x000001DAFD64BB70>, <function <listcomp>.<lambda> at 0x000001DAFD64BBF8>, <function <listcomp>.<lambda> at 0x000001DAFD64BC80>, <function <listcomp>.<lambda> at 0x000001DAFD64BD08>, <function <listcomp>.<lambda> at 0x000001DAFD64BD90>, <function <listcomp>.<lambda> at 0x000001DAFD64BE18>] <function <listcomp>.<lambda> at 0x000001DAFD64B950> 9View Code
為什麼會出現這種結果呢,因為lambda只有一個,實際上新增到列表v裡面的是同一個lambda,上述程式碼相當於
v = [] for x in range(10): func1 = lambda: x v.append(func1)