以下为个人学习笔记整理

# python 内建函数

# build-in function

  • abs:求绝对值,复数返回大小
    image-20200919150037738

  • all:可迭代对象内是否存在空元素
    8d45522f17bbe1b7978c73af8f3cd1ee.png

  • any:可迭代对象内是否存在非空元素
    296d63f7ecea65e38c49820842b13479.png

  • ascii:转为 ascii 编码
    db917a03adea4060bbda11eaa3412af8.png

  • bin:转为二进制
    b8f45c0c4645ba1931d58e05d8656641.png

  • bool:转为 bool 类型
    b9fd468eb7ff3b3b30071ee3a6d39db8.png

  • breakpoint:打上断点,通过输入 n 键(Next)进行调试
    8fde50e9f620207a5f1224c879c15cb4.png

  • bytearray:字节数组(可变)
    930ad90e2480861e262fae21d08703f3.png

bytearray 和 bytes 不一样的地方在于,bytearray 是可变的。
和字符串一样,字节类型也是不可变序列,而字节数组是可变版本的字节,它们的关系就相当于 list 与 tuple。
由于和字符串一样是序列类型,字节和字节数组可用的方法基本上一致。

  • bytes:字节数组(不可变)
    aee08af1697372d08f5d747c13b48213.png

  • callable:是否可调用
    cc6148284c84a79065132b9f6cf4e7d5.png

  • chr:整数转字符
    6b0be29023048400ec2cdd4f25490ee4.png

  • classmethod:类方法
    54f2f74d5b738ec65d87ad47fbe9ea0b.png

  • compile:解析字符串为代码
    bcd5589ec5d62490ee26ba94db3b3e3a.png

  • complex:将字符串或数字转换为复数
    e94574370e07295500f908f22ad454ed.png

  • delattr:删除属性
    a02027717e03531f6037826144ae307e.png

  • dir:返回当前本地范围内的名称列表
    6b7b457ee191a1247c8144f427b3551d.png

  • divmod:取整除和求余
    dfba0380a3d2acfc0efeea464e28c763.png

  • enumerate:带下标的便利
    6080d381cd5df542d2f063cac018ed17.png

  • eval:执行字符串表达式
    95cb6d7984845654350a33f7393941cd.png

  • exec:执行字符串指令
    02375bd8aa3c851fe908d4da37a12d87.png

  • filter:过滤迭代器对象
    4d5059f28a9bb922b15e076c97a9026f.png

  • float:浮点数
    ce331033297d4f29f30f1923bff466c1.png

  • format:格式化输出
    245cd98878331aff7c44a8016df2b9e9.png

  • frozenset:不可变集合
    77b1d2872c01071ed339136218699458.png

  • getattr:获取对象属性
    9a8340505084a6f435479fdcaaa081ad.png

  • globals:全局符号表字典
    c2280ac9cdf8815a4c96ee02f6a908ef.png

  • hasattr:对象是否存在属性
    152576b21f46b582a7dacf3280dc91fb.png

  • hash:哈希
    23c28626a76b67b25983f9719151214e.png

  • hex:整数转 16 进制
    83d8dad9b82e2450cd970cb82b891dcc.png

  • id:获取唯一 id
    90a48444523965b94bffc8cbb771f0b2.png

  • input:输入
    2ae13e404c813a280ce0967c08bd33e9.png

  • int:整数
    a8498720a0fae0453b65b7dae7e05ad1.png

  • isinstance:判断对象和类关系
    544b16158724fc148734d3781ef086b4.png

  • issubclass:判断两个类是否是父子关系
    6b3232d9c79caec881b4e6433cf09a45.png

  • iter:迭代函数
    959825d2b01ce74587475fe77782f5b3.png

  • len:求长度
    0234affb8519769563b3ebe6240d7a19.png

  • list:列表
    acee76fe033f84ec2117722ca7a2a871.png

  • locals:本地符号表字典
    d67aa94753b49f3347cd7ea0b9968c60.png

  • map:对迭代器的对象进行操作
    9982472069b15175825753e5a2d43f0b.png

  • max:求最大
    ef45c104d8ae88eb5f3e6117c7407b0b.png

  • min:求最小
    babe27d487bf563bebf1462ec5e05f20.png

  • next:迭代器的迭代函数
    83536150effb54eaefabd2dba5667ac6.png

  • oct:整数转 8 进制
    a8c290e6bc28bb02234fa7ae8c100bf7.png

  • open:打开文件
    ef3187e949ae86f23889d309bfd403d3.png

  • ord:字符转整数
    cc09a2eaa600978d4c142e65d47b5e2e.png

  • pow:求平方
    2fb14a3146c88bca9e17ac7e3b9a3a7c.png

  • print:打印
    d42afa92add7e4264807a8d690129d41.png

  • property:属性
    6f081fce7dd141d48e306d2acd0981ae.png

  • range:序列类型
    57b9cfaa0003a7107860b073fd68421f.png

  • repr:打印对象字符串
    d186aa7169c7f85e1a3d968cd17999fb.png

  • reversed:倒序
    3d807b7d60ca4bf72b22c609ee616e85.png

  • round:四舍五入取整
    6f67b9be10ea592b5e3369329a93e669.png

  • set:集合
    4a330910f174f320bdbeb3c2581c8984.png

  • setattr:设置对象属性
    76d2428a838efc5996aee465d00a781e.png

  • slice:切片
    0419e33bdb865991653fef1c086629f8.png

  • sorted:排序
    4780dcee40479ce2189566b3c083758d.png

  • staticmethod:静态类型函数装饰器
    d7a3662b75ca74a485e353090b2345e1.png

  • str:字符串
    487fe0e867a1037d4ff019cfce579579.png

  • sum:求和
    3a74a8d815583c0296b57750944dbc36.png

  • super:调用父类方法

