前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python内置函数

Python内置函数

作者头像
一只大鸽子
发布2022-12-06 14:28:13
5530
发布2022-12-06 14:28:13
举报

翻译

原博客:https://sadh.life/post/builtins/#so-whats-a-builtin

前言

如Python标准库文档所言:

Python 标准库非常庞大,所提供的组件涉及范围十分广泛,正如以下内容目录所显示的。这个库包含了多个内置模块 (以 C 编写),Python 程序员必须依靠它们来实现系统级功能,例如文件 I/O,此外还有大量以 Python 编写的模块,提供了日常编程中许多问题的标准解决方案。

显然,一篇博客无法覆盖Python标准库的所有内容,这篇博客对Python的内置(builtin)模块提供了一个简要的概述。

什么是内置(builtin)呢?

Python 内置功能存在于builtins模块。

你需要了解L.E.G.B 规则。该规则定义了Python查找变量作用域的顺序。具体来说:

  1. Local scope(局部作用域)
  2. Enclosing(or nonlocal) scope(封闭 or 非局部作用域)
  3. Global scope(全局作用域)
  4. Builtin scope(内置作用域)

(译者注:简单来说,从里到外进行查找)

Local scope

local scope(局部作用域)指的是当前函数或者当前类的作用域。每个函数调用或类实例化都会创建一个新的局部作用域,存放局部变量。

e.g

代码语言:javascript
复制
x = 11
print(x)

def some_function():
    x = 22
    print(x)

some_function()

print(x)

output:

代码语言:javascript
复制
11
22
11

注意到 some_function()x = 22定义了一个新的变量,该函数的局部名称空间(local namespace)定义了一个x。在x = 22后,该函数内访问x(print(x)) ,访问的都是该作用域的x(22)。而离开函数some_function()后,外部访问的x是外部定义的`x。

Enclosing scope

Enclosing scope(封闭作用域)或称 nonlocal scope(非局部作用域):当前函数/类 所在的函数/类。说起来有点绕,直接看例子吧:

代码语言:javascript
复制
x = 11
def outer_function():
    x = 22
    y = 789

    def inner_function():
        x = 33
        print('Inner x:', x)
        print('Enclosing y:', y)

    inner_function()
    print('Outer x:', x)

outer_function()
print('Global x:', x)

output

代码语言:javascript
复制
Inner x: 33
Enclosing y: 789
Outer x: 22
Global x: 11

每个新函数/类都创建自己的本地作用域,独立于其外部环境。函数内部可以访问外部变量(print('Enclosing y:', y)),但在本地作用域中创建的任何变量(x = 33)都不会影响外部作用域。因此在内部函数内重新定义 x 为不会影响 外部或全局定义的x

但是,如果想影响外部的变量该怎么做?可以使用关键字nonlocal告诉解释器,你不打算在本地定义新变量,而是修改封闭作用域中的变量:

代码语言:javascript
复制
def outer_function():
    x = 11

    def inner_function():
        nonlocal x
        x = 22
        print('Inner x:', x)

    inner_function()
    print('Outer x:', x)

output:

代码语言:javascript
复制
Inner x: 22
Outer x: 22

(inner_function 通过nolocal x的声明,告诉解释器这个x来自外层。)

Global scope

Global scope(全局作用域)或称为module scope(模块作用域)指定义模块的顶级变量、函数和类的作用域。

“模块”是可以运行或导入的任何python文件或包。例如,time是一个模块(你可以import time),time.sleep()time模块的全局作用域中定义的函数。

Python中的每个模块都有一些预定义的全局变量,例如__name____doc__ ,它们分别是模块的名称和模块的文档字符串。您可以在 REPL(Read-Evaluate-Print-Loop,Python解释器的功能) 中尝试此操作:

代码语言:javascript
复制
>>> print(__name__)
__main__
>>> print(__doc__)
None
>>> import time
>>> time.__name__
'time'
>>> time.__doc__
'This module provides various functions to manipulate time values.'

Builtin scope

现在我们进入这个博客的主题 ——内置范围。

关于Python中的内置范围:

  • • 它基本上是定义所有 Python 顶级函数的范围,例如lenrangeprint
  • • 当在局部,封闭或全局范围内找不到变量时,Python会在内置中查找它。

如果需要,您可以通过导入模块builtins并检查其中的方法:

代码语言:javascript
复制
>>> import builtins
>>> builtins.a   # press <Tab> here
builtins.abs(    builtins.all(    builtins.any(    builtins.ascii(

Python默认在全局名称空间__builtins__暴露了内置模块,所以你可以直接访问__builtins__,无需导入任何东西。

注意, __builtins__ 是CPython的实现细节, Python的其他实现未必包含。因此import builtins是最正确的访问内置模块的方法。(译者注:CPython是Python官方的实现,也有其他实现如Jython

所有内置

可以用dir列出所有内置变量。

代码语言:javascript
复制
print(dir(__builtins__))

(数了一下,有154个) 有很多,所以我们会将它们分成不同类型,逐个击破。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一只大鸽子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是内置(builtin)呢?
    • Local scope
      • Enclosing scope
        • Global scope
          • Builtin scope
            • 所有内置
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档