Python Built-in Functions

By | 7月 16, 2023

1. 运算类

abs(X)

返回一个数的绝对值

min, max(iterable, key=None)

返回iterable里的最大/小值,key是个函数指定根据元素的什么属性查找。

max(persons, key=lambda p: p.age)
min(persons, key=lambda p: p.age)

pow(x, y[, mod])

x的y次方,如果mode存在,则是x的y次方再取余,比pow(x, y) % mod效率高。

pow(2, 3) == 2**3
pow(2, 3, 5) == 2**3 % 5

round(number, ndigits)

四舍五入到小数点后ndigits位,如果ndigits被省略,返回整数。

round(1.3478, 2)  # 1.35

sum(iterable, start=0)

对iterable元素求和,再加上start。

sum([4, 2, 3], 11)   #20

divmod(a, b)

返回a除以b的(商,余数)。

divmod(37, 5)    # (7, 2)

2. 类型转换

int(x)

对于输入的数字或者是字符串x,返回x的整数形式,如果x数值为空时,则返回0。

float(x)

对于输入的数字或者是字符串x,返回x的浮点数形式,如果x数值为空时,则返回0.0。

complex([real[, imag]])

将字符串或数字转换为复数。

complex(2, 3)    # (2+3j)
complex('2+3j')    # (2+3j)

bool(x)

将x转换为True或False

str(x)

将x转换为字符串

bytearray(x, encoding=’utf-8’)

将x转换为可变数组bytearray。bytearray无字面值语法。

bytearray('alex', encoding='utf-8')  # bytearray(b'alex')

bytes(x, encoding=’utf-8’)

将x转换为不可变数组bytes。字面值语法:引号前加b.

bytes('alex', encoding='utf-8')  # b'alex'

字符串和bytes转换。

name_bytes = 'alex'.encode('utf-8')
name_str = name_bytes.decode('utf-8')

memoryview(obj)

创建一个引用 obj 的 memoryview。 obj 必须支持缓冲区协议。 支持缓冲区协议的内置对象包括 bytes 和 bytearray。访问bytes的memoryview,元素都是数组1-255。

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'

3. 进制转换

bin(int)

将一个整数转变为一个前缀为“0b”的二进制字符串。

bin(3)  => '0b11'

oct(int)

将一个整数转换为一个前缀为“0o”的八进制字符串。

oct(12) => '0o14'

hex(int)

将一个整数转换为一个前缀为“0x”的十六进制字符串。

hex(35) => '0x23'

ord(char) / chr(x)

char是单个字符,返回对应的Unicode码。chr是逆函数,数字转换成字符。

ord('a') => 97
chr(99) => 'c'

4. 数组操作

list([iterable])

构造器将构造一个列表,其中的项与 iterable 中的项具有相同的的值与顺序。 iterable 可以是序列、支持迭代的容器或其它可迭代对象。 如果 iterable 已经是一个列表,将创建并返回其副本,类似于 iterable[:]。 例如,list(‘abc’) 返回 [‘a’, ‘b’, ‘c’] 而 list( (1, 2, 3) ) 返回 [1, 2, 3]。 如果没有给出参数,构造器将创建一个空列表 []。

dict(mapping) / dict(**kwargs)

类方法构造dict。

dict(name="alex", age=18)
dict([('name', 'alex'), ('age', 18)])

set([iterable]) / frozenset([iterable])

元素必须为hashable。

set([ 1, 2, 1, 2, 3, 2, 1]) => {1, 2, 3}

tuple([iterable])

类方法构造tuple。

enumerate(iterable, start=0)

返回一个迭代器,元素是 (index, element)。

enumerate(['Spring', 'Summer', 'Fall', 'Winter']) =>
(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')

range(stop) / range(start, stop[, step])

返回一个不可变的整数序列,通常用在for循环里。

list(range(5))   => [0, 1, 2, 3, 4]
range(2, 11, 2)) => [2, 4, 6, 8, 10]

iter(object[, sentinel])

返回一个iterator对象,调用next()方法,获得下一个数据。

没有sentinel,第一个参数是个iterable,每次next()返回iterable里的下个元素。没数据了raise StopIterator。

numIterator = iter([1, 2, 3, 4, 5])
for i in range(10):
    print(next(numIterator))

