Table of Contents
Understand the definition of closure
Python’s namespace and scope rules
Closures and lambda expressions
理解闭包的定义
Python的命名空间、作用域规则
闭包和lambda表达式
闭包和装饰器
Home Backend Development Python Tutorial In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism

Apr 14, 2018 am 10:28 AM
python Closure

This article uses Python as an example to explain closures in a simple and easy-to-understand way; according to Baidu Encyclopedia, a closure is a function that can read the internal variables of other functions. For example, in JavaScript, only sub-functions inside the function can read local variables. Therefore, closure can be understood as "a function defined inside a function"; in essence, closure is the bridge that connects the inside of the function and the outside of the function

Understand the definition of closure


Definition: A closure is a function that can read the internal variables of other functions

Understanding: According to the split statement analysis, the closure is...a function. It turns out that the closure is a function. Let’s look at the details to see what kind of function the closure is. The closure can also be read. Get the internal variables of other functions. In other words, the closure function can get the information of the internal variables of other functions - in this way, the information is encapsulated, like a package, which is more vivid

Example:

def make_averager():
    series = []    def averager(new_value):
        series.append(new_value)
        total = sum(series)        return total/len(series)    return averager
Copy after login
Copy after login
>>> avg = make_averager()>>> avg(10)10.0>>> avg(11)10.5>>> avg(12)11.0
Copy after login
Copy after login

Remarks: Closure is the abbreviation of lexical closure, which is functional programming. Important grammatical structures


Python’s namespace and scope rules

In C, there is a special keyword namespace (namespace in English)

Without mentioning C, in Python, There are four namespaces:

1) local namespace: local variable

2) nonlocal namespace: Variables of outer functions in nested functions (Python3.x)

##3)global namespace: Global variables

4) build-in namespace: Built-in variables

namespace is a mapping from variable names to actual objects. Most namespaces are implemented as dictionaries in Python

The nonlocal keyword was introduced in Python 3.0. You can use this keyword to easily access and modify the outer variables of nested functions (if you only access without modifying, you don’t need the nonlocal keyword. Words)

If you modify the outer variable without using the nonlocal keyword, an error will be reported:

def make_averager():
    count = 0
    total = 0

    def averager(new_value):
        count += 1    # Same as: count = count + 1
        total += new_value        return total/count    return average
Copy after login
Copy after login
>>> avg = make_averager()
>>> avg(10)
Traceback (most recent call last):...UnboundLocalError: Local variable 'count' referened before assignment
>>>
Copy after login
Copy after login

To modify outer variables, you must use nonlocalKeywords:

def make_averager():
    count = 0
    total = 0

    def averager(new_value):
        nonlocal count, total    # Declaration of namespace.
        count += 1
        total += new_value        return total/count    return average
Copy after login
Copy after login
>>> avg = make_averager()>>> avg(10)10.0>>> avg(11)10.5>>> avg(12)12
Copy after login
Copy after login

Explanation: In averager In the function, count and total are free variables (Free variables refer to variables that are not bound locally). Free variables are often declared in one scope and used in another scope (such as The above series, count, total)

#Then why in the example of "Understanding the Definition of Closure", the series variable is also a free variable for the inner function But can it be modified directly? Here we need to distinguish the meaning of "modification" of mutable types and immutable types. The series list is a mutable sequence. The append() method is used to modify the value of the list in place. Here we only use the "list variable" feature , but for immutable digital objects count and total, count = 1, this operation actually generates New object

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism

##Always remember that free variables can only be referenced and not modified (Unless the mutable object can be modified in place, in fact, this is how closures are implemented in Python 2.x). To modify, you must use the nonlocal keyword




Closures and lambda expressions

Lambda expressions in Python It is an anonymous function, and the two can be equal

For demonstration purposes, using a for loop or Pythonic list derivation is a good choice:

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism




# Closures and Decorators

To implement yourself in Python Decorator (decorator), must master the knowledge: 1) closure nested function, 2) nonlocal keyword (introduced in Python3.x)

""" Implement a decorator, which return the runtime of the program. """import timedef clock(func):
    def clocked(*args):
        t0 = time.pref_counter()
        result = func(*args)
        elapsed = time.pref_counter() - t0
        name = func.__name__
        arg_str = ', '.join(repr(arg) for arg in args)
        print('[%0.8fs] %s(%s) -> %r' %(elpased, name, arg_str, result))        return result    return clocked
