参考来源 Python官网 W3School

zip()

创建一个聚合了来自每个可迭代对象中的元素的迭代器。
返回一个元组的迭代器,其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。 当所输入可迭代对象中最短的一个被耗尽时,迭代器将停止迭代。 当只有一个可迭代对象参数时,它将返回一个单元组的迭代器。 不带参数时,它将返回一个空迭代器。 相当于:

  1. def zip(*iterables):
  2. # zip('ABCD', 'xy') --> Ax By
  3. sentinel = object()
  4. iterators = [iter(it) for it in iterables]
  5. while iterators:
  6. result = []
  7. for it in iterators:
  8. elem = next(it, sentinel)
  9. if elem is sentinel:
  10. return
  11. result.append(elem)
  12. yield tuple(result)

函数会保证可迭代对象按从左至右的顺序被求值。 使得可以通过 zip(*[iter(s)]*n) 这样的惯用形式将一系列数据聚类为长度为 n 的分组。 这将重复 同样的 迭代器 n 次,以便每个输出的元组具有第 n 次调用该迭代器的结果。 它的作用效果就是将输入拆分为长度为 n 的数据块。
当你不用关心较长可迭代对象末尾不匹配的值时,则 zip() 只须使用长度不相等的输入即可。 如果那些值很重要,则应改用 itertools.zip_longest()
zip()* 运算符相结合可以用来拆解一个列表:

  1. >>> x = [1, 2, 3]
  2. >>> y = [4, 5, 6]
  3. >>> zipped = zip(x, y)
  4. >>> list(zipped)
  5. [(1, 4), (2, 5), (3, 6)]
  6. >>> x2, y2 = zip(*zip(x, y))
  7. >>> x == list(x2) and y == list(y2)
  8. True

exec()

exec(object[, globals[, locals]])
这个函数支持动态执行 Python 代码。object 必须是字符串或者代码对象。如果是字符串,那么该字符串将被解析为一系列 Python 语句并执行(除非发生语法错误)。如果是代码对象,它将被直接执行。在任何情况下,被执行的代码都需要和文件输入一样是有效的。请注意即使在传递给 exec() 函数的代码的上下文中,returnyield 语句也不能在函数定义之外使用。该函数返回值是 None

exec() 函数接受大量代码块,这与 eval() 函数仅接受单个表达式不同。

参数 描述
object 字符串或代码对象。
globals 可选。包含全局参数的字典。
locals 可选。包含局部参数的字典。
  1. class person:
  2. def __init__(self):
  3. self.name = 'dhh'
  4. self.age = 23
  5. p = person()
  6. x = "print(getattr(p,'name'))"
  7. exec(x)

getattr()

getattr(object, n__ame[, default])
返回对象命名属性的值,name 必须是字符串。如果该字符串是对象的属性之一,则返回该属性的值。例如, getattr(x, 'foobar') 等同于 x.foobar。如果指定的属性不存在,且提供了 default 值,则返回它,否则触发 AttributeError

  1. class person:
  2. def __init__(self):
  3. self.age=23
  4. self.name='mytf'
  5. p=person()
  6. getattr(p,'age') # 获取p.age的值

compile()

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
source 编译成代码或 AST 对象。代码对象可以被 exec()eval() 执行。source 可以是常规的字符串、字节字符串,或者 AST 对象。参见 ast 模块的文档了解如何使用 AST 对象。
filename 实参需要是代码读取的文件名;如果代码不需要从文件中读取,可以传入一些可辨识的值(经常会使用 '<string>')。
mode 实参指定了编译代码必须用的模式。如果 source 是语句序列,可以是 'exec';如果是单一表达式,可以是 'eval';如果是单个交互式语句,可以是 'single'。(在最后一种情况下,如果表达式执行结果不是 None 将会被打印出来。)
可选参数 flagsdont_inherit 控制在编译 source 时要用到哪个 future 语句。 如果两者都未提供(或都为零)则会使用调用 compile() 的代码中有效的 future 语句来编译代码。 如果给出了 flags 参数但没有 dont_inherit (或是为零) 则 flags 参数所指定的 以及那些无论如何都有效的 future 语句会被使用。 如果 dont_inherit 为一个非零整数,则只使用 flags 参数 — 在调用外围有效的 future 语句将被忽略。
Future 语句使用比特位来指定,多个语句可以通过按位或来指定。具体特性的比特位可以通过 __future__ 模块中的 _Feature 类的实例的 compiler_flag 属性来获得。
可选参数 flags 还会控制是否允许编译的源码中包含最高层级 await, async forasync with。 当设定了比特位 ast.PyCF_ALLOW_TOP_LEVEL_AWAIT 时,所返回代码对象在 co_code 中设定了 CO_COROUTINE,并可通过 await eval(code_object) 交互式地执行。
optimize 实参指定编译器的优化级别;默认值 -1 选择与解释器的 -O 选项相同的优化级别。显式级别为 0 (没有优化;__debug__ 为真)、1 (断言被删除, __debug__ 为假)或 2 (文档字符串也被删除)。
如果编译的源码不合法,此函数会触发 SyntaxError 异常;如果源码包含 null 字节,则会触发 ValueError 异常。

参数 描述
source 必需。要编译的资源,可以是字符串、字节或 AST 对象。
filename 必需。源所来自的文件的名称。如果源不是来自文件,则可以编写任何内容。
mode 必需。合法值:
- eval - 如果源是单个表达式
- exec - 如果源是语句块
- single - 如果源是单个交互式语句
flags 可选。如何对源进行编译。默认为 0。
dont-inherit 可选。如何对源进行编译。默认为 False。
optimize 可选。定义编译器的优化级别。默认为 -1。
  1. x = compile('print(89)\nprint(88)', 'test', 'exec')
  2. exec(x)