1. 程式人生 > >Python 匿名函式與內建函式

Python 匿名函式與內建函式

一、匿名函式

python 使用 lambda 來建立匿名函式。意即不再使用 def 語句這樣標準的形式定義一個函式

  • lambda只是一個表示式,函式體比def簡單很多。

  • lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lambda表示式中封裝有限的邏輯進去。

  • lambda函式擁有自己的名稱空間,且不能訪問自有引數列表之外或全域性名稱空間裡的引數。

  • 雖然lambda函式看起來只能寫一行,卻不等同於C或C++的行內函數,後者的目的是呼叫小函式時不佔用棧記憶體從而增加執行效率。

  • 最重要的一點,Lambda表示式可以體現你的逼格。華爾街和倫敦銀行高街最逼的一群人都是自詡用且只用函數語言程式設計的。什麼是函數語言程式設計?就是類似於全篇程式都用python中lambda這樣的一行程式碼來解決問題。

語法 
lambda 函式的語法只包含一個語句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

#  lambda 引數列表:return [表示式] 變數
#  由於lambda返回的是函式物件(構建的是一個函式物件),所以需要定義一個變數去接收

應用:在內建函式 max() 求最大值,min()求最小值, map() 對映, reduce 合併, filter() 過濾 中會用到!

例項一

# 可寫函式說明
sum = lambda arg1, arg2: arg1 + arg2;

# 呼叫sum函式
print ("相加後的值為 : ", sum( 10, 20 )) # 相加後的值為 :  30
print ("相加後的值為 : ", sum( 20, 20 )) # 相加後的值為 :  40

例項二

對字典排序

infors = [{"name":"wang","age":10},{"name":"xiaoming","age":20},{"name":"banzhang","age":10}]

infors.sort(key=lambda x:x['age']) #根據age對字典排序

print(infors)
# 排序結果  [{'name': 'wang', 'age': 10}, {'name': 'banzhang', 'age': 10}, {'name': 'xiaoming', 'age': 20}]

例項三

把lambda當一個變數

def test(a,b,func):
    result = func(a,b)
    return result

num = test(11,22,lambda x,y:x+y)
print(num)

匿名函式優點

  • 使用Python寫一些指令碼時,使用lambda可以省去定義函式的過程,讓程式碼更加精簡。
  • 對於一些抽象的,不會被別的地方再重複使用的函式,有時候函式起個名字也是個難題,使用lambda不需要考慮命名的問題
  • 使用lambda在某些時候然後程式碼更容易理解

二、內建函式

    內建引數詳解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 

1.abs()   取絕對值  資料型別 必須是 整型!

1 print(abs(1))
2 print(abs(-1))
3 print(abs('a'))

執行結果:

1

1

Traceback (most recent call last): File "F:/py_fullstack_s4/day25/內建函式.py", line 3, in <module> print(abs('a')) TypeError: bad operand type for abs(): 'str'

2.all(可迭代物件) 返回布林值 只要任何一個值不為真,返回Flase,可迭代物件為空時,返回True

1 print(all(''))
2 print(all((1,'',None,0)))
3 print(all(i for i in range(1,10))) #從1開始取值,排除0

執行結果:

True
False
True

3.any(可迭代物件) 返回布林值 只要任何一個值為真,返回True,可迭代物件為空時,返回Flase

1 print(any(''))
2 print(any([None,1,2,'']))

執行結果:

False
True

4.將十進位制轉換成 :bin() 二進位制 hex() 十六進位制 oct()八進位制

1 print(bin(12)) #二進位制
2 print(hex(12)) #十六進位制
3 print(oct(12)) #八進位制

執行結果:

1 0b1100
2 0xc
3 0o14

5.資料型別:int() 整型;str() 字串;list()列表;tuple()元組;dict()字典;set() 集合;frozenset() 不可變集合 

  is 判斷身份,身份運算,根據id去判斷身份

num =1
s = "adxz"
l = [1,2.3,4]
d = {1:1,"z":2}
print(type(d))
print(type(l))
print(type(s))
print(num is 1)

