返回顶部
首页 > 资讯 > 后端开发 > Python >总结分析Python的5个硬核函数
  • 200
分享到

总结分析Python的5个硬核函数

2024-04-02 19:04:59 200人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1. eval函数函数的作用:函数定义:参数说明:返回值:实例:输出结果:对输出结果的解释:2. exec函数函数的作用:函数定义:参数说明:返回值:eval()函数与exec(

对于想深入理解 python 的朋友,很有必要认真看看。喜欢本文点赞支持,欢迎收藏学习

1. eval函数

函数的作用:

计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。

函数定义:


eval(expression, globals=None, locals=None)

参数说明:

  • expression:必选参数,可以是字符串,也可以是一个任意的code对象实例(可以通过compile函数创建)。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。
  • 如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。

返回值:

  • 如果expression是一个code对象,且创建该code对象时,compile函数的mode参数是'exec',那么eval()函数的返回值是None;
  • 否则,如果expression是一个输出语句,如print(),则eval()返回结果为None;
  • 否则,expression表达式的结果就是eval()函数的返回值;

实例:


x = 10

def func():
    y = 20
    a = eval('x + y')
    print('a: ', a)
    b = eval('x + y', {'x': 1, 'y': 2})
    print('b: ', b)
    c = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    print('c: ', c)
    d = eval('print(x, y)')
    print('d: ', d)

func()

输出结果:

a: 30
b: 3
c: 4
10 20
d: None

对输出结果的解释:

  • 对于变量a,eval函数的globals和locals参数都被忽略了,因此变量x和变量y都取得的是eval函数被调用环境下的作用域中的变量值,即:x = 10, y = 20,a = x + y = 30
  • 对于变量b,eval函数只提供了globals参数而忽略了locals参数,因此locals会取globals参数的值,即:x = 1, y = 2,b = x + y = 3
  • 对于变量c,eval函数的globals参数和locals都被提供了,那么eval函数会先从全部作用域globals中找到变量x, 从局部作用域locals中找到变量y,即:x = 1, y = 3, c = x + y = 4
  • 对于变量d,因为print()函数不是一个计算表达式,没有计算结果,因此返回值为None

2. exec函数

函数的作用:

动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那么样只能计算一个表达式的值。

函数定义:


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

参数说明:

  • object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。
  • globals:可选参数,同eval函数
  • locals:可选参数,同eval函数

返回值:

exec函数的返回值永远为None.

需要说明的是在Python 2中exec不是函数,而是一个内置语句(statement),但是Python 2中有一个execfile()函数。可以理解为Python 3把exec这个statement和execfile()函数的功能够整合到一个新的exec()函数中去了:

eval()函数与exec()函数的区别:

  • eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
  • eval()函数可以有返回值,而exec()函数返回值永远为None。

实例1:

我们把实例1中的eval函数换成exec函数试试:


x = 10

def func():
    y = 20
    a = exec('x + y')
    print('a: ', a)
    b = exec('x + y', {'x': 1, 'y': 2})
    print('b: ', b)
    c = exec('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    print('c: ', c)
    d = exec('print(x, y)')
    print('d: ', d)

func()

输出结果:

a: None
b: None
c: None
10 20
d: None

因为我们说过了,exec函数的返回值永远为None。

实例2:


x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""
def func():
    y = 20
    exec(expr)
    exec(expr, {'x': 1, 'y': 2})
    exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    
func()

输出结果:

60
33
34

对输出结果的解释:

前两个输出跟上面解释的eval函数执行过程一样,不做过多解释。关于最后一个数字34,我们可以看出是:x = 1, y = 3是没有疑问的。关于z为什么还是30而不是4,这其实也很简单,我们只需要在理一下代码执行过程就可以了,其执行过程相当于:


x = 1
y = 2

def func():
    y = 3
    z = 4
    
    z = 30
    sum = x + y + z
    print(sum)

func()

3. globals()与locals()函数

函数定义及功能说明:

先来看下这两个函数的定义和文档描述


globals() 

描述: Return a dictionary representing the current global symbol table. This is always the dictionary of the current module (inside a function or method, this is the module where it is defined, not the module from which it is called).

翻译 返回一个表示当前全局标识符表的字典。这永远是当前模块的字典(在一个函数或方法内部,这是指定义该函数或方法的模块,而不是调用该函数或方法的模块)


locals()

描述: Update and return a dictionary representing the current local symbol table. Free variables are returned by locals() when it is called in function blocks, but not in class blocks.

Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.

翻译: 更新并返回一个表示当前局部标识符表的字典。自由变量在函数内部被调用时,会被locals()函数返回;自由变量在类累不被调用时,不会被locals()函数返回。

注意: locals()返回的字典的内容不应该被改变;如果一定要改变,不应该影响被解释器使用的局部变量和自由变量。

总结:

  • globals()函数以字典的形式返回的定义该函数的模块内的全局作用域下的所有标识符(变量、常量等)
  • locals()函数以字典的形式返回当前函数内的局域作用域下的所有标识符
  • 如果直接在模块中调用globals()和locals()函数,它们的返回值是相同的

实例1:


name = 'Tom'
age = 18

def func(x, y):
    sum = x + y
    _G = globals()
    _L = locals()
    print(id(_G), type(_G),  _G)
    print(id(_L), type(_L), _L)

func(10, 20)

输出结果:

2131520814344 <class 'dict'> {'__builtins__': <module 'builtins' (built-in)>, 'func': <function func at 0x000001F048C5E048>, '__doc__': None, '__file__': 'C:/Users/wader/PyCharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001F048BF4C50>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None}
2131524302408 <class 'dict'> {'y': 20, 'x': 10, '_G': {'__builtins__': <module 'builtins' (built-in)>, 'func': <function func at 0x000001F048C5E048>, '__doc__': None, '__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001F048BF4C50>, '__spec__': None, 'age': 18, '__name__': '__main__', 'name': 'Tom', '__package__': None, '__cached__': None}, 'sum': 30}

实例2:


name = 'Tom'
age = 18

G = globals()
L = locals()
print(id(G), type(G), G)
print(id(L), type(L), L)

输出结果:

2494347312392 <class 'dict'> {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000244C2E44C50>, 'name': 'Tom', '__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, 'L': {...}, '__package__': None, '__name__': '__main__', 'G': {...}, '__doc__': None, 'age': 18}
2494347312392 <class 'dict'> {'__file__': 'C:/Users/wader/PycharmProjects/LearnPython/day04/func5.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000244C2E44C50>, 'name': 'Tom', '__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, 'L': {...}, '__package__': None, '__name__': '__main__', 'G': {...}, '__doc__': None, 'age': 18}

上面打印出的G和L的内存地址是一样的,说明在模块级别locals()的返回值和globals()的返回值是相同的。

4. compile函数

函数的作用:

将source编译为code对象或AST对象。code对象能够通过exec()函数来执行或者通过eval()函数进行计算求值。

函数定义:


compile(source, filename, mode[, flags[, dont_inherit]])

参数说明:

  • source:字符串或AST(Abstract Syntax Trees)对象,表示需要进行编译的Python代码
  • filename:指定需要编译的代码文件名称,如果不是从文件读取代码则传递一些可辨认的值(通常是用'')
  • mode:用于标识必须当做那类代码来编译;如果source是由一个代码语句序列组成,则指定mode=‘exec';如果source是由单个表达式组成,则指定mode=‘eval';如果source是由一个单独的交互式语句组成,则指定mode=‘single'。
  • 另外两个可选参数暂不做介绍

实例:


s = """
for x in range(10):
    print(x, end='')
print()
"""
code_exec = compile(s, '<string>', 'exec')
code_eval = compile('10 + 20', '<string>', 'eval')
code_single = compile('name = input("Input Your Name: ")', '<string>', 'single')

a = exec(code_exec)
b = eval(code_eval)

c = exec(code_single)
d = eval(code_single)

print('a: ', a)
print('b: ', b)
print('c: ', c)
print('name: ', name)
print('d: ', d)
print('name; ', name)

输出结果:

0123456789
Input Your Name: Tom
Input Your Name: Jerry
a: None
b: 30
c: None
name: Jerry
d: None
name; Jerry

5. 这几个函数的关系

comiple()函数、globals()函数、locals()函数的返回结果可以当作eval()函数与exec()函数的参数使用。

另外,我们可以通过判断globals()函数的返回值中是否包含某个key来判断,某个全局变量是否已经存在(被定义)。

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

在这里插入图片描述

到此这篇关于总结分析Python的5个硬核函数的文章就介绍到这了,更多相关Python 函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 总结分析Python的5个硬核函数

本文链接: https://lsjlt.com/news/157742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 总结分析Python的5个硬核函数
    目录1. eval函数函数的作用:函数定义:参数说明:返回值:实例:输出结果:对输出结果的解释:2. exec函数函数的作用:函数定义:参数说明:返回值:eval()函数与exec(...
    99+
    2024-04-02
  • Python数据分析23种Pandas核心操作方法总结
    目录基本数据集操作基本数据处理DataFrame 操作Pandas 是一个 Python 软件库,它提供了大量能使我们快速便捷地处理数据的函数和方法。一般而言,Pandas 是使 P...
    99+
    2024-04-02
  • Python数据分析之堆叠数组函数示例总结
    目录numpy 堆叠数组ravel() 函数stack() 函数vstack()函数hstack()函数concatenate() 函数numpy 堆叠数组 在做图像和 nlp 的...
    99+
    2023-02-23
    Python堆叠数组函数 Python 数据分析
  • 浅析python中5个带key的内置函数
    目录1.max取最大值函数2.min取最小值函数3.filter过滤函数实例1实例24.map序列映射函数实例1实例25.sorted序列排序函数(1) cmp参数(2)key参数(...
    99+
    2024-04-02
  • oracle 分析函数总结--仅供参考
          --1.分析函数的语法 :函数名() over (分区 排序 滑动窗口/开窗)   ...
    99+
    2024-04-02
  • Python的内置函数总结
    这篇文章主要介绍“Python的内置函数总结”,在日常操作中,相信很多人在Python的内置函数总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python的内置函数总结”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • Oracle中的分析函数汇总
    目录一、概述1、分析函数和聚合函数的不同之处是什么?2、分析函数的形式3、OVER解析4、Oracle分析函数简单实例:二、分析函数:Rank, Dense_rank, row_nu...
    99+
    2024-04-02
  • Python数据分析之Matplotlib的常用操作总结
    目录使用准备1、简单的绘制图像2、视图面板的常用操作3、样式及各类常用修饰属性4、legend图例的使用5、添加文字等描述6、不同类型图像的绘制总结使用准备 使用matplotlib...
    99+
    2024-04-02
  • 5种Java中数组的拷贝方法总结分享
    目录1、for循环2、调用clone()方法3、Arrays类中的Arrays.copyOf()方法4、copyOfRange()方法5、System.arraycopy()方法1、...
    99+
    2024-04-02
  • Python 数据处理更容易的12个辅助函数总结
    目录Numpy 的 6 种高效函数argpartition()allclose()clip()extract()where()percentile()Pandas 数据统计...
    99+
    2024-04-02
  • 分析总结Python数据化运营KMeans聚类
    内容介绍 以 Python 使用 Keans 进行聚类分析的简单举例应用介绍聚类分析。 聚类分析 或 聚类 是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象(在某种意义上)...
    99+
    2024-04-02
  • Python数据分析 | 各种图表对比总结
    本期将带领大家一起对在数据可视化的过程中常用的一些图表进行下总结: 条形图 【适用场景】 适用场合是二维数据集(每个数据点包括两个值x和y),但只有一个维度需要比较,用于显示一段时间内的数据变化或显示各项之间的比较情况。 【优势】 条形图...
    99+
    2023-08-30
    数据分析 python 信息可视化
  • 总结Python函数参数的六种类型
    目录一、函数的单参数传递二、多参数传递三、关键字参数四、缺省参数五、不定长参数 - 元组六、不定长参数 - 字典前言: Python函数之所以很好用,还有一点就的能传递参数实现不同场...
    99+
    2024-04-02
  • python数据处理67个pandas函数总结看完就用
    目录导⼊数据导出数据查看数据数据选取数据处理数据分组、排序、透视数据合并不管是业务数据分析 ,还是数据建模。数据处理都是及其重要的一个步骤,它对于最终的结果来说,至关重...
    99+
    2024-04-02
  • 总结12个MySQL慢查询的原因分析
    目录1. SQL 没加索引2. SQL 索引不生效2.1 隐式的类型转换,索引失效2.2 查询条件包含 or,可能导致索引失效2.3. like 通配符可能导致索引失效2.5 在索引...
    99+
    2022-11-13
    MySQL慢查询原因分析 MySQL慢查询
  • python偏函数的实例用法总结
    说明 当函数的参数太多,需要简化时,使用functools.partial可以创建一个新的函数。 2、这个新的函数可以固定原始函数的部分参数,从而更容易调用。 作用是固定一个函数的某些参数(即设置默认值),返回一个新...
    99+
    2022-06-02
    python 偏函数
  • python enumerate函数的使用方法总结
    enumerate函数用于遍历序列中的元素以及它们的下标。 enumerate函数说明: enumerate()是python的内置函数 enumerate在字典上是枚举、列举的意思 函数原型:enu...
    99+
    2022-06-04
    使用方法 函数 python
  • Python中的魔法函数总结整理
    基本魔法方法 功能 __new__(cls[, ...]) 1. new 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法 3. new 决定是否要使用该 i...
    99+
    2023-01-31
    函数 魔法 Python
  • 5个可以加速开发的VueUse函数库(小结)
    目录VueUse 有哪些实用程序?将 VueUse 安装到你的 Vue 项目中1、useRefHistory 跟踪响应式数据的更改2、onClickOutside 关闭模态3、use...
    99+
    2024-04-02
  • 总结分析python数据化运营关联规则
    目录内容介绍一般应用场景关联规则实现关联规则应用举例内容介绍 以 Python 使用 关联规则 简单举例应用关联规则分析。 关联规则 也被称为购物篮分析,用于分析数据集各项之间的关联...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作