zip()
创建一个聚合了来自每个可迭代对象中的元素的迭代器。
返回一个元组的迭代器,其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。 当所输入可迭代对象中最短的一个被耗尽时,迭代器将停止迭代。 当只有一个可迭代对象参数时,它将返回一个单元组的迭代器。 不带参数时,它将返回一个空迭代器。 相当于:
def zip(*iterables):
# zip('ABCD', 'xy') --> Ax By
sentinel = object()
iterators = [iter(it) for it in iterables]
while iterators:
result = []
for it in iterators:
elem = next(it, sentinel)
if elem is sentinel:
return
result.append(elem)
yield tuple(result)
函数会保证可迭代对象按从左至右的顺序被求值。 使得可以通过 zip(*[iter(s)]*n)
这样的惯用形式将一系列数据聚类为长度为 n 的分组。 这将重复 同样的 迭代器 n
次,以便每个输出的元组具有第 n
次调用该迭代器的结果。 它的作用效果就是将输入拆分为长度为 n 的数据块。
当你不用关心较长可迭代对象末尾不匹配的值时,则 zip()
只须使用长度不相等的输入即可。 如果那些值很重要,则应改用 itertools.zip_longest()
。zip()
与 *
运算符相结合可以用来拆解一个列表:
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
exec()
exec(object[, globals[, locals]])
这个函数支持动态执行 Python 代码。object 必须是字符串或者代码对象。如果是字符串,那么该字符串将被解析为一系列 Python 语句并执行(除非发生语法错误)。如果是代码对象,它将被直接执行。在任何情况下,被执行的代码都需要和文件输入一样是有效的。请注意即使在传递给 exec()
函数的代码的上下文中,return
和 yield
语句也不能在函数定义之外使用。该函数返回值是 None
。
exec() 函数接受大量代码块,这与 eval() 函数仅接受单个表达式不同。
参数 | 描述 |
---|---|
object | 字符串或代码对象。 |
globals | 可选。包含全局参数的字典。 |
locals | 可选。包含局部参数的字典。 |
class person:
def __init__(self):
self.name = 'dhh'
self.age = 23
p = person()
x = "print(getattr(p,'name'))"
exec(x)
getattr()
getattr(object, n__ame[, default])
返回对象命名属性的值,name 必须是字符串。如果该字符串是对象的属性之一,则返回该属性的值。例如, getattr(x, 'foobar')
等同于 x.foobar
。如果指定的属性不存在,且提供了 default 值,则返回它,否则触发 AttributeError
。
class person:
def __init__(self):
self.age=23
self.name='mytf'
p=person()
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
将会被打印出来。)
可选参数 flags 和 dont_inherit 控制在编译 source 时要用到哪个 future 语句。 如果两者都未提供(或都为零)则会使用调用 compile()
的代码中有效的 future 语句来编译代码。 如果给出了 flags 参数但没有 dont_inherit (或是为零) 则 flags 参数所指定的 以及那些无论如何都有效的 future 语句会被使用。 如果 dont_inherit 为一个非零整数,则只使用 flags 参数 — 在调用外围有效的 future 语句将被忽略。
Future 语句使用比特位来指定,多个语句可以通过按位或来指定。具体特性的比特位可以通过 __future__
模块中的 _Feature
类的实例的 compiler_flag
属性来获得。
可选参数 flags 还会控制是否允许编译的源码中包含最高层级 await
, async for
和 async 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。 |
x = compile('print(89)\nprint(88)', 'test', 'exec')
exec(x)