我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python内置函数有哪些及怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python内置函数有哪些及怎么用

这篇文章主要讲解了“Python内置函数有哪些及怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python内置函数有哪些及怎么用”吧!

1.abs

abs 的功能是取一个整数的绝对值,或者取一个复数的模。

static PyObject *builtin_abs(PyObject *module, PyObject *x){    return PyNumber_Absolute(x);}

该函数调用了 PyNumber_Absolute。

//Objects/abstract.cPyObject *PyNumber_Absolute(PyObject *o){    PyNumberMethods *m;    if (o == NULL) {        return null_error();    }    //通过类型对象获取操作簇 PyNumberMethods    m = o->ob_type->tp_as_number;    //调用 nb_absolute     if (m && m->nb_absolute)        return m->nb_absolute(o);    return type_error("bad operand type for abs(): '%.200s'", o);}

我们以整型为例,它的 nb_absoulte 指向 long_absolute。

//Objects/longobject.cstatic PyObject *long_abs(PyLongObject *v){    if (Py_SIZE(v) < 0)        //如果 v 小于 0,那么取相反数        return long_neg(v);    else        //否则返回本身        return long_long((PyObject *)v);}

由于 Python3 的整数是以数组的方式存储的,所以不会直接取相反数,还要做一些额外的处理,但从数学上直接理解为取相反数即可。

2.all

接收一个可迭代对象,如果里面的元素全部为真,则返回 True;只要有一个不为真,则返回 False。