Copy after login
Copy after login

In-depth understanding of Python closure mechanism

本文以Python为例,深入浅出讲解闭包;根据百度百科的解释,闭包就是能够读取其他函数内部变量的函数,例如在JavaScript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成『定义在一个函数内部的函数』;在本质上,闭包是将函数内部和函数外部连接起来的桥梁


理解闭包的定义

定义:闭包(closure)是能够读取其它函数内部变量的函数

理解:根据拆分语句分析,闭包是……函数,原来闭包是函数,再看细节部分,闭包是怎样的函数,闭包还能够读取其它函数内部变量,换句话说,闭包函数可以获取其它函数内部变量的信息——这样信息就被封装起来了,像一个包一样,比较形象

实例:

def make_averager():
    series = []    def averager(new_value):
        series.append(new_value)
        total = sum(series)        return total/len(series)    return averager
Copy after login
Copy after login
>>> avg = make_averager()>>> avg(10)10.0>>> avg(11)10.5>>> avg(12)11.0
Copy after login
Copy after login

备注:闭包(closure)是词法闭包(lexical closure)的简称,是函数式编程的重要的语法结构


Python的命名空间、作用域规则

在C++中,有个专门的关键字namespace(命名空间的英文)

不扯C++,在Python中,存在四种命名空间:

1)local namespace:本地变量

2)nonlocal namespace:嵌套函数中外层函数的变量(Python3.x)

3)global namespace:全局变量

4)build-in namespace:内置变量

namespace是变量名到实际对象的一个映射,大部分namespace都是按Python中的字典来实现的

nonlocal关键字在Python3.0中被引入,使用这个关键字可以轻松的访问并修改嵌套函数的较外层变量(如果仅仅是访问而不修改可以不用nonlocal关键字)

如果修改外层变量却不使用nonlocal关键字会报错:

def make_averager():
    count = 0
    total = 0

    def averager(new_value):
        count += 1    # Same as: count = count + 1
        total += new_value        return total/count    return average
Copy after login
Copy after login
>>> avg = make_averager()
>>> avg(10)
Traceback (most recent call last):...UnboundLocalError: Local variable 'count' referened before assignment
>>>
Copy after login
Copy after login

要修改外层变量就必须使用nonlocal关键字:

def make_averager():
    count = 0
    total = 0

    def averager(new_value):
        nonlocal count, total    # Declaration of namespace.
        count += 1
        total += new_value        return total/count    return average
Copy after login
Copy after login
>>> avg = make_averager()>>> avg(10)10.0>>> avg(11)10.5>>> avg(12)12
Copy after login
Copy after login

解释:在averager函数中,count、total是自由变量(自由变量是指未在本地绑定的变量),自由变量往往是在一个作用域中声明,并在另一个作用域中使用(比如上面的series、count、total)

那为什么在『理解闭包的定义』的实例中,series变量虽然对于内层函数也是自由变量但是却可以直接修改?这里要区分开可变类型和不可变类型的『修改』的含义,series列表是可变序列,append()方法于在原地修改列表的值,这里我们只用到了『列表可变』这一列表的特性,但是对于不可变的数字对象count、total,count += 1,这样的操作实际上生成了新的对象

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism

始终记住,自由变量只能引用不能修改(除非可变对象可以原地修改,事实上Python2.x中就是这样实现闭包的),要修改就必须使用nonlocal关键字




闭包和lambda表达式

Python的lambda表达式就是匿名函数,二者可以划等号

出于演示考虑,用for循环或者Pythonic的列表推导是个不错的选择:

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism

In-depth understanding of Python closure mechanism




闭包和装饰器

要在Python中实现自己的装饰器(decorator),必须掌握的知识:1)闭包+嵌套函数,2)nonlocal关键字(Python3.x引入)

""" Implement a decorator, which return the runtime of the program. """import timedef clock(func):
    def clocked(*args):
        t0 = time.pref_counter()
        result = func(*args)
        elapsed = time.pref_counter() - t0
        name = func.__name__
        arg_str = ', '.join(repr(arg) for arg in args)
        print('[%0.8fs] %s(%s) -> %r' %(elpased, name, arg_str, result))        return result    return clocked
