10個(gè)使用Python必須知道的內(nèi)置函數(shù)
1. reduce()
reduce()
是 functools
模塊下面的一個(gè)函數(shù),接收兩個(gè)參數(shù),一個(gè)是函數(shù)對象,一個(gè)是可迭代對象(比如list), reduce
每次會(huì)把迭代對象中的下一個(gè)元素作用在函數(shù)上做累積計(jì)算,最后得到一個(gè)值。
來看個(gè)例子你就明白,創(chuàng)建函數(shù) :
# 創(chuàng)建函數(shù) def add(a, b): result = a + b print(f"{a} + = {result}") return result from functools import reduce result = reduce(add, [1, 2, 3, 4]) print("結(jié)果:", result)
輸出:
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
結(jié)果: 10
執(zhí)行過程:第一次將列表中的前兩個(gè)數(shù)取出來作為函數(shù)add
的參數(shù),第二次將上一次函數(shù)add的返回值與列表的第3個(gè)數(shù)作為參數(shù),依此類推,最后得到一個(gè)值。這就是reduce
的作用。有點(diǎn)像萬物歸一的感覺。
當(dāng)然,如果只是計(jì)算列表中的元素之和,大可不必繞這么大彎子用reduce
來處理,直接用 sum 函數(shù)就可以解決。
result = sum([1, 2, 3, 4])
如果是計(jì)算列表中元素的乘積,python
并沒有內(nèi)置的函數(shù)直接計(jì)算,這時(shí)候我們可以借用reduce
來處理
def mul(a, b): return a * b result = reduce(mul, [1, 2, 3, 4]) print("結(jié)果:", result)
輸出:
結(jié)果: 24
或者使用 lambda
匿名函數(shù)
result = reduce(lambda a, b: a * b, [1, 2, 3, 4])
甚至可以直接使用operator模塊下的乘法操作符函數(shù)
from operator import mul result = reduce(mul, [1, 2, 3, 4]) print("結(jié)果:", result)
最后你會(huì)發(fā)現(xiàn)解法其實(shí)很多種,不過我們應(yīng)該記住python
之禪里面那句話:
There should be one-- and preferably only one --obvious way to do it.
用最合適的方式去做一件事
2. split()
split
接收一個(gè)參數(shù),用于將字符串切割成列表,比如一段英文字符串按照空格切割就可以統(tǒng)計(jì)出單詞的個(gè)數(shù),
words = "python is the best programming language" wordswords = words.split(" ") print(words)
輸出:
['column1', 'column2', 'column3']
3. enumerate()
enumerate
函數(shù)用于迭代列表等可迭代對象,它的使用場景一般出現(xiàn)在你需要獲取列表的下標(biāo)位置時(shí),我們知道直接用for循環(huán)去迭代列表時(shí),是拿不到元素下標(biāo)位置的,而 enumerate
就可以獲取,否則你還得自己去定義一個(gè)索引變量。
words = ['python', 'is', 'the', 'best', 'programming', 'language'] index = 0 for w in words: print(index, w) index += 1 0 python 1 is 2 the 3 best 4 programming 5 language
使用 enumerate
函數(shù),處理起來就更優(yōu)雅了
for index, w in enumerate(words): print(index, w) 0 python 1 is 2 the 3 best 4 programming 5 language
4. map()
map是一個(gè)與reduce
函數(shù)對應(yīng)的函數(shù),Google
的map/reduce
框架的思想其實(shí)就是從這兩個(gè)函數(shù)借鑒而來的。map函數(shù)用于把一個(gè)列表通過函數(shù)處理,映射成一個(gè)新的列表。例如給列表的每個(gè)元素做平方,將列表元素轉(zhuǎn)換成字符串,得到一個(gè)新的列表。
result = map(lambda x: str(x), [1, 2, 3, 4]) print(list(result)) result = map(lambda x: x * x, [1, 2, 3, 4])) print(list(result))
輸出:
['1', '2', '3', '4']
[1, 4, 9, 16]
此外,map
函數(shù)還可以接受多個(gè)列表參數(shù),使得多個(gè)列表合并為一個(gè)列表成為可能,例如,將兩個(gè)列表相同位置的元素相加得到一個(gè)新的列表
def merge(x, y): return x + y result = map(merge, [1, 2, 3], [3, 2, 1]) print(list(result))
輸出:
[4, 4, 4]
5. getattr()
getattr()
返回對象屬性對應(yīng)的值,接受兩個(gè)參數(shù),第一個(gè)是對象,第二個(gè)是屬性名,這個(gè)函數(shù)通常用戶動(dòng)態(tài)或者某個(gè)對象下面的某些屬性的值,看例子:
class Foo: def __init__(self): self.a = 10 foo = Foo() a = getattr(foo, "a") print(a)
輸出:
10
你可能會(huì)問,我直接 foo.a
不就可以獲取a屬性的值了嗎?正常情況是這樣沒錯(cuò),如果是你在不知道什么情況下要獲取什么屬性的值時(shí),這時(shí)候getattr
就可以派上用場了。初學(xué)者可能還體驗(yàn)不到,當(dāng)你嘗試去寫些框架級(jí)的代碼時(shí),你要想起來有這樣的函數(shù)可以使用就行。
6. slice
slice
是一個(gè)切片函數(shù),切片操作你可能使用過,通過切片來獲取列表的子集, 例如:
s = [1,2,3,4] >>> s[1:3] # 獲取列表s中第1到第3之間的元素組成的子列表
"1:3"
其就是 就是 slice(1:3)
函數(shù)的縮寫方式,前者就像是語法糖
s = [1, 2, 3, 4] print(s[slice(1, 3)])
通常實(shí)際應(yīng)用過程中,直接用語法糖的寫法就可以,沒必要用slice函數(shù)進(jìn)行切片,但是你至少應(yīng)該知道slice是怎么用的。
7. sorted()
sorted
函數(shù)應(yīng)該日常代碼中,算是一個(gè)高頻函數(shù)了,用于將列表等可迭代對象進(jìn)行排序,它不會(huì)改變原列表的順序,而是返回一個(gè)新的列表。默認(rèn)按照升序排列
nums = [4, 5, 6, 3, 1] print(sorted(nums))
輸出:
[1, 3, 4, 5, 6]
如果想要降序排列,則需要指定第二個(gè)參數(shù):reverse=True
nums = [4, 5, 6, 3, 1] print(sorted(nums, reverse=True)) # [6, 5, 4, 3, 1]
sorted
函數(shù)的強(qiáng)大之處遠(yuǎn)不止如此,因?yàn)槟氵€可以自定義排序規(guī)則,比如參與比較是一個(gè)自定義的類Student
, 我需要按照Student
里面的年齡age進(jìn)行排序,這時(shí)候我們需要自定義排序因子函數(shù)
def my_sort_key(s): return s.age class Student: def __init__(self, age): self.age = age def __str__(self): return f"Student({self.age})" s1 = Student(12) s2 = Student(2) s3 = Student(30) new_list = (sorted([s1, s2, s3], key=my_sort_key)) for i in new_list: print(i)
輸出:
Student(2)
Student(12)
Student(30)
8. format
format
函數(shù)曾經(jīng)字符串格式化最常用的函數(shù),使用也是非常簡單,但自從f字符串出現(xiàn)之后,format
的功能逐漸被取代,但是3.6之前還是可以常見到該函數(shù)的應(yīng)用場景。
s = "{} is first name" print(s.format("liu"))
如果需要占位符比較多搞不清次序的話,可以給每個(gè)占位符一個(gè)名字,這樣就不拍對不上位置了
s = "{first_name} is first name" print(s.format(first_name="liu"))
9. join()
join
也是比較常用的一個(gè)內(nèi)置函數(shù),它可以將列表對象用指定的字符作為元素之間的連接,轉(zhuǎn)換為字符串。
words = ['python', 'is', 'the', 'best', 'programming', 'language'] print(" ".join(words)) # 用空格連接 python is the best programming language
10. type
type
我認(rèn)為是python
最難理解的一個(gè)內(nèi)置函數(shù)了,新手可能以為type就是一個(gè)用來查看某個(gè)對象的類型是什么,例如:
print(type(10)) # <class 'int'> print(type([])) # <class 'list'> print(type("s"))# <class 'str'>
它的另一個(gè)作用是可以用type來創(chuàng)建類,一般情況下,我們都用關(guān)鍵字 class 來定義一個(gè)類,而type也可以用來創(chuàng)建類
>>> Person = type("Person", (), {"live":True}) >>> Person <class '__main__.Person'>
第一個(gè)參數(shù) Person
是類的名字, 第二個(gè)參數(shù)用來指定父類是誰, 第三個(gè)參數(shù)是這個(gè)類的類屬性有哪些。上面這段代碼等價(jià)于:
>>> class Person: ... live = True ... >>> Person <class '__main__.Person'>
創(chuàng)建Person
這類的type函數(shù)其實(shí)是一個(gè)叫“元類”的東西。而關(guān)于元類甚至可以話一整篇文章來講解了,好在我在之前的文章中有介紹過,感興趣的可以查看一下之前寫的一篇叫什么是 Python 元類這篇文章。元類在寫一些框架時(shí)用的較多,比如你去按sqlalchemy
的源碼的時(shí)候,你會(huì)發(fā)現(xiàn)有大量使用元類的場景。
到此這篇關(guān)于10個(gè)使用Python必須知道的內(nèi)置函數(shù)的文章就介紹到這了,更多相關(guān)10個(gè)Python的內(nèi)置函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python ceiling divide 除法向上取整(或小數(shù)向上取整)的實(shí)例
今天小編就為大家分享一篇python ceiling divide 除法向上取整 (或小數(shù)向上取整)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python 帶你快速上手 Apache APISIX 插件開發(fā)
Apache APISIX Python Runner 來了,社區(qū)中的小伙伴們在開發(fā) Apache APISIX 插件時(shí)又多了一種新選擇,本文將用實(shí)列向大家介紹,需要的朋友可以參考下面文章內(nèi)容2021-09-09使用numpngw和matplotlib生成png動(dòng)畫的示例代碼
這篇文章主要介紹了使用numpngw和matplotlib生成png動(dòng)畫的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01selenium+python實(shí)現(xiàn)登陸QQ郵箱并發(fā)送郵件功能
這篇文章主要介紹了selenium+python實(shí)現(xiàn)登陸QQ郵箱并發(fā)送郵件功能,本文給大家分享完整實(shí)例代碼,需要的朋友可以參考下2019-12-12python實(shí)現(xiàn)盲盒抽獎(jiǎng)功能(減庫存)
本文主要介紹了python實(shí)現(xiàn)盲盒抽獎(jiǎng)功能,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09