有sentinel,第一个参数是callable的object,每次next()调用一次callable,如果返回和sentinel相等,则raise StopIteration。

class Person(object):
    def __init__(self):
        self._start = 0
    
    def __call__(self):
        self._start += 1
        return self._start

objIterator = iter(Person(), 5)
for i in range(10):
    print(next(objIterator)) # raise StopIteration on 5

slice(stop) / slice(start, stop[, step])

返回slice对象,代表序列的索引,即可以用有名索引来截取序列。

str = "Alex ZHANG"

firt_name_index = slice(4)
str[firt_name_index] => 'Alex'

family_name_index = slice(5, len(str))
str[family_name_index] => 'ZHANG'

object()

在Python中,object类是所有类的基类,object函数不接受任何参数,返回的是一个没有任何特征的对象。

super()

用来调用父类的方法,最常用的父类的__init__,如果有多个父类,则从第一个父类找。找不到再从父类的父类中找。

Method resolution order

5. 排序操作

sorted(iterable, key=None, reverse=False)

对元素排序,key是函数指定根据什么排序,reverse表示逆排序,返回新的list。

names = ['john', 'alex', 'trump', 'biden']
sorted(names) => ['alex', 'biden', 'john', 'trump']
sorted(names, key=lambda name: name[-1]) => ['john', 'biden', 'trump', 'alex']

reversed(seq)

对于输入的序列seq进行反转,生成新的可迭代对象并返回。

6. 序列操作

sequences (序列) 是python的基本数据类型,包含str, list和tuple。

all(iterable)

返回True如果所有元素为真,会有短路。

any(iterable)

返回True如果有元素为True,会有短路。

map(func, iterable)

对iterable的每个元素都apply func,返回新map(注意不是list)。

nums = [1, 2, 3]
new = map(lambda x: x*2, nums)

filter(func, iterable)

对每个元素,执行func,返回True的留下,返回的是filter(不是list)。

nums = [1, 2, 3, 4]
new = filter(lambda x: x > 1, nums)

next(iterator[, default])

返回迭代器里的下个元素,没有则raise StopIteration异常。

zip(*iterables)

根据多个输入,返回一个元祖的迭代器,以最短的那个结束。

a = [1, 2, 3, 4, 5, 6]
b = ['a', 'b', 'c']
for val in zip(a, b):
    print(val)
----------------------
(1, 'a')
(2, 'b')
(3, 'c')

itertools.zip_longest(*iter, fillvalue=None)

同zip,但是以最长的结束。

import itertools
a = [1, 2, 3, 4, 5, 6]
b = ['a', 'b', 'c']
for val in itertools.zip_longest(a, b, fillvalue='w'):
    print(val)
--------------------------
(1, 'a')
......
(5, 'w')
(6, 'w')

7. 对象元素操作

help(object)

通过help函数可以帮助用户来查询不同对象的信息,包括内置方法、属性等信息。主要用于interactive console。

id(object)

返回object对象的标识值,这个标识值是一个整数,且在对象的生命周期中保持唯一。对于CPython来说,返回的是对象内存地址。

hash(object)

如果object对象有对应的哈希值则返回对应的哈希值。

type(object)

返回对象的类型,等同于object.__class__。

a = Person('alex')
print(type(a))  # <class '__main__.Person'>
print(a.__class__)  # <class '__main__.Person'>

dir([object])

主要用在交互式,没有参数,返回local scope里的所有名字;有object参数,返回object的所有属性。

注意:在__init__里给self添加的属性,dir会显示;其它方法里添加的,不会显示。

len(object)

返回object对象的长度或者是所包含的元素个数。

repr(object)

repr函数返回包含一个对象的可打印表示形式的字符串。repr 是representation的简写,通过函数__repr__(self),可以控制repr返回值。

ascii(object)

把repr(object)的结果转义成ascii字符串,non-ASCII使用\x, \u or \U来转义。

format(value ,format_spec)

format函数将 value 转换为 由format_spec参数控制的“格式化”表示形式,多用在字符串的格式化处理中。

vars(object)

函数返回模块、类、实例等具有 __dict__属性的对象的 __dict__属性。

__dict__方便可以查看类的属性,dir()的输出太多了。

8. 属性操作

isinstance(object, classinfo)

函数用来判断object对象是否属于classinfo的类型,如果是则返回True,否则返回False。

issubclass(class, classinfo)

