python 内置函数 compile()

本文详细介绍了Python内置函数compile()的使用方法及其参数含义,包括如何编译字符串源码生成字节码或抽象语法树,并通过实例展示了不同模式下的应用。

python 内置函数 compile()

这个函数用来编译一段字符串的源码,结果可以生成字节码或者AST(抽像语法树),字节码可以使用函数exec()来执行,而AST可以使用eval()来继续编译。

参数source是一串字符串的源码,或者是AST对象数组。

参数filename是读取字符串的文件对象,如果不是从文件里读取源码来编译,那么这里可以放一些用来标识这些代码的字符串。

参数mode是用来指明那种表示的源码类型;如果是exec类型,表示这是一个序列语句,可以进行运行;如果是eval类型,表示这是一个单一的表达式语句,可以用来计算相应的值出来;如果是single类型,表示这是一个单一语句,采用交互模式执行,在这种情况下,如果是一个表达式,一般会输出结果,而不是打印为None输出。

可选参数flags和dont_inherit是用来控制编译源码时的标志,可以查看PEP236文档来了解这些参数,以及相关编译的说明。如果两者使用缺省参数(也即两者都是零值),在调用本函数编译时,主要使用代码中指明的编译特征来对待;如果flags参数设置有值,而dont_inherit没有设置(即是零值),那么编译代码时,不仅源码的编译特征起作用,而且flags指明的特征也起作用,相当两者的并集;如果参数dont_inherit设置有值(即是非零值),编译语句时只有参数flags指明的编译特征值起作用,即是不使用源码里指明的特征。

编译特征是按位图的方式设置到参数里,可以查看__future__。

可选参数optimize是用来指明编译器使用优化的等级;缺省值是-1,表示使用命令行参数-O中获取的优化等级为准;如果设置值为0(即是不用优化,__debug__是设置true),是没有优化;如果设置值为1,assert语句被删除,__debug__设置为false;如果设置值为2,除了设置值为1的功能之外,还会把代码里文档说明也删除掉,达到最佳优化结果。

本函数编译代码时,如果语法出错会返回SyntaxError;如果代码包含一些空字节,则返回类型错误TypeError。

注意事项:当采用single或eval类型编译时,如果有多行代码,每行代码后面至少有一个换行符,否则在code模块编译时就会提示编译的源码不完整错误。在Python 3.2版本之后,允许输入Windows或Mac的换行符;当采用exec模式时,不需要在每个行后面输入换行符;在这个版本之后增加了优化参数。

 1 a = '''name = input("请输入:")'''
 2 
 3 t = compile(a,'','single') #编译为交互式模式 ' ' filename,不从文件读取,也得写个空字符串
 4 exec(t)
 5 print(name) #name会报警,不用管
 6  #compile()  
 7 str = "for i in range(0,10): print(i)"  
 8 c = compile(str,'','exec')   # 编译为字节代码对象  
 9 exec(c)                          # 执行  
10 输出:
11 0
12 1
13 2
14 3
15 4
16 5
17 6
18 7
19 8
20 9
21    
22 str2 = "3*x + 4*y"  
23 c2 = compile(str2, '', 'eval')  # 编译为表达式 

 

• source -- 字符串或者AST(Abstract Syntax Trees)对象。。
• filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
• mode -- 指定编译代码的种类。可以指定为 exec, eval, single。
• flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。
• flags和dont_inherit是用来控制编译源码时的标志

 

 

转载于:https://www.cnblogs.com/zhzhlong/p/7822358.html