d = dict(x=1,y=2,z="3")  #生成字典的另一種方式
print(d)
s = {1,2,3,4,4,3,2,5} #集合
print(s)
s.add((6,7))
print(s)
f = frozenset(s) #不可變集合
print(f)
print(type(f))
執行結果:
1 <class 'dict'>
2 <class 'list'>
3 <class 'str'>
4 True
5 {'x': 1, 'y': 2, 'z': '3'}
6 {1, 2, 3, 4, 5}
7 {1, 2, 3, 4, 5, (6, 7)}
8 frozenset({1, 2, 3, 4, 5, (6, 7)})
9 <class 'frozenset'>

6.bool()  判斷布林值

1 print(bool(2>1))
2 print(bool(2<1))

執行結果:

1 True
2 False

7.bytes() bytes 位元組 指定編碼格式否則報錯     type() 檢視變數 是 哪種資料型別

1 s = 'abcdefg'
2 print(s) #檢視字串s
3 print(type(s)) #檢視字串型別
4 s1 = bytes(s,encoding='utf-8')  #檢視字串型別
5 print(s1)

執行結果:

1 abcdefg
2 <class 'str'>
3 b'abcdefg'


8.ASCII碼轉換 :chr() ASCII轉換 數字轉換成字元;ord() ASCII轉換 字元轉換成數字

1 print(chr(81)) #根據位置找值
2 print(ord('A')) #根據值找位置

執行結果:

1 Q
2 65

9.callable() 判斷是否為函式,括號內傳入函式名      complex() 定義複數

x = complex(1-2j)  #定義一個複數
print(type(x))  #檢視函式型別
print(x.real)   #列印x 的實部
print(x.imag)   #列印x 的虛部
print(callable(x))  #檢視是否是函式

def test():  #定義函式
    pass
print(callable(test))  #檢視是否是函式
執行結果:
1 <class 'complex'>
2 1.0
3 -2.0
4 False
5 True

10.幫助   dir(物件)   檢視物件都能呼叫什麼方法;help()直接檢視 函式 具體的幫助資訊

1 a = 'hnaxhoqihcqew0'
2 print(dir(a))  #檢視呼叫方法  help()直接檢視具體的幫助資訊

執行結果:

['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

11.divmod(int1,int2) 兩個數做除法 int1/int2;返回值是得到一個元組(整除的值,取餘的值);主要應用於網頁的分頁

1 print(divmod(10,2))
2 print(divmod(10,3))

執行結果:

(5, 0)
(3, 1)

12.enumerate()

enumerate函式說明:

  • 函式原型:enumerate(sequence, [start=0])
  • 功能:將可迴圈序列sequence以start開始分別列出序列資料和資料下標(可自定義起始值)
  • 即對一個可遍歷的資料物件(如列表、元組或字串),enumerate會將該資料物件組合為一個索引序列,同時列出資料和資料下標,以元組的形式輸出結果
1 list = ['ni','hao','ma','hello','world']
2 for i in enumerate(list,1):
3     print(i)

執行結果:

(1, 'ni')
(2, 'hao')
(3, 'ma')
(4, 'hello')
(5, 'world')

13.hash()  hash() 雜湊演算法,應用:進行資料校驗

特性:
1、字串改變,得到的數值必將改變
2、只要演算法一致,得到的值永遠不會變,長度也不會改變。
3、hash值不能逆推

#字串型別
x = "hello"
y = 'hello'  #x和y 兩個值相等
print(hash(x))
print(hash(y))
y = 'hellobuxaoixax' #改變y
print(hash(x))
print(hash(y))
執行結果:
4282436752230277468
4282436752230277468
4282436752230277468
-397579801337672607

14.eval() 將字串 轉換成 表示式 形式 進行運算

15.id()    id() 檢視唯一標識身份資訊 字串一樣,數字超過一定長度就不同

>>> x =10
>>> y =10
>>> print(id(x))
1393927552
>>> print(id(y))
1393927552
>>> x = 100000000000000000000000
>>> y = 100000000000000000000000
>>> print(id(x))
42716256
>>> print(id(y))
42716296
>>>

16.#拉鍊 zip()
zip(),放入兩個迭代器,一一對應重新取值,以元組的形式輸出。不管是某一方的個數多,都不會輸出。

l1 = [1,2,3,4,5,6]
s = 'hello'
z = zip(l1,s)
for i in z:
    print(i)

執行結果:

(1, 'h')
(2, 'e')
(3, 'l')
(4, 'l')
(5, 'o')

17.sorted() 排序 可迭代物件 得到一個新的返回值。返回值是列表,預設是升序;  reverse = True 反轉。降序;    reversed() 取反,本末倒置

對字典排序,預設是按照字典的key去排序的

salaries={
    'egon':3000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
}
print(sorted(salaries))  #按照keys排序,依次比較字母的大小 從小到大
print(sorted(salaries,reverse = True))  #按照keys排序,依次比較字母的大小 從大到小
print(sorted(salaries,key = lambda x:salaries[x]))  #按照values的值排keys的序,從小到大
l = [1,2,3,4
執行結果:
['alex', 'egon', 'wupeiqi', 'yuanhao']
['yuanhao', 'wupeiqi', 'egon', 'alex']
['yuanhao', 'egon', 'wupeiqi', 'alex']
#reversed()應用
l = [1,2,3,45,7] #定義初始列表
l1= reversed(l)  #轉換 會得到一個返回值
print(list(l1))  #list()一個一個的取值,生成一個列表

執行結果:

[7, 45, 3, 2, 1]

18.max() and min() 求最大值和最小值

max(*args,key=func)   key可有可無。當需要用函式判斷的時候,新增key.    min與max的使用方法一致。

#max和min
print(max(1,2,3,4,10,3))   #直接比較
print(min(1,2,3,4,10,3))
print(max((1,'a'),(1,'b')))
salaries={
    'egon':3000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2500
}
def get_value(k):
    return salaries[k]
print(max(salaries)) #比較keys
print(max(salaries,key=get_value))  #原始的定義一個函式
print(max(salaries,key=lambda k:salaries[k])) #使用lambda函式
print(min(salaries,key=lambda k:salaries[k]))
執行結果:
1
10
11
[3, 5]
[3, 5]
True
<module 'time' (built-in)>
<module 'time' (built-in)>

19.map 對映

 map(func,list)

  map()是 Python 內建的高階函式,它接收一個函式 func 和一個list,並通過把函式 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。

 #map 對映 將原有的可迭代物件中的元素逐一拿出來處理後,返回一個新的可迭代物件
 l = [1,2,3,45,7]
 m = map(lambda item:item*2,l)
 print(m)
 print(list(m))

執行結果:

<map object at 0x00000000026E96A0>
[2, 4, 6, 90, 14]

20.reduce 合併規則 求多個引數的運算!  (加減乘除)

reduce(fun,list,初始值)

    reduce依次把list中的數字賦值給fun進行計算

    注意fun必須是兩個數字間的運算,list必須是整型數字,初始值可定義,也可以不定義。

reduce()傳入的函式func 必須接收兩個引數,reduce() 對list的每個元素反覆呼叫函式func,並返回最終結果值。

from functools import reduce
l = range(100)
print(reduce(lambda x,y:x+y,l))
print(reduce(lambda x,y:x+y,l,100))

執行結果:

4950
5050

21.filter() 過濾器    會有一個判斷,輸出的結果是布林值,會將布林值為True的過濾出來。
filter(函式func,可迭代物件list)

  filter()函式接收一個函式 func 和一個list,這個函式 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。

#filter  過濾
name_l =[
    {"name":'egon','age':120},
    {"name":"fsw","age":1000},
    {'name':'wang','age':2000},
    {'name':'jie','age':18}
]
f = filter(lambda d:d['age']>100,name_l)
for i in f:
    print(i)
執行結果:
{'name': 'egon', 'age': 120}
{'name': 'fsw', 'age': 1000}
{'name': 'wang', 'age': 2000}

23.其他

pow() 兩個值求方,三個值是前兩個求方然後值和第三個數再取餘數

round() 帶小數點的值,四捨六入五留雙。。。

slice() 定義切片物件

vars() #區域性變數

_import_('字串') 將匯入的字串轉成模組

#其他

#pow()
print(pow(3,2))
print(pow(3,2,2))

#round() 五舍六入
print(round(10.3))
print(round(10.5))
print(round(10.6))
print(round(10.9))

# slice 切片
l=[1,2,3,4,5,6,7,9]
print(l[2:5:2])
s=slice(2,5,2)
print(l[s])

#vars()  等同於區域性變數
print(vars() is locals())

#_import_() 自定義模組
import time
# time.sleep(3)
print(time)

m=__import__('time')
print(m)
m.sleep(3)
執行結果:
1
10
11
[3, 5]
[3, 5]
True
<module 'time' (built-in)>
<module 'time' (built-in)>