1. 寫在前面
這篇文章整理一下python常用的內置函數, 所謂python的內置函數,就是不用import就可以直接使用, 並且用起來也非常方便, 所以在這裏集中總結一下。
由於這些內置函數非常簡單, 所以這裏不會詳細介紹原理, 依然是從使用的角度出發, 給出使用案例, 首先, 先列出來目前我遇到過的內置函數:
- 數學運算的10個: len(), max(), pow(), round(), sum(), abs(), divmod(), complex(), hash(), id()
- 邏輯運算的2個: all(), any()
- 進制轉化的3個: bin(), oct(), hex()
- 類型函數:bool(), bytes(), str(), chr(), odr(), dict(), object(), int(), float(), frozenset(), list(), range(), set(), slict(), tuple(), type(), zip()
- 與類對象相關:delattr(), getattr(), hasattr(), dir(), isinstance(), issubclass(), super(), callable()
這些函數是python內置的, 直接用即可, 非常方便。 下面給出一些例子:
2. 數學運算的10個內置函數
我們先從數學運算的這幾個開始:
-
len(s)
: 這個函數應該不陌生吧, 求列表的長度或者元素個數的時候可是非常常用的。"""len(s) 返回對象內元素個數""" dic = {'a':1, 'b': 3} len(dic) # 2
-
max(iterable, * [, key, default])
: 返回最大值, * 表示命名關鍵字參數, 簡單的講,就是* 後面如果要寫參數, 必須是關鍵字參數,也就是key=value的形式。 之前整理的默認參數, 可變參數, 關鍵字參數, 命名關鍵字參數的知識在這裏就用上了。 這個函數也非常常用, 比如返回列表中的最大值或者字典中的最小值。 有max也就有min, 這兩個用法一樣。max(3, 1, 4, 2, 1) # 4 max({'a': 3, 'b1': 1, 'c': 4}) # 'c' 默認是字典鍵最大, 如果要值最大, 傳key a = [{'name':'xiaoming','age':18,'gender':'male'},{'name':'xiaohong', 'age':20, 'gender': 'female'}] max(a, key=lambda x:x['age']) #{'name': 'xiaohong', 'age': 20, 'gender': 'female'} """max、min 函數都有一個參數 key,它們也被稱爲 key 函數,key 函數一般結合更緊湊的 lambda 函數。"""
-
pow(x, y, z=None, /)
: pow函數求x爲底的y次冪, 如果z給出, 取餘, 所以python本身就有求冪運算的函數。pow(3, 2, 4) # 3^2%4=1
-
round(number[, ndigits])
: 四捨五入, ndigits代表小數點後保留幾位round(10.022222, 3) # 10.022
-
sum(iterable, /, start=0)
: 求和, /表示前面必須是位置參數, 不能是關鍵字參數, start是求和的初始值a = [1, 4, 2] sum(a) # 7 sum(a, 1) # 8
-
abs(x, /)
: 絕對值或者複數的模abs(-6) # 6
-
divmod(a, b)
: 取商和餘數divmod(10, 3) # (3, 1)
-
complex([real[,imag]])
: 創建一個複數, 這個可能不常用。complex(1, 2) # (1+2j)
-
hash(object): 返回對象的哈希值
a = "akjfiajd" hash(a) # 不可變對象纔可哈希 1641179426338835449
-
id(object): 返回對象的內存地址, 這個一般會用到判斷是否兩個對象的地址是否相同(是產生了新對象還是原對象的新引用)
id(a) # 1526937895152
3. 邏輯運算的兩個內置
-
all(iterable)
: 接受一個可迭代對象,如果迭代器的所有元素都爲真,返回 True,否則返回 False: -
any(iterable)
: 接受一個可迭代對象,如果迭代器裏有一個元素爲真,返回 True,否則返回 False:all([1, 0, 3, 6]) # False all([1, 2, 3]) # True any([0, 0, 1]) # True any([0, 0, []]) # False
4. 進制轉化的3個內置函數
十進制轉二進制, 八進制和16進制
-
bin(num): 十進制轉二進制
-
oct(num): 十進制轉八進制
-
hex(num): 十進制轉十六進制
bin(10) # '0b1010' oct(10) # '0o12' hex(15) # '0xf'
5. 類型相關的內置函數
# bool([x]) 測試一個對象是True還是False
bool([0, 0, 0]) # True
bool([]) # False
# bytes([source[, encoding[, errors]]]) 將一個字符串轉換成字節類型
s = 'apple'
bytes(s, encoding='utf-8') # b'apple'
# str(object='') 將字符類型、數值類型等轉換爲字符串類型
i = 100
str(i) # '100'
# chr(i) 查看十進制整數對應的 ASCII 字符
chr(65) # 'A'
# ord(c) 查看某個 ASCII 字符對應的十進制數
ord('A') # 65
# dict() 創建數據字典
# int() x 可能爲字符串或數值,將 x 轉換爲一個整數。
# float() 將一個字符串或整數轉換爲浮點數:
# set() 返回一個集合對象,並允許創建後再增加、刪除元素。集合的一大優點,容器裏不允許有重複元素,因此可對列表內的元素去重。
# frozenset([iterable]) 創建一個不可修改的凍結集合,一旦創建不允許增刪元素。
# tuple([iterable]) 創建一個不可修改的元組對象:
# list() 返回可變序列類型 list 函數還常用在,可迭代類型(Iterable)轉化爲列表。
m = map(lambda i: str(i), [1, 2, 3])
l = list(m) # 轉一下才能看到
l # ['1', '2', '3']
# type(object) 查看對象的類型 type 函數是非常實用的,閱讀他人代碼時,若函數參數類型沒有顯示給出,就會用到 type 函數。
# zip(*iterables) 創建一個迭代器,聚合每個可迭代對象的元素。參數前帶 *,意味着是可變序列參數,可傳入 1 個,2 個或多個參數。
6. 涉及類的內置函數
-
delattr(object, name)
: 刪除對象的屬性,在不需要某個或某些屬性時,這個方法就會很有用。class Student(): def __init__(self, id=None, name=None): self.id = id self.name = name xiaoming = Student(1, 'xiaoming') xiaoming.id # 1 delattr(xiaoming, 'id') xiaoming.id # 報錯
-
getattr(object, name[, default])
: 得到對象的某個屬性值getattr(xiaoming, 'name') # 'xiaoming'
-
hasattr(object, name)
: 判斷對象是否有name屬性hasattr(xiaoming, 'id') # False hasattr(xiaoming, 'name') # True
-
isinstance(object, classinfo)
: 判斷 object 是否爲類 classinfo 的實例,若是,返回 true。from collections.abc import Iterable isinstance([1, 2, 3], Iterable)
-
issubclass(class, classinfo):
如果 class 是 classinfo 類的子類,返回 True: -
super([type[, object-or-type]])
: 返回一個代理對象,它會將方法調用委託給 type 的父類或兄弟類。class Parent(): def __init__(self, x): self.v = x def add(self, x): return self.v + x class Son(Parent): def add(self, y): r = super().add(y) # #直接調用父類的add方法 print(r) #子類的add與父類相比,能實現對結果的打印功能 Son(1).add(2)
-
callable(object):
判斷對象是否可被調用,能被調用的對象就是一個 callable 對象,比如函數 str、int 等都是可被調用的。callable(str) # True callable('skfajf') # False 實例不可被調用
如果類的實例, 那麼肯定是不能被調用的, 但是如果想讓實例被調用, 必須重寫Student類上的__call__方法。 就是想整理這個例子, 因爲在神經網絡自定義層的時候, 往往就有一個這樣的方法:
class Student(): def __init__(self, id=None, name=None): self.id = id self.name = name xiaoming = Student('001', 'xiaoming') callable(xiaoming) # False
上面的xiaoming是不能被調用的, 因爲這是個實例對象。 而我們如果重寫Student類上的__call__方法之後:
# 如果想xiaoming可以被調用, 必須要重寫 Student 類上 __call__ 方法: class Student(): def __init__(self, id=None, name=None): self.id = id self.name = name def __call__(self): print('重寫call方法之後,實例就可以被調用了') xiaohua = Student('001', 'xiaohua') callable(xiaohua) # True xiaohua() # 重寫call方法之後,實例就可以被調用了
會發現這個實例對象竟然可以被調用了, 並且調用的時候自動調用Student類的
__call__
函數。 這個在自定義一些網絡層或者神經網絡的代碼調試那裏會經常遇到這種寫法。
關於內置函數, 就先整理到這裏, 這次的內置函數比較多, 不用刻意記住, 經常使用, 內化於心, 時間久了, 或許會產生很大的功效 😉。