Python标准库7内置函数VWXYZ

38次阅读

共计 2345 个字符,预计需要花费 6 分钟才能阅读完成。

上一篇文章:Python 标准库 —6、内置函数(P-K-R-S-T-U)
下一篇文章:Python 标准库 —8、内置常量

内置函数:

67. vars([object])

返回模块、类、实例或任何其它具有 dict 属性的对象的 dict 属性。

模块和实例这样的对象具有可更新的 dict 属性;但是,其它对象的 dict 属性可能会设为限制写入(例如,类会使用 types.MappingProxyType 来防止直接更新字典)。

不带参数时,vars() 的行为类似 locals()。请注意,locals 字典仅对于读取起作用,因为对 locals 字典的更新会被忽略。

68. zip(*iterables)

创建一个聚合了来自每个可迭代对象中的元素的迭代器。

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

def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    rr = 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

69. __import__(name, globals=None, locals=None, fromlist=(), level=0)

注解 与 importlib.import_module() 不同,这是一个日常 Python 编程中不需要用到的高级函数。
此函数会由 import 语句发起调用。它可以被替换 (通过导入 builtins 模块并赋值给 builtins.__import__) 以便修改 import 语句的语义,但是 强烈 不建议这样做,因为使用导入钩子 (参见 PEP 302) 通常更容易实现同样的目标,并且不会导致代码问题,因为许多代码都会假定所用的是默认实现。同样也不建议直接使用 __import__() 而应该用 importlib.import_module()。

该函数会导入 name 模块,有可能使用给定的 globals 和 locals 来确定如何在包的上下文中解读名称。fromlist 给出了应该从由 name 指定的模块导入对象或子模块的名称。标准实现完全不使用其 locals 参数,而仅使用 globals 参数来确定 import 语句的包上下文。

level 指定是使用绝对还是相对导入。0 (默认值) 意味着仅执行绝对导入。level 为正数值表示相对于模块调用 __import__() 的目录,将要搜索的父目录层数 (详情参见 PEP 328)。

当 name 变量的形式为 package.module 时,通常将会返回最高层级的包(第一个点号之前的名称),而 不是 以 name 命名的模块。但是,当给出了非空的 fromlist 参数时,则将返回以 name 命名的模块。

例如,语句 import spam 的结果将为与以下代码作用相同的字节码:

spam = __import__('spam', globals(), locals(), [], 0)

语句 import spam.ham 的结果将为以下调用:

spam = __import__('spam.ham', globals(), locals(), [], 0)

请注意在这里 __import__() 是如何返回顶层模块的,因为这是通过 import 语句被绑定到特定名称的对象。

另一方面,语句 from spam.ham import eggs, sausage as saus 的结果将为

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage

在这里,spam.ham 模块会由 __import__() 返回。要导入的对象将从此对象中提取并赋值给它们对应的名称。

如果您只想按名称导入模块(可能在包中),请使用 importlib.import_module()

在 3.3 版更改: Negative values for level are no longer supported (which also changes the default value to 0).

脚注
解析器只接受 Unix 风格的行结束符。如果您从文件中读取代码,请确保用换行符转换模式转换 Windows 或 Mac 风格的换行符。

上一篇文章:Python 标准库 —6、内置函数(P-K-R-S-T-U)
下一篇文章:Python 标准库 —8、内置常量

正文完
 0