Python 的內(nèi)置函數(shù)是該語言不可或缺的一部分,無需額外的庫即可提供基本功能。這些函數(shù)始終可用,無需導(dǎo)入任何模塊即可使用。它們是在 C for CPython(標(biāo)準(zhǔn) Python 實現(xiàn))中實現(xiàn)的,這確保了它們針對性能進(jìn)行了高度優(yōu)化。
內(nèi)置函數(shù)的存在使語言更加用戶友好和高效。它們提供了一種無需編寫其他代碼即可執(zhí)行常見任務(wù)的方法,這有助于開發(fā)人員節(jié)省時間并減少出錯的可能性。內(nèi)置函數(shù)還通過提供標(biāo)準(zhǔn)化的操作執(zhí)行方式來提高代碼的可讀性和可維護(hù)性。這種一致性使開發(fā)人員能夠快速理解和使用其他人編寫的代碼。
此外,內(nèi)置函數(shù)封裝了復(fù)雜的邏輯和優(yōu)化,使開發(fā)人員更容易高效地執(zhí)行操作,而無需了解底層實現(xiàn)細(xì)節(jié)。這種抽象對初學(xué)者特別有益,因為它允許他們專注于學(xué)習(xí)語言和解決問題,而不是擔(dān)心性能和優(yōu)化。
幾乎每個 Python 程序都使用內(nèi)置函數(shù)。它們提供了廣泛的功能,從基本的輸入/輸出操作到復(fù)雜的數(shù)據(jù)操作。以下是如何使用內(nèi)置函數(shù)的一些關(guān)鍵方面:
在這里,將看看 Python 的一些關(guān)鍵內(nèi)置函數(shù)的實現(xiàn)細(xì)節(jié)和優(yōu)化。了解這些函數(shù)是如何實現(xiàn)和優(yōu)化的,可以幫助你編寫更高效的代碼,并更好地理解 Python 內(nèi)置功能的強(qiáng)大功能。
該 print() 函數(shù)用于將數(shù)據(jù)輸出到控制臺。它可以處理多個參數(shù),默認(rèn)情況下,這些參數(shù)被轉(zhuǎn)換為字符串并與空格連接。
print("Hello,", "world!")
該 print() 函數(shù)是用 C 語言在 CPython 中實現(xiàn)的。它使用 sys.stdout file 對象來寫入輸出,該輸出被緩沖以提高性能。默認(rèn)情況下, print() 在輸出末尾添加換行符,可以使用 end 參數(shù)自定義該字符。
print("Hello,", "world!", end=" ")
print("This is on the same line.")
緩沖的使用減少了系統(tǒng)調(diào)用的次數(shù),使函數(shù)更加高效。
該 len() 函數(shù)返回對象的長度,該對象可以是序列(如字符串、列表或元組)或集合(如字典或集合)。
my_list=[1, 2, 3, 4]
print(len(my_list))
對于序列,該 len() 函數(shù)直接從對象的元數(shù)據(jù)中檢索 length 屬性,元數(shù)據(jù)存儲為對象結(jié)構(gòu)的一部分。這意味著在恒定時間(O(1)) len() 下運(yùn)行,使其非常高效。
該 sum() 函數(shù)返回可迭代對象中所有項的總和,例如列表或元組。
numbers=[1, 2, 3, 4]
print(sum(numbers))
該 sum() 函數(shù)使用用 C 編寫的高度優(yōu)化的循環(huán)來遍歷元素并將它們加在一起。此實現(xiàn)最大限度地減少了與 Python 中的循環(huán)相關(guān)的開銷,使函數(shù)非常快。此外, sum() 可以采用第二個參數(shù)來指定求和的初始值。
numbers=[1, 2, 3, 4]
print(sum(numbers, 10)) # Starts the sum at 10
max() 和 min() 函數(shù)分別返回可迭代對象中的最大和最小項。
numbers=[1, 2, 3, 4]
print(max(numbers))
print(min(numbers))
這兩個 max() min() 函數(shù)都只迭代一次輸入可迭代,為當(dāng)前最大值或最小值保留單個變量。這確保了這些函數(shù)在線性時間 (O(n)) 內(nèi)運(yùn)行,其中 n 是可迭代對象中的元素數(shù)。這些函數(shù)是用 C 語言實現(xiàn)的,這增加了它們的效率。
該 sorted() 函數(shù)從可迭代對象中的項返回一個新的排序列表。
numbers=[4, 2, 1, 3]
print(sorted(numbers))
該 sorted() 函數(shù)使用 Timsort 算法,該算法是從合并排序和插入排序派生的混合排序算法。Timsort 非常高效,在最壞的情況下時間復(fù)雜度為 O(n log n)。它經(jīng)過優(yōu)化,可在真實數(shù)據(jù)上表現(xiàn)良好,這些數(shù)據(jù)通常包含部分有序序列。
Timsort 的工作原理是將數(shù)據(jù)劃分為稱為“運(yùn)行”的小塊,然后合并它們。它利用數(shù)據(jù)中的現(xiàn)有順序來減少所需的比較和交換次數(shù)。
除了基本的內(nèi)置函數(shù)外,Python 還提供了一套高級內(nèi)置函數(shù),可實現(xiàn)更復(fù)雜的操作。這些函數(shù)支持函數(shù)式編程范式和高級數(shù)據(jù)操作技術(shù),使其成為開發(fā)人員武器庫中的強(qiáng)大工具。在本節(jié)中,我們將深入探討三個高級內(nèi)置函數(shù): map() 、 filter() 和 zip() 。
該 map() 函數(shù)將指定的函數(shù)應(yīng)用于可迭代對象中的所有項,并返回一個映射對象,該對象是迭代器。
用法示例:
numbers=[1, 2, 3, 4]
squared=map(lambda x: x**2, numbers)
print(list(squared))
在此示例中, map() 將 lambda 函數(shù) lambda x: x**2 應(yīng)用于列表中 numbers 的每個項目,從而生成一個新的平方值迭代器。
該 map() 函數(shù)在 CPython 中用 C 語言實現(xiàn),這保證了其效率。它以懶惰的方式運(yùn)行,這意味著它只在需要時將該功能應(yīng)用于項目。這樣可以避免創(chuàng)建中間列表,因為中間列表對于大型數(shù)據(jù)集來說可能是內(nèi)存密集型的。
延遲計算允許 map() 高度內(nèi)存效率,因為它動態(tài)生成每個值,而不是將所有結(jié)果存儲在內(nèi)存中。這在處理大型數(shù)據(jù)流或數(shù)據(jù)轉(zhuǎn)換管道時特別有用。
該 filter() 函數(shù)從指定函數(shù)返回 true 的可迭代對象的元素構(gòu)造迭代器。
用法示例:
numbers=[1, 2, 3, 4]
even_numbers=filter(lambda x: x % 2==0, numbers)
print(list(even_numbers))
在此示例中, filter() 將 lambda 函數(shù) lambda x: x % 2==0 應(yīng)用于列表中 numbers 的每個項目,從而生成偶數(shù)的迭代器。
該 filter() 函數(shù)也是用 C 語言實現(xiàn)的,并且像 一樣 map() ,可以延遲運(yùn)行。它僅在需要時計算可迭代的每個項目,如果函數(shù)返回 true,則包括輸出迭代器中的項目。
這種延遲評估可最大程度地減少內(nèi)存使用并提高性能,尤其是在處理大型數(shù)據(jù)集或組合多個篩選步驟時。通過避免創(chuàng)建中間列表, filter() 可以減少與數(shù)據(jù)操作相關(guān)的開銷。
該 zip() 函數(shù)采用多個迭代對象(零個或多個),將它們聚合到元組中,并返回這些元組的迭代器。
用法示例:
list1=[1, 2, 3]
list2=['a', 'b', 'c']
zipped=zip(list1, list2)
print(list(zipped))
在此示例中, zip() 將列表 list1 合并 list2 為元組迭代器,其中每個元組都包含輸入列表中的相應(yīng)元素。
該 zip() 函數(shù)是用 C 語言實現(xiàn)的,旨在提高效率。它并行迭代輸入可迭代對象,即時創(chuàng)建元組,而無需將它們存儲在內(nèi)存中。這樣 zip() 既省時又省內(nèi)存。
zip() 一旦最短的輸入可迭代對象用盡,就會停止創(chuàng)建元組,確保不會發(fā)生越界錯誤。這種設(shè)計 zip() 特別適用于組合來自多個來源的數(shù)據(jù),同時保持性能和安全性。
Python 內(nèi)置函數(shù)的優(yōu)勢之一是它們的可組合性。通過組合 map() 、 filter() 和 zip() ,您可以使用最少的代碼創(chuàng)建功能強(qiáng)大且富有表現(xiàn)力的數(shù)據(jù)轉(zhuǎn)換。
例:
list1=[1, 2, 3, 4]
list2=['one', 'two', 'three', 'four']
combined=zip(list1, list2)
filtered=filter(lambda x: x[0] % 2==0, combined)
result=map(lambda x: (x[0], x[1].upper()), filtered)
print(list(result))
在此示例中, zip() 將 和 list2 合并 list1 為元組, filter() 選擇第一個元素為偶數(shù)的元組,并將 map() 每個元組的第二個元素轉(zhuǎn)換為大寫。最終結(jié)果是滿足指定條件的轉(zhuǎn)換元組列表。
1、內(nèi)置函數(shù)
Python3解釋器中內(nèi)置了69個常用函數(shù),屬于底層的函數(shù),它們到處可用。有些對大家來說比較熟悉,比如abs(), max(), sum()... 也有一些比較陌生,比如locals(), all(), compile(), getattr()... 今天按照類別扼要總結(jié)。
2、類型相關(guān)
69個內(nèi)置函數(shù)中,與類型相關(guān)的指,把入?yún)b為某種類型,這樣的內(nèi)置函數(shù)包括:
bool() #d布爾型
int() #d整形
str() #d字符型
tuple() #d元包型
dict() #d字典型
list() #d列表型
zip() #可迭代對象聚合,(,)
complex() #d復(fù)數(shù)型
float() #d浮點(diǎn)型
bytes() #d字節(jié)型數(shù)組
bytearray() #d字?jǐn)?shù)數(shù)組
range() #d不可更改的序列
object() #d無屬性的根類
set() # 集合類型
frozenset() # 凍結(jié)集合類型,不允許修改
slice() # 返回一個slice對象,其中start, stop, step等都是只讀的
比如bool(x),將入?yún)封裝為Boolean類型,返回值為True或False
bool(10)
>>> True
bool(0)
>>> False
bool(\'false\')
>>> True
bool(0.0)
>>> False
關(guān)于bytes()和bytearray()的用法可參考:
https://www.cnblogs.com/sesshoumaru/p/5980090.html
3、數(shù)理統(tǒng)計相關(guān)
有的內(nèi)置函數(shù)可以完成簡單的數(shù)理統(tǒng)計工作,這樣的內(nèi)置函數(shù)包括:
abs() #d絕對值
min() #d最小
max() #d最大
sum() #d求和
pow() #d求次冪
all() #d所有元素為true則為true
any() #d至少一個元素為true則為true
divmod() #d(商,余數(shù))
round() #四舍五入
len() #參數(shù)元素個數(shù)
any()函數(shù)代碼等價于以下5行代碼:
def any(iterable):
for element in iterable:
if element:
return True
return False
divmod函數(shù):
divmod(10,8)
>>> (1,2)
4、進(jìn)制轉(zhuǎn)換
有些內(nèi)置函數(shù)可以幫助我們輕松實現(xiàn)進(jìn)制轉(zhuǎn)換,比如:
chr() #unicode編碼
ord() #chr()反操作
bin() #轉(zhuǎn)化為ob開頭的二進(jìn)制字符
hex() #轉(zhuǎn)化為ox開頭的十六進(jìn)制字符
ascii() #可打印表示對象,類似于 repr()
oct() # 轉(zhuǎn)化為0o開頭的八進(jìn)制字符
5、面向?qū)ο笙嚓P(guān)
Python提供與對象屬性相關(guān)的操作函數(shù),它們?yōu)闈M足Python屬性的動態(tài)調(diào)整提供了可能。
setattr(object, name, value) #為對象設(shè)置屬性
delattr(object, name) # 刪除命名的屬性
getattr(object,name) #獲取屬性的取值,如果對象無此屬性,會拋異常
getattr(object,name, 123) #即便無此屬性,也不會拋異常,會返回123
hasattr(object,name) # 判斷name屬性是否屬于object
isinstance(object, classinfo) #判斷object是classinfo的實例嗎
issubclass(class, classinfo) # 判斷class是否為classinfo的子類
super() #調(diào)用父類, 方法
property() #特性相關(guān),@property標(biāo)記為屬性
type() #返回實例的類型
vars() # 返回對象的信息等
classmethod() # 轉(zhuǎn)化方法為類方法
staticmethod() #方法是靜態(tài)方法
比如,
setattr(x,\'footbar\',12) #等價于 x.footbar=12
issubclass(list,object)
>>> True
issubclass(object,list)
>>> False
6、迭代器相關(guān)
next, reversed, iter(), enumerate()這些都是與迭代相關(guān)的函數(shù),比如以下,就是返回一個逆向迭代器:
rev = reversed([1,-2,4,0])
for i in rev:
print(i)
>>> 0
4
-2
1
iter函數(shù)使用例子
iter(\'abc\')
>>> <str_iterator at 0x8b9fba8>
for i in iter(\'abc\'):
print(i)
>>> a
b
c
7、map函數(shù)
map函數(shù)的原型為:map(function, iterable, ...) ,返回一個迭代器,在每一個可迭代對象的元素上應(yīng)用function.
map應(yīng)用舉例:
def f(x):
reutn x**2
mymap = map(f, [1,2,3]) # 返回一個迭代器
for i in mymap:
print(i)
>>> 1
4
9
8、排序相關(guān)
sorted返回一個排序好的列表,比如:
li = [1,-2,4,0]
sorted(li)
>>> [-2,0,1,4]
9 其他
compile函數(shù)與源碼編譯相關(guān);memoryview函數(shù)與內(nèi)存視圖相關(guān);help查看幫助;dir查看對象的方法和屬性;更多見下表:
hash() # 返回對象的哈希碼
id() #返回一個對象的標(biāo)識
input() #與標(biāo)準(zhǔn)輸出相關(guān)
breakpoint() #調(diào)試相關(guān)
exec() #動態(tài)執(zhí)行Python代碼
callable() #判斷對象是否可調(diào)用
format() #對象格式化
format是一個比較常用的,用于格式化輸出的函數(shù),詳細(xì)的格式化參數(shù)標(biāo)準(zhǔn)形式,參考文檔:
https://docs.python.org/3/library/string.html#formatspec
參考官網(wǎng):
https://docs.python.org/3/library/functions.html