def super(cls, inst):
    mro = inst.__class__.mro()
    return mro[mro.index(cls) + 1]

924c70d016ee3605ffaa6bd92c7176bd.png
mro 的 C3 超类线性化算法:
算法思想:

  • 对象父类的集合 「L(自己)」 可以视作 「自己」 + 每个 「L(父类)」 + 「父类集合」
  • 在存在多个父类合并的情况下,优先提取出第一个集合中的第一个元素与其他集合进行比对,如果其同时出现在其他集合的 非第一的位置 则跳至下一个集合重复上述操作。否则则把该元素添加至父类列表,并从其余所有集合中移除,完成后再次从第一个集合提取第一个元素重复上述内容。

773d44c1b5451bd76a106d69574a2fdf.png

以上图的 Z 为例:

L(O) = [O]
L(C) =[C,O]
L(A) =[A,O]
L(B) =[B,O]
L(D) =[D,O]
L(E) =[E,O]
L(K1) = [K1]
        + L(C) 
        + L(A) 
        + L(B) 
        + [C,A,B] 
        
 L(K1) = [K1]
        + [C,O]
        + [A,O]
        + [B,O]
        + [C,A,B]      
L(K1) = [K1,C,A,B,O]
L(K2) = [K2,A,B,D,O]
L(K3) = [K3,B,D,E,O]
L(Z) = [Z] 
        +L(K1) 
        + L(K3) 
        + L(K2) 
        + [K1,K2,K3]
L(Z)=  [Z] 
        + [K1,C,A,B,O]
        + [K2,A,B,D,O]
        + [K3,B,D,E,O]
        + [K1,K2,K3]
L(Z) =  [Z,K1,K2,K3]
        + [C,A,B,O]
        + [A,B,D,O]
        + [B,D,E,O]
 L(Z) =  [Z,K1,K2,K3,C,A,B,D,E]
        + [O]
        + [O]
        + [O]       
 L(Z) =  [Z,K1,K2,K3,C,A,B,D,E,O]

注意事项: super().func() 调用,不像 类名.func() 的显式,而是带有一些隐式的逻辑。 super().func() 的调用链路取决与 mro 的线性化顺序,会受到继承的父类顺序,以及是否存在多继承等问题而发生变化,并且如果需要调用多个父类的函数,就必须保证父类也支持 super() 操作,否则容易出现调用链中断的情况。

参考链接:传送门

  • mro:父类线性化

__mro__ 的返回值是一个 tuple,其中包含本身的父类线性关系。包括父类和父类的父类与本身的一个线性化关系。
可以通过 __mro__.index(class) 的方式来确定某个类在线性关系中所处的位置

689db1438b3ff11bca3fbc44ff998dcf.png

  • bases:父类元组

__bases__ :获取子类对象的上一层父类元组

321b0266159600b2f87b54e6ce913ac3.png

相关 mro 介绍

  • tuple:元组
    cb4f0a949f79d609230e1c2e0fcb6bf1.png

  • type:获取对象的类型
    c4cba5663227461e212276c874acfdb0.png

  • vars:查看对象内属性
    af184e8f621e70ecf397799145b60138.png

  • zip:压缩两个可迭代对象为一个
    0f1abeded0c4884aef918e53a8fd64c5.png

  • __import__ :和 import 功能类似
    5921973253da54d4c66f8f76a1e6b0ff.png