在學(xué)習(xí)python中總有一些問(wèn)題困擾我們:
Python中有這么多函數(shù),記住所有這些的最好方法是什么?
學(xué)習(xí)我們?nèi)粘P枰暮瘮?shù)(如enumerate 和range)的最佳方法是什么?
你怎么知道用 Python 解決問(wèn)題的所有方法?你會(huì)記住它們嗎?
實(shí)際上PyPI 上有幾十個(gè)內(nèi)置函數(shù)和類,數(shù)百個(gè)工具捆綁在 Python 的標(biāo)準(zhǔn)庫(kù)中,還有數(shù)千個(gè)第三方庫(kù)。沒(méi)有人能記住所有這些東西。
我建議對(duì)這些知識(shí)按以下進(jìn)行分類:
有些內(nèi)容我們應(yīng)該記住,以便我熟悉它們
有些內(nèi)容我們應(yīng)該知道,,以便我以后可以更有效地查找它們
有些內(nèi)容除非有一天我需要它們,否則我根本不應(yīng)該花費(fèi)太長(zhǎng)時(shí)間去研究它們。
考慮到這種方法,我們將瀏覽 Python 文檔中的內(nèi)置函數(shù)頁(yè)面。
要說(shuō)完所有內(nèi)容文章會(huì)比較長(zhǎng),我會(huì)分幾篇進(jìn)行,這篇我們先說(shuō)前10個(gè)最通用的內(nèi)在函數(shù),所以如果你時(shí)間緊迫或特別想看某個(gè)內(nèi)置函數(shù),你不必逐一查看,可以直接定位到你感興趣的內(nèi)容上:
我估計(jì)大多數(shù) Python 開(kāi)發(fā)人員只需要大約 30 個(gè)內(nèi)置函數(shù),但其中 30 個(gè)取決于實(shí)際使用Python 所做的事情。
我們?nèi)值姆绞絹?lái)看看 Python 的所有 71 個(gè)內(nèi)置函數(shù)。
我將嘗試將這些內(nèi)置插件分為五類:
眾所周知的內(nèi)置插件:大多數(shù)較新的Pythonistas 很快就迫不及待地接觸到這些內(nèi)置插件
被新的Pythonistas忽略:了解這些函數(shù)很有用,但是當(dāng)對(duì) Python 較新時(shí),它們很容易被忽略
稍后再學(xué)習(xí):這些內(nèi)置插件通常很有用,但會(huì)在需要時(shí)/如果需要它們時(shí)找到它們
也許最終會(huì)學(xué)習(xí)這些:這些可以派上用場(chǎng),但僅限于特定情況
可能不需要這些:除非正在做一些相當(dāng)專業(yè)的事情,否則不太可能需要這些
第 1 類和第2 類中的內(nèi)置函數(shù)是幾乎所有 Python 程序員最終都應(yīng)該學(xué)習(xí)的基本內(nèi)置函數(shù)。
第 3 類和第 4 類中的內(nèi)置程序是專門(mén)的內(nèi)置程序,它們通常非常有用,但對(duì)它們的需求會(huì)因你對(duì) Python 的使用而異。第 5 類是神秘的內(nèi)置插件,當(dāng)你需要它們時(shí)可能會(huì)非常方便,但許多 Python 程序員可能永遠(yuǎn)不需要。
Pythonistas的注意事項(xiàng):我將所有這些內(nèi)置函數(shù)稱為函數(shù),但其中 27 個(gè)實(shí)際上不是函數(shù)。
眾所周知的內(nèi)置函數(shù)(可能大家已經(jīng)知道):
printlenstrintfloatlisttupledictsetrange
新的 Python 程序員經(jīng)常忽略的內(nèi)置函數(shù):
sumenumeratezipboolreversedsortedminmaxanyall
還有 5 個(gè)通常被忽視的內(nèi)置插件,我建議了解這些插件,因?yàn)樗鼈兪拐{(diào)試更容易:
除了上面的 25 個(gè)內(nèi)置函數(shù)外,我們還將在稍后學(xué)習(xí)中簡(jiǎn)要介紹其他 46 個(gè)內(nèi)置函數(shù),也許最終會(huì)學(xué)習(xí)它,也可能不需要這些部分。
10個(gè)常見(jiàn)的內(nèi)置函數(shù)
如果你一直在編寫(xiě) Python 代碼,那么這些內(nèi)置函數(shù)可能已經(jīng)很熟悉了。
你可能已經(jīng)知道它的打印功能,但可能不知道 print 還可以接受的各種關(guān)鍵字參數(shù):
>>> words = ['Welcome', 'to', 'Python']>>> print(words)['Welcome', 'to', 'Python']>>> print(*words, end='!\n')Welcome to Python!>>> print(*words, sep='\n')WelcometoPython
你可以自己測(cè)試下。
在 Python 中,我們不寫(xiě) my_list.length() 或 my_string.length 之類的東西;相反,我們奇怪地(至少對(duì)于新的 Pythonistas)用 len(my_list) 和 len(my_string)。
>>> words = ['Welcome', 'to', 'Python']>>> len(words)3
不管你是否喜歡這個(gè)類似運(yùn)算符的 len 函數(shù),你都必須使用了,所以你需要習(xí)慣它。
與許多其他編程語(yǔ)言不同,Python 沒(méi)有類型強(qiáng)制,因此你無(wú)法在 Python 中連接字符串和數(shù)字。
>>> version = 3>>> 'Python ' + versionTraceback (most recent call last): File '<stdin>', line 1, in <module>TypeError: can only concatenate str (not 'int') to str
Python 拒絕將 3 個(gè)整數(shù)強(qiáng)制轉(zhuǎn)換為字符串,因此我們需要自己手動(dòng)完成,使用內(nèi)置的 str 函數(shù)(從技術(shù)上講是類,但正如我所說(shuō),我將調(diào)用這些函數(shù)):
>>> version = 3>>> 'Python ' + str(version)'Python 3'
你是否有用戶輸入并需要將其轉(zhuǎn)換為數(shù)字?你需要 int 函數(shù)!
int 函數(shù)可以將字符串轉(zhuǎn)換為整數(shù):
>>> program_name = 'Python 3'>>> version_number = program_name.split()[-1]>>> int(version_number)3
還可以使用 int 將浮點(diǎn)數(shù)截?cái)酁檎麛?shù):
>>> from math import sqrt>>> sqrt(28)5.291502622129181>>> int(sqrt(28))5
請(qǐng)注意,如果需要在除法時(shí)截?cái)啵?// 運(yùn)算符可能更合適(盡管這對(duì)負(fù)數(shù)的工作方式不同):int(3 / 2) == 3 // 2。
需要轉(zhuǎn)換為數(shù)字的字符串實(shí)際上不是整數(shù), 就需要使用 float 而不是 int 進(jìn)行此轉(zhuǎn)換。
>>> program_name = 'Python 3'>>> version_number = program_name.split()[-1]>>> float(version_number)3.0>>> pi_digits = '3.141592653589793238462643383279502884197169399375'>>> len(pi_digits)50>>> float(pi_digits)3.141592653589793
還可以使用 float 將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)。
在 Python 2 中,我們?cè)?jīng)使用 float 將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)來(lái)強(qiáng)制浮點(diǎn)除法而不是整數(shù)除法?!罢麛?shù)除法”在 Python 3 中不再存在(除非你專門(mén)使用 // 運(yùn)算符),因此我們不再需要 float 來(lái)達(dá)到此目的。因此,如果在 Python 3 代碼中看到 float(x) / y,則可以將其更改為僅 x / y。
列表函數(shù)這樣做:
>>> numbers = [2, 1, 3, 5, 8]>>> squares = (n**2 for n in numbers)>>> squares<generator object <genexpr> at 0x7fd52dbd5930>>>> list_of_squares = list(squares)>>> list_of_squares[4, 1, 9, 25, 64]
如果你知道正在使用列表,則可以使用 copy 方法制作列表的新副本:
>>> copy_of_squares = list_of_squares.copy()
但是如果你不知道你正在使用的迭代器是什么,列表函數(shù)是循環(huán)遍歷一個(gè)迭代器并復(fù)制它的更通用的方法:
>>> copy_of_squares = list(list_of_squares)
也可以為此使用列表推導(dǎo),但如果是新手我不建議這樣做。
>>> my_list = list() # Don't do this>>> my_list = [] # Do this instead
使用 [] 被認(rèn)為更慣用,因?yàn)檫@些方括號(hào) ([]) 實(shí)際上看起來(lái)像 Python 列表。
tuple 函數(shù)與 list 函數(shù)非常相似,不同之處在于它生成元組:
>>> numbers = [2, 1, 3, 4, 7]>>> tuple(numbers)(2, 1, 3, 4, 7)
如果你需要一個(gè)元組而不是一個(gè)列表,因?yàn)檎趪L試創(chuàng)建一個(gè)可散列的集合以在字典鍵中使用,例如,將希望通過(guò)列表訪問(wèn)元組。
dict 函數(shù)創(chuàng)建一個(gè)新字典。
與 list 和 tuple 類似,dict 函數(shù)等效于循環(huán)遍歷鍵值對(duì)的可迭代對(duì)象并從中創(chuàng)建字典。
給定一個(gè)包含兩項(xiàng)元組的列表:
>>> color_counts = [('red', 2), ('green', 1), ('blue', 3), ('purple', 5)]>>> colors = {}>>> for color, n in color_counts:... colors[color] = n...>>> colors{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
用dict函數(shù)替換:
>>> colors = dict(color_counts)>>> colors{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
dict 函數(shù)接受兩種類型的參數(shù):
另一個(gè)字典(映射是通用術(shù)語(yǔ)),在這種情況下,該字典將被復(fù)制
一個(gè)鍵值元組列表(更準(zhǔn)確地說(shuō),是一個(gè)包含兩項(xiàng)迭代的迭代),在這種情況下,一個(gè)新的字典將從這些元組中構(gòu)造出來(lái)
所以這也有效:
>>> colors{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}>>> new_dictionary = dict(colors)>>> new_dictionary{'red': 2, 'green': 1, 'blue' 3, 'purple': 5}
dict 函數(shù)還可以接受關(guān)鍵字參數(shù)來(lái)制作帶有基于字符串的鍵的字典:
>>> person = dict(name='Trey Hunner', profession='Python Trainer')>>> person{'name': 'Trey Hunner', 'profession': 'Python Trainer'}
但我更喜歡使用字典文字來(lái)代替:
>>> person = {'name': 'Trey Hunner', 'profession': 'Python Trainer'}>>> person{'name': 'Trey Hunner', 'profession': 'Python Trainer'}
字典字面量語(yǔ)法更靈活,速度也更快,但最重要的是,我發(fā)現(xiàn)它更清楚地傳達(dá)了我們正在創(chuàng)建字典的事實(shí)。
與列表和元組一樣,空字典也應(yīng)該使用文字語(yǔ)法來(lái)制作:
>>> my_list = dict() # Don't do this>>> my_list = {} # Do this instead
使用 {} 的 CPU 效率稍高一些,但更重要的是它更符合習(xí)慣:通常會(huì)看到花括號(hào) ({}) 用于制作字典,但 dict 的使用頻率要低得多。
set 函數(shù)創(chuàng)建一個(gè)新集合。它接受一個(gè)可哈希值(字符串、數(shù)字或其他不可變類型)的迭代并返回一個(gè)集合:
>>> numbers = [1, 1, 2, 3, 5, 8]>>> set(numbers){1, 2, 3, 5, 8}
沒(méi)有辦法用 {} 集合字面量語(yǔ)法創(chuàng)建一個(gè)空集(普通的 {} 創(chuàng)建一個(gè)字典),所以 set 函數(shù)是創(chuàng)建一個(gè)空集的唯一方法:
>>> numbers = set()>>> numbersset()
實(shí)際上這是一個(gè)不對(duì),因?yàn)槲覀冇羞@個(gè):
>>> {*()} # This makes an empty setset()
但是這種語(yǔ)法令人困惑(它依賴于 * 運(yùn)算符的一個(gè)較少使用的功能),所以我不推薦它。
range 函數(shù)為我們提供了一個(gè) range 對(duì)象,它表示一個(gè)數(shù)字范圍:
>>> range(10_000)range(0, 10000)>>> range(-1_000_000_000, 1_000_000_000)range(-1000000000, 1000000000)
生成的數(shù)字范圍包括起始數(shù)字,但不包括終止數(shù)字(范圍(0, 10)不包括 10)。
當(dāng)想循環(huán)數(shù)字時(shí),范圍函數(shù)很有用。
>>> for n in range(0, 50, 10):... print(n)...010203040
一個(gè)常見(jiàn)的用例是執(zhí)行 n 次操作(順便說(shuō)一下,這是一個(gè)列表生成式):
first_five = [get_things() for _ in range(5)]
Python 2 的 range 函數(shù)返回一個(gè)列表,這意味著上面的表達(dá)式會(huì)產(chǎn)生非常大的列表。Python 3 的范圍與 Python 2 的 xrange 類似(盡管它們有點(diǎn)不同),因?yàn)楫?dāng)我們遍歷這些范圍對(duì)象時(shí),數(shù)字是惰性計(jì)算的,想必Python3的方式更好。
以上就是最常用的python內(nèi)建函數(shù)使用了,接下來(lái)一篇講解釋另外10有用的內(nèi)建函數(shù)。
聯(lián)系客服