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

yizhihongxing

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实现归一化算法详情

    下面是关于“Python实现归一化算法详情”的完整攻略。 1. 归一化算法理论基础 归一化是一种常用的预处理技术,它的基本思想是将数据按照一定比例缩放到定的范围内,以便更好地进行分析处理。常用的归一化方法有两种,分别是最小-最大归一化和Z-score归一化。 1.1 最小-最大归一化 最小-最大归一化是一种常用的归一化方法,它的基本思想是将数据按照定的比例缩…

    python 2023年5月13日
    00
  • 从 csv 中提取列中的数据,保存为字典(Python、Pandas)

    【问题标题】:Extract data in a column from a csv, saved as a dictionary (Python, Pandas)从 csv 中提取列中的数据,保存为字典(Python、Pandas) 【发布时间】:2023-04-03 13:46:02 【问题描述】: 我正在学习人工智能和机器学习,但我发现了一个困难。我的…

    Python开发 2023年4月8日
    00
  • Python+OpenCV六种实时图像处理详细讲解

    Python+OpenCV六种实时图像处理详细讲解 本文将介绍Python和OpenCV库的结合使用,讲解六种实时图像处理方法的实现过程。每种方法都给出了详细的代码示例和解释,帮助读者更好地理解相关概念和思路。 前置条件 在开始学习本文内容前,你需要以及掌握以下: Python基础,包括变量、数据类型、判断和循环语句等。 OpenCV库的基础知识,包括图像读…

    python 2023年5月19日
    00
  • 用Numpy实现sigmoid函数

    下面我将为您详细讲解使用Numpy实现sigmoid函数的完整攻略。 1. Sigmoid函数的定义 Sigmoid函数是一种常用的激活函数,定义为: $$sigmoid(x)=\frac{1}{1+e^{-x}}$$ 2. Numpy实现 在Python中,我们可以使用Numpy库来实现sigmoid函数。 2.1 导入Numpy库和math库 我们需要导…

    python-answer 2023年3月25日
    00
  • 在PyTorch中使用标签平滑正则化的问题

    在PyTorch中使用标签平滑正则化的问题是指在训练神经网络时,为了防止过拟合,需要对模型的输出进行正则化处理。标签平滑正则化是一种常用的正则化方法,它可以使模型更加鲁棒,提高泛化能力。以下是在PyTorch中使用标签平滑正则化的完整攻略: 步骤1:导入必要的库 在PyTorch中使用标签平滑正则化需要导入torch.nn库。以下是一个示例代码: impor…

    python 2023年5月14日
    00
  • 经验丰富程序员才知道的8种高级Python技巧

    《经验丰富程序员才知道的8种高级Python技巧》这篇文章介绍了8种高级的Python技巧。下面我们逐个进行讲解: 1. 拆解嵌套式的数据结构 在Python中,嵌套式的数据结构比较常见,如:嵌套式的列表和字典等。如果想要快速的获取一个嵌套式数据结构的某一个元素,而且又不想写很多的代码,那么可以使用 Python 中的协程来实现这个目的。 协程提供了一种更加…

    python 2023年5月31日
    00
  • Python zip()实现结构化

    Python中的zip()函数是一种用于合并两个或多个可迭代对象的函数,它可以将多个列表、元组或其他序列对象“缝合”在一起,并返回一个由元组组成的新列表。具体来说,它会返回多个可迭代对象中的元素以元组的形式打包成一个新的列表,新的列表中的元素个数以最短的可迭代对象长度为准。 以下是使用zip()函数的完整攻略。 语法格式 zip([iterable, ……

    python-answer 2023年3月25日
    00
  • Python实现一个优先级队列的方法

    下面是“Python实现一个优先级队列的方法”的完整攻略,步骤如下: 步骤一:理解优先级队列的概念 优先级队列是一种数据结构,它可以按照优先级来排列元素。在优先级队列中,每个元素都有一个优先级,最高优先级的元素最先被处理,而优先级较低的元素后被处理。优先级队列可以用来解决很多实际问题,比如任务调度、事件处理等。 步骤二:选择合适的实现方式 Python中有多…

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