<think>我们正在回答用户关于Python内置函数的用途和使用方法的问题。根据系统指令,我们需要: 1. 使用中文回答 2. 行内数学表达式用$...$,但这个问题可能不需要数学表达式 3. 独立公式用$$...$$,同样可能不需要 4. 生成相关问题 5. 回答结构清晰,逐步解决问题 用户要求了解Python内置函数的列表和用法。我们可以先介绍什么是内置函数,然后列出一些常用的内置函数并举例说明,最后生成相关问题。 由于引用内容中提到了zip、compile内置函数,我们可以参考这些例子,但需要确保回答的准确性和全面性。 步骤: 1. 定义:解释Python内置函数是什么。 2. 列表:列出一些常用的内置函数(不需要全部,因为太多,但可以给出获取全部内置函数的方法)。 3. 用法:选择几个重要的内置函数详细说明,包括示例代码。 4. 注意事项:简单提及使用内置函数时需要注意的地方。 5. 生成相关问题。 注意:引用标识要自然地添加在引用的段落末尾。根据提供的引用,我们有三个引用,但用户的问题并不直接涉及这些引用的内容,所以我们在必要时才引用(例如,在提到zip函数时,可以引用[1];在提到错误报告时,可以引用[2];在提到compile函数时,可以引用[3])。但要注意,用户的问题主要是询问内置函数的列表和用法,所以引用应作为补充。 由于引用[1]中提到了zip和元组,引用[2]提到了错误报告,引用[3]提到了compile函数,我们可以在讲解这些函数时使用引用。 但是,请注意,用户提供的引用内容可能并不完全与我们的讲解匹配,因此我们只在与引用内容直接相关时才添加引用标识。 现在开始组织回答。</think>### Python内置函数的用途和使用方法 Python内置函数是无需导入模块即可直接使用的核心函数,涵盖了数据类型转换、数学运算、迭代操作、对象操作等基础功能。以下是常用内置函数的分类说明及示例: #### 一、数据类型转换 1. **int()/float()/str()** 类型转换:`int("3") → 3`, `str(5.2) → "5.2"` 2. **list()/tuple()/set()** 容器转换:`tuple([1,2]) → (1, 2)`, `set("abc") → {'a','b','c'}` 3. **bool()** 布尔判断:`bool([]) → False`, `bool("Hi") → True` #### 二、数学运算 1. **abs()/round()** `abs(-7) → 7`, `round(3.1415, 2) → 3.14` 2. **sum()/max()/min()** `sum([1,2,3]) → 6`, `max("Python") → 'y'` 3. **divmod()** 商余数对:`divmod(10,3) → (3, 1)` #### 三、迭代与序列操作 1. **range()** 生成序列:`list(range(1,5)) → [1,2,3,4]` 2. **len()** 获取长度:`len({"a":1,"b":2}) → 2` 3. **zip()** 并行迭代(引用[1]): ```python list(zip([1,2], ["a","b"])) # → [(1,'a'), (2,'b')] ``` 4. **sorted()** 排序:`sorted("cba") → ['a','b','c']` #### 四、对象操作 1. **type()** 类型检测:`type(True) → <class 'bool'>` 2. **id()** 内存地址:`id("x")` 返回唯一标识符 3. **isinstance()** 类型验证:`isinstance(5, int) → True` #### 五、编译与执行 1. **eval()** 执行字符串表达式:`eval("2**3") → 8` 2. **exec()** 执行代码块:`exec("x=5; print(x+1)") → 6` 3. **compile()** 预编译代码(引用[3]): ```python code = compile("print('Hello')", "", "exec") exec(code) # 输出 Hello ``` #### 六、其他实用函数 1. **input()** 用户输入:`name = input("姓名: ")` 2. **open()** 文件操作:`with open("data.txt") as f: ...` 3. **help()** 查看文档:`help(str.split)` > **注意事项**: > - 内置函数名称不可用作变量名(如 `str=5` 会导致后续`str()`失效) > - 错误处理需结合异常捕获(引用[2]) > - 完整列表可通过 `dir(__builtins__)` 查看 ```python # 综合示例:计算列表中偶数的平方和 nums = [1,2,3,4] result = sum(x**2 for x in nums if x%2==0) print(result) # 输出 20 (2²+4²) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值