Python函数高级(命名空间、作用域、装饰器)

Python函数高级(命名空间、作用域、装饰器)

命名空间

在Python中每个函数、类、模块都有自己的命名空间,这个空间负责保存这个东西创建的变量名和对应的对象。当Python解释器执行某个函数或者类时,会自动创建一个与函数或类相对应的命名空间。

局部命名空间

在函数内部声明的变量,只在函数内部有效,也就是说,在函数外部是访问不到的。

def f():
    a = 1
    print(a) # 1

f()
print(a) # NameError: name 'a' is not defined

类似地,因为Python函数是可以嵌套的,所以每个内部函数也会创建一个属于自己的命名空间。

全局命名空间

当Python程序运行时,会自动创建一个全局命名空间(也可以称为模块命名空间),这个空间的生命期和整个程序是一致的,其中的变量在整个程序中都可以进行访问。

在模块中声明的函数、类、变量都属于全局命名空间,这些变量的作用域在整个模块中都是有效的。

a = 1

def f():
    print(a)

f() # 1

内置命名空间

Python解释器自动创建的命名空间,其中存放了Python内置的函数和变量。这些名称在Python程序中无须声明即可直接使用。

作用域

Python中的作用域也是和命名空间紧密相关的,简单来说,作用域定义了一个名称(变量名、函数名、类名)在程序的哪个地方可以被访问到。

Python中有L(Local)、E(Enclosing)、G(Global)、B(Built-in)4种作用域。

L作用域

L作用域又称局部作用域,表示在当前函数内部定义的函数或变量,只在函数的局部范围内有效;在函数外部是无法访问的。

def f():
    x = 'Hello, Python!'
    def g():
        print(x)
    g()

f() # Hello, Python!

在上面的代码中,g函数就是在f内部定义的函数,它所在的作用域是Lg函数可以访问到外部的变量x,因为xf函数内部定义了,是属于f函数的局部变量。

E作用域

E作用域又称封闭作用域,表示在一个嵌套函数中访问到外层函数的变量,只要嵌套的关系成立,就能够访问到外层函数中的变量。

def f():
    x = 'Hello, Python!'
    def g():
        print(x)
    return g

h = f()
h() # Hello, Python!

上面代码中,g函数嵌套在f函数内部,因此在g函数中可以访问到f函数内部的变量x。注意,在这个示例中,f函数返回的是g函数,所以h就是g函数,调用h实际上是调用g函数。

G作用域

G作用域表示全局作用域,其中的变量是在整个程序中都有用的。

x = 123

def f():
    print(x)

f() # 123

B作用域

B作用域表示内置作用域,其中的变量是Python语言自带的,可以直接使用。

例如:

print(123)

这里print函数就是内置函数,在Python程序中可以直接使用。

装饰器

装饰器是Python语言中非常常见的一个特性,它可以动态地修改一个函数或类的行为,而不需要对函数或类本身进行修改。

定义装饰器

可以通过定义一个函数,这个函数会接收一个函数作为参数并返回一个函数。这个函数就是装饰器的定义。

例如:

def my_decorator(func):
    def wrapper():
        print('Before the function is called.')
        func()
        print('After the function is called.')

    return wrapper

上面的代码定义了一个名为my_decorator的装饰器函数,这个函数接收一个函数作为参数,在内部定义一个名为wrapper的函数,wrapper这个函数就是执行实际函数前后需要附加行为的地方。在完成wrapper函数的定义后,将其作为结果返回。

使用装饰器

定义了一个装饰器之后,可以通过在函数定义时应用这个装饰器来改变原有函数的行为。

例如:

@my_decorator
def say_hello():
    print('Hello, World!')

@my_decorator语句表明现在要对say_hello函数进行装饰,将my_decorator这个装饰器应用在say_hello上面。

多个装饰器的应用

可以对一个函数应用多个装饰器。

例如:

def my_decorator1(func):
    def wrapper():
        print('Before the function is called by decorator1.')
        func()
        print('After the function is called by decorator1.')

    return wrapper

def my_decorator2(func):
    def wrapper():
        print('Before the function is called by decorator2.')
        func()
        print('After the function is called by decorator2.')

    return wrapper

