美文网首页
python 内置函数 必须搞定哦

python 内置函数 必须搞定哦

作者: 天空蓝雨 | 来源:发表于2020-04-26 09:05 被阅读0次
    image.png
    69 个内置函数,还是挺多的,呵呵,小意思
    官方文档:https://docs.python.org/zh-cn/3/library/functions.html
    一个个来吧:
    • abs(x)

    返回一个数的绝对值。
    参数可以是一个整数或浮点数。
    如果参数是一个复数,则返回它的模。
    如果 x 定义了 __abs__(),则 abs(x) 将返回 x.__abs__()

    • all(iterable)

    如果 iterable 的所有元素为真(或迭代器为空),返回 True 。等价于(这个等价真的一语中的):

    def all(iterable):
        for element in iterable:
            if not element:
                return False
        return True
    
    • any(iterable)

    任一 ,和 all() 相反,只满足一个即可,相当于是 all() 的取反。
    如果 iterable 的任一元素为真则返回 True。
    如果迭代器为空,返回 False。 等价于:

    def any(iterable):
        for element in iterable:
            if element:
                return True
        return False
    
    • ascii(object)

    就像函数 repr(),返回一个对象可打印的字符串,但是 repr() 返回的字符串中非 ASCII 编码的字符,会使用 \x\u\U 来转义。生成的字符串和 Python 2 的 repr() 返回的结果相似。

    • bin(x)

    bin 即:binary 二进制的缩写,转化为二进制的意思
    将一个整数转变为一个前缀为“0b”的二进制字符串。结果是一个合法的 Python 表达式。如果 x 不是 Python 的 int 对象,那它需要定义 __index__() 方法返回一个整数。一些例子:

    >>> bin(3)    
    '0b11'
    >>> bin(-10)
    '-0b1010'
    
    • class bool([x])

    返回一个布尔值,True 或者 Falsex 使用标准的 真值测试过程 来转换。如果 x 是假的或者被省略,返回 False;其他情况返回 Truebool 类是 int 的子类(参见 数字类型 --- int, float, complex)。其他类不能继承自它。它只有 FalseTrue 两个实例(参见 布尔值)。

    • breakpoint(*args, **kws)

    此函数会在调用时将你陷入调试器中,神马pdb啥的,感觉太难了,哈哈哈,以后有机会再看

    • class bytearray([source[, encoding[, errors]]])

    返回一个新的 bytes 数组

    • class bytes([source[, encoding[, errors]]])

    返回一个新的“bytes”对象, 是一个不可变序列,包含范围为 0 <= x < 256 的整数。bytesbytearray 的不可变版本

    • callable(object)

    如果参数 object 是可调用的就返回 True,否则返回 False。 如果返回 True,调用仍可能失败,但如果返回 False,则调用 object 将肯定不会成功。如果是类本身,肯定是callable 的(因为所有类都可以( ) 初始化),所以一般判断的是类的实例,只要实例所在的类有 _ call _ 就是判True
    这个函数一开始在 3.0 的时候被移除了,3.2 之后又重新引入

    • chr(i)

    i 合法范围是 0 到 1,114,111(16 进制表示是 0x10FFFF),把整数转化为 Unicode 字符(所有的单个字符,所有国家的语言,比如中文就转化为 一个喊汉字,或者一个 中文标点符号等等。)表示(是ord 的逆函数)


    几乎可以转化为所有字符

    中文真实博大精深50010 是什么汉字??


    韩文大概是40000+ 之后了
    有兴趣可以试试
    • @classmethod

    装饰器,把一个方法封装成类方法,就像实例把自己传入给 第一个参数self 一样,类方法会把所属类 传给方法第一个参数
    调用直接使用类,或者其实例都可以的,如果是继承的子类调用,则会把子类自己传入。

    如果类方法在其所属类的派生类上调用,则该派生类对象会被作为隐含的第一个参数被传入 (派生类理解为子类)

    • compile (source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

    这个函数内容还挺多的
    简单来说和eval() 有点类似的感觉
    参数:
    source -- 字符串或者AST(Abstract Syntax Trees)对象。。
    filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
    mode -- 指定编译代码的种类。可以指定为 exec, eval, single。

    指定编译代码的种类。可以指定为 exec, eval, single
    compile()方法返回一个Python代码对象

    如果Python代码为字符串形式或是AST对象,并且您想将其更改为代码对象,则使用compile()方法
    稍后可以使用诸如exec()eval()之类的方法来调用compile()方法返回的代码对象,这些方法 将执行动态生成的Python代码
    Python可执行对象——exec、eval、compile
    compile 返回的是 可以被eval exec 或 single 可以调用的对象

    简单来说:

    compile语句是从type类型(包括’eval’: 配合eval使用,’single’: 配合单一语句的exec使用,’exec’: 配合多语句的exec使用)中将str里面的语句创建成代码对象。file是代码存放的地方,通常为""。
    compile语句的目的是提供一次性的字节码编译,就不用在以后的每次调用中重新进行编译了

    其实可直接使用eval 和exec 的,只不过compile 和re.compile 的目的是一样的,编译一次,加快执行速度。
    关于eval 和exec的使用以及参数的不同,参见下面的 这两个内置函数的介绍
    eval 只能执行单一语句,比如"a+1", "print(22)" ,不执行 "for i in range(5):print(21)",但是exec 却可以

    • class complex([real[, imag]])

    把参数(数字或数字类字符串)转化复数表示;
    例子:

    complex(1, 2)
    结果:(1 + 2j)
    complex(1)    # 数字 第二个参数默认为 0 
    (1 + 0j)
    complex()  # 不传参数默认都为 0 
    结果 (0j)
     # 注意:这个地方在"+"号两边不能有空格,也就是不能写成"1 + 2j",应该是"1+2j",否则会报错
    >>> complex("1+2j")
    (1 + 2j)
    
    

    如果参数是 Python 对象:
    对于一个普通 Python 对象 xcomplex(x) 会委托给 x.__complex__()。 如果 __complex__() 未定义则将回退至 __float__()。 如果 __float__() 未定义则将回退至 __index__()

    多讲一点,int() float() complex() index() 分别调用是对象的
    __int__(), __float__()__complex__()
    __index__(self)

    类似的内置函数 ,如果他们的参数是对象,而不是常规参数 。有很多都是调用的这些对应的内置魔法方法。(一般来说 就是内置函数前后加上 _ _)

    比如 int("2") 结果是 2
    传入对象如果没有 _ _ int_ _() 会报错,因为他既不是 明显的数字字符串,也不是带有 可以调用 的 _ int _() 对象:



    没有 __ int__ 会触发错误的
    • delattr(object, name)

    这个很熟悉了。 和setattr() getattr() hasattr()都是一起的
    delattr(x, 'foobar') 等价于 del x.foobar

    • class dict(**kwarg)

    穿件一个新字典的函数,这个很熟悉了

    • dir([object])

    如果没有实参,则返回当前本地作用域中的名称列表。如果有实参,它会尝试返回该对象的有效属性列表

    无参数
    有参数就返回对象的所有属性
    如果对象有 _ dir _ 那么久调用他(并且必须返回一个属性列表)
    如果对象不提供 __dir__(),这个函数会尝试从对象已定义的 __dict__属性和类型对象收集信息。结果列表并不总是完整的,如果对象有自定义 __getattr__()那结果可能不准确。

    如果对象是模块对象,则列表包含模块的属性名称。
    如果对象是类型或类对象,则列表包含它们的属性名称,并且递归查找所有基类的属性。
    否则,列表包含对象的属性名称,它的类属性名称,并且递归查找它的类的所有基类的属性

    返回的列表按字母表排序。例如:

    >>> import struct
    >>> dir()   # show the names in the module namespace  # doctest: +SKIP
    ['__builtins__', '__name__', 'struct']
    >>> dir(struct)   # show the names in the struct module # doctest: +SKIP
    ['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
     '__initializing__', '__loader__', '__name__', '__package__',
     '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
     'unpack', 'unpack_from']
    >>> class Shape:
    ...     def __dir__(self):
    ...         return ['area', 'perimeter', 'location']
    >>> s = Shape()
    >>> dir(s)
    ['area', 'location', 'perimeter']
    
    • divmod(a, b)

    返回 一个结果元祖,第一个元素是商,第二个参数是余数

    如:

    >>>divmod(7, 2)
    (3, 1)
    >>> divmod(8, 2)
    (4, 0)
    >>> divmod(1+2j,1+0.5j)
    ((1+0j), 1.5j)
    
    • enumerate(iterable, start=0)

    这个也很熟悉了,迭代列表元素的时候经常用,返回 (index,value) 元祖 的迭代器(带yield ,那就是一个迭代器了)
    原理如下:

    def enumerate(sequence, start=0):
        n = start
        for elem in sequence:
            yield n, elem
            n += 1
    
    • eval(expression[, globals[, locals]])

    很熟悉了

    • exec(object[, globals[, locals]])

    和eval 类似,但是支持动态执行语句,一大串的那种
    可以是 compile 编译过的pythoN 对象
    该函数返回值是 None 请注意


    只会执行代码,但是不会返回任何东西
    • filter(function, iterable)

    这个也用过,经常和map 函数一起使用的来着 ,map 是不判断,直接把后面的可迭代参数 ,传入前面的 func,结果也是一个可迭代对象

    Python2.x 中返回的是过滤后的列表, 而 Python3 中返回到是一个 filter 类。
    filter 类实现了 iternext 方法, 可以看成是一个迭代器, 有惰性运算的特性, 相对 Python2.x 提升了性能, 可以节约内存。

    function -- 判断函数。
    iterable -- 可迭代对象。
    下面说的就比较清晰了

    filter(function, iterable) 相当于一个生成器表达式,当 function 不是 None 的时候为 (item for item in iterable if function(item));function 是 None 的时候为 (item for item in iterable if item) 。

    例子:

    过滤出1~100中平方根是整数的数:
    import math
    def is_sqr(x):
        return math.sqrt(x) % 1 == 0
     
    newlist = filter(is_sqr, range(1, 101))
    print(list(newlist))
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    
    • class float([x])

    返回从数字或字符串 x 生成的浮点数
    如果实参是字符串,则它必须是包含十进制数字的字符串
    普通Python对象 会交个 __float__() 如果没有float(),则将回退至 __index__()
    如果没有实参,则返回 0.0

    • format(value[, format_spec])

    这个比较熟悉,不单独详说

    • class frozenset([iterable])

    • getattr(object, name[, default])

    这个很熟悉了,不多介绍

    • globals()

    返回表示当前全局符号表的字典。这总是当前模块的字典


    演示
    • hasattr(object, name)

    获取对象的属性,name是字符串
    是调用 getattr(object, name) 看是否有 AttributeError 异常来实现的
    如果字符串是对象的属性之一的名称,则返回 True,否则返回 False。

    • hash(object)

    返回该对象的哈希值(如果它有的话)。哈希值是整数。它们在字典查找元素时用来快速比较字典的键。相同大小的数字变量有相同的哈希值(即使它们类型不同,如 1 和 1.0)。

    • help([object])

    和dir 有点像,但是会详细一点
    • hex(x)

    整数转化为16 进制
    将整数转换为以“0x”为前缀的小写十六进制字符串。如果 x 不是 Python int 对象,则必须定义返回整数的 __index__() 方法。一些例子:

    hex(255)
    '0xff'
    hex(-42)
    '-0x2a'
    

    别忘了转化字符串要 也可以用 % 或者 format 实现:

    '%#x' % 255, '%x' % 255, '%X' % 255
    ('0xff', 'ff', 'FF')
    format(255, '#x'), format(255, 'x'), format(255, 'X')
    ('0xff', 'ff', 'FF')
    f'{255:#x}', f'{255:x}', f'{255:X}'
    ('0xff', 'ff', 'FF')
    
    image.png
    image.png

    格式化字符串文字: 就是常见的 f 或者 F 开头的 常简称为 f-字符串
    将表达式写成 {expression} 来在字符串中包含 Python 表达式的值。
    例子一:

    import math
    print(f'The value of pi is approximately {math.pi:.3f}.')
    The value of pi is approximately 3.142
    

    例子二:

    在 ':' 后传递一个整数可以让该字段成为最小字符宽度。这在使列对齐时很有用
    table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
    for name, phone in table.items():
    ...     print(f'{name:10} ==> {phone:10d}')
    ...
    Sjoerd     ==>       4127
    Jack       ==>       4098
    Dcab       ==>       7678
    
    animals = 'eels'
    print(f'My hovercraft is full of {animals}.')
    My hovercraft is full of eels.`
    

    从上面看出,这是 % fromat 的另一种 实现方式。{} 里面可以传变量,或者表达式,并且可以在 后面加 { varname :xx } 来格式化这个变量的值,总的来说,你如果使用了这个格式化字符串,你就是高大上了
    最后弄一个,对齐的例子,回忆一下format 把

    2d  表示 长度为 2 的十进制整数
    for x in range(1, 11):
    ...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
    ...
     1   1    1
     2   4    8
     3   9   27
     4  16   64
     5  25  125
     6  36  216
     7  49  343
     8  64  512
     9  81  729
    10 100 1000
    
    • id(object)

    很熟悉了
    返回对象的“标识值”。该值是一个整数,在此对象的生命周期中保证是唯一且恒定的。两个生命期不重叠的对象可能具有相同的 id()

    以下函数记录记录的比较快了,虽然比较熟悉,但是原理并不是太别的了解,需要经常看看
    • input([prompt])

    当读取到 EOF 时,则触发 EOFError

    • class int([x])

    在 3.8 版更改: 如果 __int__() 未定义则回退至 __index__()

    • isinstance(object, classinfo)

    如果 classinfo 既不是类型,也不是类型元组或类型元组的元组,则将引发 TypeError异常。
    classinfo 可以是默认类,也可以是你自定义的,可以是多个类型的元祖, 只满足一个就是 True

    • issubclass(class, classinfo)

    和上一个 isinstance 类似,只不过是直接判断类的,而不是实例

    • iter(object[, sentinel])

    这个很熟悉了,把克迭代对象,转化为 迭代器
    这个函数的解释很麻烦。
    写一个文件读写的例子:

    from functools import partial  # 这个是偏函数,他返回的是函数对象哦,这里
    相当于给了他一个初始参数 64 
    with open('mydata.db', 'rb') as f:
        for block in iter(partial(f.read, 64), b''):
            process_block(block)
    

    关于:partial 函数 定义:

    func = functools.partial(func, *args, **keywords)
    func: 需要被扩展的函数,返回的函数其实是一个类 func 的函数
    *args: 需要被固定的位置参数
    **kwargs: 需要被固定的关键字参数
    # 如果在原来的函数 func 中关键字不存在,将会扩展,如果存在,则会覆盖
    

    关于 partial 的使用例子:

    def add(*args, **kwargs):
        # 打印位置参数
        for n in args:
            print(n)
        print("-"*20)
        # 打印关键字参数
        for k, v in kwargs.items():
           print('%s:%s' % (k, v))
    add_partial = partial(add, 10, k1=10, k2=20)
    add_partial(1, 2, 3, k3=20)
    """
    10
    1
    2
    3
    --------------------
    k1:10
    k2:20
    k3:20
    

    可以看出,partial 只是为了传入参数的方便,并且 会把参数放到函数真正传入的参数之前。比如一个函数都要传入固定的几个参数值,那么可以统一用 partial 包装一下,精简代码之用

    • len(s)

    返回对象的长度(元素个数)。实参可以是序列(如 string、bytes、tuple、list 或 range 等)或集合(如 dictionary、set 或 frozen set 等)

    • class list([iterable])

    • locals()

    在函数代码块但不是类代码块中调用 locals() 时将返回自由变量

    def runoob(arg):    # 两个局部变量:arg、z
    ...     z = 1
    ...     print (locals())
    ... 
    runoob(4)
    {'z': 1, 'arg': 4}
    

    在模块层级上 locals()globals()是同一个字典

    • map(function, iterable, ...)

    返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器

    numbers1 = [1, 2, 3] 
    numbers2 = [4, 5, 6] 
      
    result = map(lambda x, y: x + y, numbers1, numbers2) 
    print(list(result)) 
     >> [5、7、9]
    
    • max(iterable, *[, key, default])

    返回最大值,很简单

    • memoryview(obj)

    • min(iterable, *[, key, default])

    返回最小值 很简单

    • next(iterator[, default])

    很熟悉,通过调用迭代器的 _ next _ 返回下一个值,
    如果迭代器耗尽,则返回给定的 default,如果没有默认值则触发 StopIteration
    可以返回默认值,以前并不知道,哈哈哈

    • class object

    基类 它具有所有 Python 类实例的通用方法。这个函数不接受任何实参

    • oct(x)

    整数返回8 进制的,方法同hex

    • open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    如果该文件不能打开,则触发 OSError
    打开文件这个函数还是有点多的内容。
    一会仔细总结:
    文件模式 r w a x + b
    r 读
    w 写(不存在新建)
    a 追写 (w 是清空,append首字母记忆)

    • (w+ 或 r+ a+ 表示可读可写,因为不存在 rw 或 wr,用 + 代替)
      b 二进制操作内容 (默认为t 文本格式,可省略不写)
      没有rw 的用法
      其余知识 ,以后再增加
    • ord(c)

    chr() 逆函数,把字符转化为他的unicode 码

    • pow(base, exp[, mod])

    返回 base 的 exp 次幂 等价于 base ** exp
    如果 mod 存在,则返回 base 的 exp 次幂对 mod 取余(比 pow(base, exp) % mod 更高效)

    • print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

    老朋友了
    将 objects 打印到 file 指定的文本流,以 sep 分隔并在末尾加上 end。 sep, end, file 和 flush 如果存在,它们必须以关键字参数的形式给出。
    非关键字参数都会被转换为字符串,就像是执行了 str() 如果没有给出 objects,则 print() 将只写入 end
    file默认使用 sys.stdout 到控制台 也可是 文件对象 比如 f = open(xxx) 的f ,但是只能是 文本二进制数据,不能用 print() 而应该用 f.write()

    • class property(fget=None, fset=None, fdel=None, doc=None)

    一个典型的用法是定义一个托管属性 x:

    class C:
        def __init__(self):
            self._x = None
    
        def getx(self):
            return self._x
    
        def setx(self, value):
            self._x = value
    
        def delx(self):
            del self._x
    
        x = property(getx, setx, delx, "I'm the 'x' property.")
    

    上面的x 就是一个特殊属性,他的值是 通过上面三个函数控制的。
    如果 c 是 C 的实例,c.x 将调用getter,c.x = value 将调用setter, del c.x 将调用deleter
    用装饰器等效

    class C:
        def __init__(self):
            self._x = None
    
        @property
        def x(self):
            """I'm the 'x' property."""
            return self._x
    
        @x.setter
        def x(self, value):
            self._x = value
    
        @x.deleter
        def x(self):
            del self._x
    

    @property 装饰器会将 voltage() 方法转化为一个具有相同名称的只读属性的 "getter",并会生成setter deleter 这个两个函数 并将 voltage 的文档字符串设置为 "Get the current voltage."

    • range(stop)

    很熟悉

    • repr(object)

    • reversed(seq)

    返回一个反向的 iterator seq 必须是一个具有 __reversed__() 方法的对象或者是支持该序列协议(具有从 0 开始的整数类型参数的 __len__()方法和 __getitem__()方法)。

    • round(number[, ndigits])

    四舍五入 测试了一下,4.5 还是 4 4.51 就是5了
    对于一般的 Python 对象 number, round 将委托给 number.round

    image.png
    image.png
    • class set([iterable])

    返回一个新的 set 对象,可以选择带有从 iterable 获取的元素
    set 是一个不重复的集合

    image.png
    • setattr(object, name, value)

    setattr(x, 'foobar', 123) 等价于 x.foobar = 123

    • class slice(stop) / slice(start, stop[, step]) 多态方法

    创建切片对象
    正常切片都是 [index,stop,step] 现在可以 xx(slice(..)) 等价于 xx[...]
    主要是很多相同的切片,实现统一的切片定义,符合代码的规范

    >>>myslice = slice(5)    # 设置截取5个元素的切片
    >>> myslice
    slice(None, 5, None)
    >>> arr = range(10)
    >>> arr
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> arr[myslice]         # 截取 5 个元素
    [0, 1, 2, 3, 4]
    
    • sorted(iterable, *, key=None, reverse=False)

    key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower)。 默认值为 None (直接比较元素)。
    reverse 为一个布尔值。 如果设为 True,则每个列表元素将按反向顺序比较进行排序
    注意:字典默认按照key进行排序,返回key 列表,其他的都是对元素排序

    sorted([5, 2, 3, 1, 4])
    # [1, 2, 3, 4, 5]
    sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
    # [1, 2, 3, 4, 5]
    sorted  比较的是 相当于 for i in iter  对i  进行排序,最后返回一个排序好的 i 列表。  
    

    指定排序key(来自迭代的元素)

    student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
    ]
    sorted(student_tuples, key=lambda student: student[2])   # sort by age
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    
    • @staticmethod

    静态方法不会接收隐式的第一个参数。要声明一个静态方法,请使用此语法

    class C:
        @staticmethod
        def f(arg1, arg2, ...): ...
    

    静态方法的调用可以在类上进行 (例如 C.f()) 也可以在实例上进行 (例如 C().f())

    像所有装饰器一样,也可以像常规函数一样调用 staticmethod
    class C:
        builtin_open = staticmethod(open)
    
    • class str(object=b'', encoding='utf-8', errors='strict')

    文本化对象

    • sum(iterable, /, start=0)

    求和

    • super([type[, object-or-type]])

    这个是子类调用父类的方法,python2 是super(当前obj,self).xx
    Python3 是直接 super().xx

    class C(B):
        def method(self, arg):
            super().method(arg)    # This does the same thing as:
                                   # super(C, self).method(arg)  py2传的是 当前类,
    并且 按照mro 顺序查找 第一个有改方法名的父类的这个方法
    

    详细说明参见:
    https://docs.python.org/zh-cn/3/library/functions.html#super

    • tuple([iterable])

    • class type(name, bases, dict)

    通常与 object.__class__ 所返回的对象相同。
    一般用 isinstance 比较好 ,因为他会判断子类的情况

    • vars([object])

    返回模块、类、实例或任何其它具有 __dict__属性的对象的 __dict__ 属性

    • zip(*iterables)

    也很熟悉
    创建一个聚合了来自每个可迭代对象中的元素的迭代器。
    他的长度是最短的元素长度
    相当于:

    def zip(*iterables):
        # zip('ABCD', 'xy') --> Ax By
        sentinel = object()
        iterators = [iter(it) for it in iterables]
        while iterators:
            result = []
            for it in iterators:
                elem = next(it, sentinel)
                if elem is sentinel:
                    return
                result.append(elem)
            yield tuple(result)
    
    • import

    此函数会由 import 语句发起调用
    这个以后再说把

    相关文章

      网友评论

          本文标题:python 内置函数 必须搞定哦

          本文链接:https://www.haomeiwen.com/subject/zlregctx.html