Copy after login
Copy after login

The above is the detailed content of In-depth understanding of Python closure mechanism. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Have Crossplay?
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP and Python: Code Examples and Comparison PHP and Python: Code Examples and Comparison Apr 15, 2025 am 12:07 AM

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.

Python vs. JavaScript: Community, Libraries, and Resources Python vs. JavaScript: Community, Libraries, and Resources Apr 15, 2025 am 12:16 AM

Python and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.

How is the GPU support for PyTorch on CentOS How is the GPU support for PyTorch on CentOS Apr 14, 2025 pm 06:48 PM

Enable PyTorch GPU acceleration on CentOS system requires the installation of CUDA, cuDNN and GPU versions of PyTorch. The following steps will guide you through the process: CUDA and cuDNN installation determine CUDA version compatibility: Use the nvidia-smi command to view the CUDA version supported by your NVIDIA graphics card. For example, your MX450 graphics card may support CUDA11.1 or higher. Download and install CUDAToolkit: Visit the official website of NVIDIACUDAToolkit and download and install the corresponding version according to the highest CUDA version supported by your graphics card. Install cuDNN library:

Detailed explanation of docker principle Detailed explanation of docker principle Apr 14, 2025 pm 11:57 PM

Docker uses Linux kernel features to provide an efficient and isolated application running environment. Its working principle is as follows: 1. The mirror is used as a read-only template, which contains everything you need to run the application; 2. The Union File System (UnionFS) stacks multiple file systems, only storing the differences, saving space and speeding up; 3. The daemon manages the mirrors and containers, and the client uses them for interaction; 4. Namespaces and cgroups implement container isolation and resource limitations; 5. Multiple network modes support container interconnection. Only by understanding these core concepts can you better utilize Docker.

MiniOpen Centos compatibility MiniOpen Centos compatibility Apr 14, 2025 pm 05:45 PM

MinIO Object Storage: High-performance deployment under CentOS system MinIO is a high-performance, distributed object storage system developed based on the Go language, compatible with AmazonS3. It supports a variety of client languages, including Java, Python, JavaScript, and Go. This article will briefly introduce the installation and compatibility of MinIO on CentOS systems. CentOS version compatibility MinIO has been verified on multiple CentOS versions, including but not limited to: CentOS7.9: Provides a complete installation guide covering cluster configuration, environment preparation, configuration file settings, disk partitioning, and MinI

How to operate distributed training of PyTorch on CentOS How to operate distributed training of PyTorch on CentOS Apr 14, 2025 pm 06:36 PM

PyTorch distributed training on CentOS system requires the following steps: PyTorch installation: The premise is that Python and pip are installed in CentOS system. Depending on your CUDA version, get the appropriate installation command from the PyTorch official website. For CPU-only training, you can use the following command: pipinstalltorchtorchvisiontorchaudio If you need GPU support, make sure that the corresponding version of CUDA and cuDNN are installed and use the corresponding PyTorch version for installation. Distributed environment configuration: Distributed training usually requires multiple machines or single-machine multiple GPUs. Place

How to choose the PyTorch version on CentOS How to choose the PyTorch version on CentOS Apr 14, 2025 pm 06:51 PM

When installing PyTorch on CentOS system, you need to carefully select the appropriate version and consider the following key factors: 1. System environment compatibility: Operating system: It is recommended to use CentOS7 or higher. CUDA and cuDNN:PyTorch version and CUDA version are closely related. For example, PyTorch1.9.0 requires CUDA11.1, while PyTorch2.0.1 requires CUDA11.3. The cuDNN version must also match the CUDA version. Before selecting the PyTorch version, be sure to confirm that compatible CUDA and cuDNN versions have been installed. Python version: PyTorch official branch

How to update PyTorch to the latest version on CentOS How to update PyTorch to the latest version on CentOS Apr 14, 2025 pm 06:15 PM

Updating PyTorch to the latest version on CentOS can follow the following steps: Method 1: Updating pip with pip: First make sure your pip is the latest version, because older versions of pip may not be able to properly install the latest version of PyTorch. pipinstall--upgradepip uninstalls old version of PyTorch (if installed): pipuninstalltorchtorchvisiontorchaudio installation latest

See all articles