@my_decorator1
@my_decorator2
def say_hello():
    print('Hello, World!')

在这个示例中,say_hello函数先被my_decorator2装饰器装饰,然后再被my_decorator1装饰器装饰。这意味着my_decorator1wrapper函数将实际被传递到my_decorator2wrapper函数中。这样一来,在调用say_hello函数时,首先会执行my_decorator2wrapper函数,然后执行my_decorator1wrapper函数,最后才执行实际函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python函数高级(命名空间、作用域、装饰器) - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python 执行字符串表达式函数(eval exec execfile)

    下面详细讲解一下 Python 执行字符串表达式函数(eval exec execfile) 的完整攻略。 eval函数 eval() 函数实现了一个简单的、安全的 Python 解释器。它能够计算并执行字符串中的 Python 表达式。 result = eval(expression) 其中,result 是表达式计算的结果,expression 是待计…

    python 2023年6月5日
    00
  • Python程序笔记20230301

    打印九九乘法表 for i in range(1, 10): for j in range(1, i+1): print(i, “x”, j, “=”, i * j, end=’ ‘) print(“\n”) 第三行的 print(i, “x”, j, “=”, i * j, end=’ ‘) 打印出 i 和 j 的乘积,并在末尾添加一个空格,以便下一个数字…

    python 2023年4月18日
    00
  • Django中Cookie设置及跨域问题处理详解

    当我们在Django中处理Web应用程序的时候,经常会涉及到Cookie设置以及跨域问题处理。在此,我将分享一些关于Django中Cookie设置及跨域问题处理的攻略。 Cookie设置 当我们使用Django开发Web应用程序时,Cookie被广泛应用在用户身份验证和会话管理中。在Django中,我们可以使用Python的标准HTTPCookie模块来处理…

    python 2023年5月18日
    00
  • Python利用prettytable库输出好看的表格

    Python是一种易于学习和使用的编程语言,许多数据分析和处理任务都可以使用Python快速完成。而输出好看的表格是数据处理的一个重要部分,基于Python,可以使用prettytable库来输出好看的表格。 安装prettytable库 在开始使用prettytable库之前,需要先安装该库。可以通过pip命令来安装prettytable库,具体操作如下:…

    python 2023年6月5日
    00
  • python线程定时器Timer实现原理解析

    在Python中,可以使用threading库的Timer类来实现定时器功能。以下是Timer类的实现原理解析: Timer类的基本用法 Timer类是threading库中的一个类,用于在指定时间后执行一个函数。以下是Timer类的基本用法: import threading def hello(): print("Hello, world!&q…

    python 2023年5月14日
    00
  • python实现学生管理系统源码

    Python实现学生管理系统源码 1. 概述 学生管理系统是非常基础的管理系统,它可以帮助老师和管理员轻松管理学生信息。在Python中,我们可以使用面向对象的编程思想来实现学生管理系统,数据可以存储在本地或者数据库中。 2. 实现步骤 2.1. 设计数据模型 首先需要设计好数据模型,即需要存储哪些信息,例如学生的姓名、学号、性别、年龄、班级等信息。然后根据…

    python 2023年5月30日
    00
  • Python+Appium自动化测试的实战

    Python+Appium自动化测试的实战攻略 什么是Appium自动化测试? Appium是一款基于WebDriver协议的自动化测试工具,可用于测试Android和iOS的原生应用、混合应用和移动网页。由于其开源免费、跨平台的特点,在移动端自动化测试领域得到广泛应用和支持。 Appium自动化测试的优势 相较于传统的手动测试方式,Appium自动化测试有…

    python 2023年6月6日
    00
  • Python常见格式化字符串方法小结【百分号与format方法】

    下面是Python常见格式化字符串方法小结的完整攻略。 Python常见格式化字符串方法小结【百分号与format方法】 介绍 在Python中,格式化字符串是一个经常用到的功能。Python提供了两种常见的格式化字符串方法,分别是百分号(%)方法和format方法。这两种方法可以让我们方便地将变量、常量等数据组合成字符串,有很广泛的应用场景。本文将对这两种…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部