如果class是classinfo类的子类,则函数返回True,否则返回False。

hasattr(object, name)

判断object是否有叫name的属性(不包括父类的),方法也叫属性。相当于判断object.__dict__是否包含name。

getattr(object, name)

返回object的叫name的属性,如果是函数可以再次调用。类似Java的反射,但更简单。

getattr(obj, 'add')(1, 2) => 3

setattr(object, name, value)

动态给object添加属性。

def add(x, y):
    return x + y
obj.add = add
print(getattr(obj, 'add')(1, 2))

delattr(object, name)

删除object中叫name的属性。

__import__(module)

动态导入module,然后通过反射来调用。这里的反射指:getattr(object, name)。

welcome_module.py

class Welcome(object):
    @staticmethod
    def welcome(str):
        print("Hi ! % s Welcome to GfG" % str)

动态导入welcome_module,调用welcome函数。
class Dimport:
    def __init__(self, module_name, class_name):
        module = __import__(module_name)
        my_class = getattr(module, class_name)
        my_class.welcome('User_1')
obj = Dimport("welcome_module", "Welcome")

import如果写在局部作用域内,那这个import的module只能在局部内能访问。

def hi():
    import os
    print(os.path.join('a', 'b'))

hi()
print(os.path.join('c', 'd'))   // compile failure

callable(object)

如果对象 object 是可调用的就返回 True,否则返回 False。

9. 变量操作

globals()

返回作用域内的全局变量和其数值所构成的字典,既是当前module的字典。对于函数而言,返回的是定义函数的module的字典,而不是调用函数的module。

locals()

与globals函数对应的,locals函数返回的是当前作用域下局部变量和其数值所构成的字典。

10. 人机交互

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

可以print多个,以sep(默认空格)分隔,文件末尾加‘\n’,默认print到stdout。

flush表示是否立即输出,对于有缓存的(由file决定),它会先缓存再一次性输出。如果flush=True,则每次print都立即输出。

input([prompt])

返回用户输入的字符串。

name = input("What's your name? ")
print(name)
----------------------------------
What's your name? Alex
Alex

open(file, mode=’r’)

打开 file 并返回对应的 file object对象,mode对应的是向file文件进行读或者是写等操作。如果该文件不能被打开,那么程序会引发 OSError报错。

11. 编译操作

compile(source, filename, mode, flag, dont_inherit, optimize)

将源码编译成代码对象(code object),可以被exec执行。参数:

  • source Required. The source to compile, can be a String, a Bytes object, or an AST object
  • filename Required. The name of the file that the source comes from. If the source does not come from a file, you can write whatever you like
  • mode Required. Legal values:
    • eval – if the source is a single expression
    • exec – if the source is a block of statements
    • single – if the source is a single interactive statement
  • flags Optional. How to compile the source. Default 0
  • dont-inherit Optional. How to compile the source. Default False
  • optimize Optional. Defines the optimization level of the compiler. Default -1
codeInString = 'a = 8\nb=7\nsum=a+b\nprint("sum =",sum)'
codeObject = compile(codeInString, 'sumstring', 'exec')
exec(codeObject)    # 15

exec(object)

动态执行代码,如果object是code object则直接执行;如果是字符串,当成python语句执行。没有返回值

a = [1, 2, 3]
exec("for i in a: print('value is', i)")
----------------------------------------
value is 1
value is 2
value is 3

eval(expression)

eval函数会将字符串expression当成有效的表达式来求值并返回计算结果。eval函数只能单个运算表达式,而不能是复杂的代码逻辑或者是赋值运算。跟JavaScript里的eval一样。

a = [1, 2, 3]
b = eval('[i*2 for i in a]')
print(b)
----------------------------
[2, 4, 6]

12. 函数装饰器

@classmethod

classmethod的作用是将一个方法封装成类方法,可以在不创建类对象的前提下调用该装饰器修似的方法。

@staticmethod

staticmethod方法是将类中的方法转换为静态的方法,静态方法不会接受隐式的参数,同样也可以在不创建类对象的前提下调用静态方法。

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

作为装饰器,property可以将类方法转换为类属性来使用。

直接调用property

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

    # be after all methods, otherwise ‘getx/setx/selx’ cannot be found
    x = property(getx, setx, delx, "I'm the 'x' property.")

@property

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