static PyObject *builtin_all(PyObject *module, PyObject *iterable){    PyObject *it, *item;    PyObject *(*iternext)(PyObject *);    int cmp;    //获取可迭代对象的迭代器    it = PyObject_GetIter(iterable);    if (it == NULL)        return NULL;    //拿到内部的 __next__ 方法    iternext = *Py_TYPE(it)->tp_iternext;    for (;;) {        //迭代元素        item = iternext(it);        //返回 NULL,说明出异常了        //一种是迭代完毕抛出的 StopIteration        //另一种是迭代过程中出现的异常        if (item == NULL)            break;        //判断 item 的布尔值是否为真        //cmp > 0 表示为真        //cmp == 0表示为假        //cmp < 0 表示解释器调用出错(极少发生)        cmp = PyObject_IsTrue(item);        Py_DECREF(item);        if (cmp < 0) {            Py_DECREF(it);            return NULL;        }        //只要有一个元素为假,就返回 False        if (cmp == 0) {            Py_DECREF(it);            Py_RETURN_FALSE;        }    }    Py_DECREF(it);    //PyErr_Occurred() 为真表示出现异常了    if (PyErr_Occurred()) {        //判断异常是不是 StopIteration        if (PyErr_ExceptionMatches(PyExc_StopIteration))            //如果是,那么表示迭代正常结束            //PyErr_Clear() 负责将异常清空            PyErr_Clear();        else            return NULL;    }    //走到这,说明所有的元素全部为真    //返回 True,等价于 return Py_True    Py_RETURN_TRUE;}

因此 all 就是一层 for 循环,但它是 C 的循环,所以比我们写的 Python 代码快。

3.any

接收一个可迭代对象,只要里面有一个元素为真,则返回 True;如果全为假,则返回 False。

static PyObject *builtin_any(PyObject *module, PyObject *iterable){        //源码和 builtin_all 是类似的    PyObject *it, *item;    PyObject *(*iternext)(PyObject *);    int cmp;    //获取可迭代对象的迭代器    it = PyObject_GetIter(iterable);    if (it == NULL)        return NULL;    //拿到内部的 __next__ 方法    iternext = *Py_TYPE(it)->tp_iternext;    for (;;) {        //迭代元素        item = iternext(it);        if (item == NULL)            break;        cmp = PyObject_IsTrue(item);        Py_DECREF(item);        if (cmp < 0) {            Py_DECREF(it);            return NULL;        }        //只要有一个为真,则返回 True        if (cmp > 0) {            Py_DECREF(it);            Py_RETURN_TRUE;        }    }    Py_DECREF(it);    if (PyErr_Occurred()) {        if (PyErr_ExceptionMatches(PyExc_StopIteration))            PyErr_Clear();        else            return NULL;    }    //全部为假,则返回 False    Py_RETURN_FALSE;}

4.callable

判断一个对象是否可调用。

static PyObject *builtin_callable(PyObject *module, PyObject *obj){    return PyBool_FromLong((long)PyCallable_Check(obj));}PyBool_FromLong 是将一个整数转成布尔值,所以就看 PyCallable_Check 是返回 0,还是返回非 0。intPyCallable_Check(PyObject *x){    if (x == NULL)        return 0;    return x->ob_type->tp_call != NULL;}

逻辑非常简单,一个对象是否可调用,就看它的类型对象有没有实现 __call__。

5.dir

如果不接收任何对象,返回当前的 local 空间;否则返回某个对象的所有属性的名称。

static PyObject *builtin_dir(PyObject *self, PyObject *args){    PyObject *arg = NULL;    //要么不接收参数,要么接收一个参数    //如果没有接收参数,那么 arg 就是 NULL,否则就是我们传递的参数    if (!PyArg_UnpackTuple(args, "dir", 0, 1, &arg))        return NULL;    return PyObject_Dir(arg);}

该函数调用了 PyObject_Dir。

//Objects/object.cPyObject *PyObject_Dir(PyObject *obj){       //当 obj 为 NULL,说明我们没有传参,那么返回 local 空间    //否则返回对象的所有属性的名称    return (obj == NULL) ? _dir_locals() : _dir_object(obj);}

先来看看 _dir_locals 函数。

//Objects/object.cstatic PyObject *_dir_locals(void){    PyObject *names;    PyObject *locals;    //获取当前的 local 空间    locals = PyEval_GetLocals();    if (locals == NULL)        return NULL;    //拿到所有的 key,注意:PyMapping_Keys 返回的是列表    names = PyMapping_Keys(locals);    if (!names)        return NULL;    if (!PyList_Check(names)) {        PyErr_Format(PyExc_TypeError,            "dir(): expected keys() of locals to be a list, "            "not '%.200s'", Py_TYPE(names)->tp_name);        Py_DECREF(names);        return NULL;    }    //排序    if (PyList_Sort(names)) {        Py_DECREF(names);        return NULL;    }    //返回    return names;}

还是比较简单的,然后是 _dir_object,它的代码比较多,这里就不看了。但是逻辑很简单,就是调用对象的 dir 方法,将得到的列表排序后返回。

6.id

查看对象的内存地址,我们知道 Python 虽然一切皆对象,但是我们拿到的都是指向对象的指针。比如 id(name) 是查看变量 name 指向对象的地址,说白了不就是 name 本身吗?所以直接将指针转成整数之后返回即可,

static PyObject *builtin_id(PyModuleDef *self, PyObject *v){       //将 v 转成整数,返回即可    PyObject *id = PyLong_FromVoidPtr(v);    if (id && PySys_Audit("builtins.id", "O", id) < 0) {        Py_DECREF(id);        return NULL;    }    return id;}

7.locals 和 globals

这两者是查看当前的 local 空间和 global 空间,显然直接通过栈帧的 f_locals 和 f_globals 字段即可获取。

static PyObject *builtin_locals_impl(PyObject *module){    PyObject *d;    //在内部会通过线程状态对象拿到栈帧    //再通过栈帧的 f_locals 字段拿到 local 空间    d = PyEval_GetLocals();    Py_XINCREF(d);    return d;}static PyObject *builtin_globals_impl(PyObject *module){    PyObject *d;    //和 PyEval_GetLocals 类似    d = PyEval_GetGlobals();    Py_XINCREF(d);    return d;}

8.hash

获取对象的哈希值。

static PyObject *builtin_hash(PyObject *module, PyObject *obj){    Py_hash_t x;    //在内部会调用 obj -> ob_type -> tp_hash(obj)    x = PyObject_Hash(obj);    if (x == -1)        return NULL;    return PyLong_FromSsize_t(x);}

9.sum

接收一个可迭代对象,计算它们的和。但是这里面有一个需要注意的地方。

print(sum([1, 2, 3]))  # 6try:    print(sum(["1", "2", "3"]))except TypeError as e:    print(e)  # unsupported operand type(s) for +: 'int' and 'str'

咦,字符串明明也支持加法呀,为啥不行呢?其实 sum 还可以接收第二个参数,我们不传的话就是 0。

也就是说 sum([1, 2, 3]) 其实是 0 + 1 + 2 + 3;那么同理,sum(["a", "b", "c"]) 其实是 0 + "a" + "b" + "c";所以上面的报错信息是不支持类型为 int 和 str 的实例进行相加。

try:    print(sum(["1", "2", "3"], ""))except TypeError as e:    print(e)  # sum() can't sum strings [use ''.join(seq) instead]# 我们看到还是报错了,只能说明理论上是可以的# 但 Python 建议我们使用 join# 我们用列表举例吧try:    print(sum([[1], [2], [3]]))except TypeError as e:    print(e)  # unsupported operand type(s) for +: 'int' and 'list'# 告诉我们 int 的实例和 list 的实例不可以相加# 将第二个参数换成空列表print(sum([[1], [2], [3]], []))  # [1, 2, 3]# 如果不是空列表呢?print(    sum([[1], [2], [3]], ["古明地觉"]))  # ['古明地觉', 1, 2, 3]

所以 sum 是将第二个参数和第一个参数(可迭代对象)里面的元素依次相加,然后看一下底层实现。

static PyObject *builtin_sum_impl(PyObject *module, PyObject *iterable, PyObject *start){       //result 就是返回值,初始等于第二个参数    //如果可迭代对象为空,那么返回的就是第二个参数    //比如 sum([], 123) 得到的就是 123    PyObject *result = start;    PyObject *temp, *item, *iter;    //获取可迭代对象的类型对象    iter = PyObject_GetIter(iterable);    if (iter == NULL)        return NULL;        //如果 result 为 NULL,说明我们没有传递第二个参数    if (result == NULL) {        //那么 result 赋值为 0        result = PyLong_FromLong(0);        if (result == NULL) {            Py_DECREF(iter);            return NULL;        }    } else {        //否则的话,检测是不是 str、bytes、bytearray 类型        //如果是的话,依旧报错,并提示使用 join 方法        if (PyUnicode_Check(result)) {            PyErr_SetString(PyExc_TypeError,                "sum() can't sum strings [use ''.join(seq) instead]");            Py_DECREF(iter);            return NULL;        }        if (PyBytes_Check(result)) {            PyErr_SetString(PyExc_TypeError,                "sum() can't sum bytes [use b''.join(seq) instead]");            Py_DECREF(iter);            return NULL;        }        if (PyByteArray_Check(result)) {            PyErr_SetString(PyExc_TypeError,                "sum() can't sum bytearray [use b''.join(seq) instead]");            Py_DECREF(iter);            return NULL;        }        Py_INCREF(result);    }#ifndef SLOW_SUM    //这里是快分支    //假设所有元素都是整数    if (PyLong_CheckExact(result)) {        //将所有整数都迭代出来,依次相加        //...    }    if (PyFloat_CheckExact(result)) {        //将所有浮点数都迭代出来,依次相加        //...    }#endif        //如果不全是整数或浮点数,执行通用逻辑    for(;;) {        //迭代元素        item = PyIter_Next(iter);        if (item == NULL) {                        if (PyErr_Occurred()) {                Py_DECREF(result);                result = NULL;            }            break;        }        //和 result 依次相加        temp = PyNumber_Add(result, item);        Py_DECREF(result);        Py_DECREF(item);        result = temp;        if (result == NULL)            break;    }    Py_DECREF(iter);    //返回    return result;}

一个小小的 sum,代码量还真不少呢,我们还省略了一部分。

10.getattr、setattr、delattr

这几个应该已经很熟悉了,先来看看 getattr,它是获取对象的某个属性,并且还可以指定默认值。

static PyObject *builtin_getattr(PyObject *self, PyObject *const *args, Py_ssize_t nargs){    PyObject *v, *name, *result;    //参数个数必须是 2 或 3    //对象、属性名、可选的默认值    if (!_PyArg_CheckPositional("getattr", nargs, 2, 3))        return NULL;    //获取对象和属性名    v = args[0];    name = args[1];    //name必须是字符串    if (!PyUnicode_Check(name)) {        PyErr_SetString(PyExc_TypeError,                        "getattr(): attribute name must be string");        return NULL;    }    //调用对象的 __getattr__,找不到返回默认值    if (nargs > 2) {        if (_PyObject_LookupAttr(v, name, &result) == 0) {            PyObject *dflt = args[2];            Py_INCREF(dflt);            return dflt;        }    }    else {        result = PyObject_GetAttr(v, name);    }    return result;}

同理 setattr 是调用对象的 __setattr__,delattr 是调用对象的 __delattr__。

感谢各位的阅读,以上就是“Python内置函数有哪些及怎么用”的内容了,经过本文的学习后,相信大家对Python内置函数有哪些及怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python内置函数有哪些及怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python内置函数有哪些及怎么用

这篇文章主要讲解了“Python内置函数有哪些及怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python内置函数有哪些及怎么用”吧!1.absabs 的功能是取一个整数的绝对值,或者
2023-06-30

python内置函数有哪些

Python内置函数有很多,常用的包括:print():打印输出len():返回对象的长度type():返回对象的类型int()、float()、str()、list()、dict()、tuple()、set():类型转换函数inp
python内置函数有哪些
2024-03-01

有哪些Python内置函数

这篇文章主要讲解了“有哪些Python内置函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Python内置函数”吧!和数字相关1. 数据类型 bool : 布尔型(True,Fals
2023-06-16

Python的内置函数有哪些

本篇内容介绍了“Python的内置函数有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!内置函数就是python给你提供的, 拿来直接用的
2023-06-16

Python内置函数都有哪些

本篇文章为大家展示了Python内置函数都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python 内置函数最全汇总1 abs()绝对值或复数的模In [1]: abs(-6)Out[1]:
2023-06-02

有哪些好用的Python内置函数

本篇内容介绍了“有哪些好用的Python内置函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1️⃣set()当您需要对列表进行重复数据删除
2023-06-16

好用的Python内置函数有哪些

本篇内容介绍了“好用的Python内置函数有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lambda 函数Lambda函数用于创建匿名
2023-06-30

常用的Python内置函数有哪些

这篇文章主要为大家展示了“常用的Python内置函数有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“常用的Python内置函数有哪些”这篇文章吧。内置函数简介Python 解释器自带的函数叫
2023-06-15

Python里面有哪些内置函数

这篇文章主要介绍“Python里面有哪些内置函数”,在日常操作中,相信很多人在Python里面有哪些内置函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python里面有哪些内置函数”的疑惑有所帮助!接下来
2023-06-16

Python中好用的内置函数有哪些

小编给大家分享一下Python中好用的内置函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Python中冷门但非常好用的内置函数 Counter举例 实战
2023-06-22

Python中常用的内置函数有哪些

小编给大家分享一下Python中常用的内置函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!complex()返回一个形如 a+bj 的复数,传入参数分为三
2023-06-22

python中有哪些列表内置函数

这期内容当中小编将会给大家带来有关python中有哪些列表内置函数,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.
2023-06-14

PHP 函数的内置函数有哪些?

php 提供了一系列内置函数,用于处理字符串、日期、错误和数学计算。这些函数包括(但不限于):字符串处理(strlen、strtoupper、strpos、substr)日期处理(date、strtotime、strftime)错误处理(t
PHP 函数的内置函数有哪些?
2024-04-10

Python常见内置高阶函数有哪些

这篇文章给大家分享的是有关Python常见内置高阶函数有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.什么是高阶函数?  高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数
2023-06-21

python内部函数有哪些

Python内置函数很多,以下是一些常用的内置函数:1. print():用于输出内容到控制台。2. len():用于获取对象的长度或元素的个数。3. input():用于从用户输入获取内容。4. type():用于获取对象的类型。5. i
2023-08-09

python字符串内置函数的作用有哪些

Python字符串内置函数的作用有以下几种:1. len():返回字符串的长度。2. str():将其他类型的数据转换为字符串。3. upper():将字符串中的小写字母转换为大写字母。4. lower():将字符串中的大写字母转换为小写字
2023-09-16

常用的go内置函数有哪些

常用的 Go 内置函数有以下几个:1. `make()`:用于创建切片、映射和通道。2. `new()`:用于分配内存,并返回指向该内存地址的指针。3. `len()`:用于获取切片、映射和字符串的长度。4. `cap()`:用于获取切片的
2023-08-09

Vue内置指令有哪些及怎么使用

这篇文章主要介绍“Vue内置指令有哪些及怎么使用”,在日常操作中,相信很多人在Vue内置指令有哪些及怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue内置指令有哪些及怎么使用”的疑惑有所帮助!接下来
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录