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

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks 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)

Hot Topics

Java Tutorial
1666
14
PHP Tutorial
1273
29
C# Tutorial
1252
24
PHP and Python: Different Paradigms Explained PHP and Python: Different Paradigms Explained Apr 18, 2025 am 12:26 AM

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

Choosing Between PHP and Python: A Guide Choosing Between PHP and Python: A Guide Apr 18, 2025 am 12:24 AM

PHP is suitable for web development and rapid prototyping, and Python is suitable for data science and machine learning. 1.PHP is used for dynamic web development, with simple syntax and suitable for rapid development. 2. Python has concise syntax, is suitable for multiple fields, and has a strong library ecosystem.

How to run sublime code python How to run sublime code python Apr 16, 2025 am 08:48 AM

To run Python code in Sublime Text, you need to install the Python plug-in first, then create a .py file and write the code, and finally press Ctrl B to run the code, and the output will be displayed in the console.

PHP and Python: A Deep Dive into Their History PHP and Python: A Deep Dive into Their History Apr 18, 2025 am 12:25 AM

PHP originated in 1994 and was developed by RasmusLerdorf. It was originally used to track website visitors and gradually evolved into a server-side scripting language and was widely used in web development. Python was developed by Guidovan Rossum in the late 1980s and was first released in 1991. It emphasizes code readability and simplicity, and is suitable for scientific computing, data analysis and other fields.

Python vs. JavaScript: The Learning Curve and Ease of Use Python vs. JavaScript: The Learning Curve and Ease of Use Apr 16, 2025 am 12:12 AM

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Golang vs. Python: Performance and Scalability Golang vs. Python: Performance and Scalability Apr 19, 2025 am 12:18 AM

Golang is better than Python in terms of performance and scalability. 1) Golang's compilation-type characteristics and efficient concurrency model make it perform well in high concurrency scenarios. 2) Python, as an interpreted language, executes slowly, but can optimize performance through tools such as Cython.

Where to write code in vscode Where to write code in vscode Apr 15, 2025 pm 09:54 PM

Writing code in Visual Studio Code (VSCode) is simple and easy to use. Just install VSCode, create a project, select a language, create a file, write code, save and run it. The advantages of VSCode include cross-platform, free and open source, powerful features, rich extensions, and lightweight and fast.

How to run python with notepad How to run python with notepad Apr 16, 2025 pm 07:33 PM

Running Python code in Notepad requires the Python executable and NppExec plug-in to be installed. After installing Python and adding PATH to it, configure the command "python" and the parameter "{CURRENT_DIRECTORY}{FILE_NAME}" in the NppExec plug-in to run Python code in Notepad through the shortcut key "F6".

See all articles