Jadual Kandungan
一、函数作为返回值
二、闭包
1、产生闭包的条件以及作用
2、闭包举例
三、匿名函数lambda
Rumah pembangunan bahagian belakang Tutorial Python Python中闭包Closure是什么?有哪些应用?

Python中闭包Closure是什么?有哪些应用?

Oct 13, 2018 pm 02:53 PM

本篇文章给大家带来的内容是关于Python中闭包Closure是什么?有哪些应用?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、函数作为返回值

介绍“闭包”之前,先了解一下函数作为返回值的情况。
高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回。例如之前介绍的装饰器中,就出现了将函数作为返回值。

二、闭包

1、产生闭包的条件以及作用

什么是闭包?
当在函数中嵌套另一个函数时,如果内部函数引用了外部函数的变量,则可能产生闭包。
所以闭包产生的三个条件(缺一不可)

  • 1、必须嵌套一个内部函数

  • 2、内部函数必须引用外部函数的变量

  • 3、外部函数必须返回内部函数

那为什么要试用闭包,闭包的作用呢?

  • 1、闭包可以根据外部函数的局部变量来得到不同的结果

  • 2、当闭包执行完成后,仍可以保持当前的运行环境,执行结果依赖于该函数上一次的运行结果

2、闭包举例

栗子一:求序列之和

>>> def calc_sum(*args):
...     ax = 0
...     for n in args:
...         ax = ax + n
...     return ax  # 返回变量
...
>>> calc_sum(1,2,3)
6
Salin selepas log masuk

但是,现在如果要求不需要立即取得求和结果,而是在后面的代码中,根据需要再计算,该怎么弄呢?
我们可以不返回求和的结果,而返回求和的函数,如下:

>>>def lazy_sum(*args):
...    def sum():            # sum()是内部函数,可以利用外部函数的参数
...        ax = 0
...        for n in args:    # sum()中使用外部函数的局部变量
...            ax = ax + n 
...        return ax
...    return sum            # 形成闭包,此时,*args保存在返回的函数中
...
>>>f = lazy_sum(1,3,5,7,9)
>>>f          # 此时返回的是求和函数
>>> f()       # 调用函数f()时,才真正计算求和的结果
25
Salin selepas log masuk

注意:

lazy_sum()函数的内部执行顺序,执行f时,运行到return sum处,*args保存在返回函数中,返回的是sum()函数。当执行f()时,相当于执行sum(),且包含*args。

当我们调用lazy_sun()时,每次都会返回一个新的函数,即使传入相同的参数,但是f()调用结果不影响。

我们来验证第二点:

# 但是调用 f1() 与f2()的调用结果互不影响
>>> f1 = lazy_sum(1,3,5,7,9)
>>> f2 = lazy_sum(1,3,5,7,9)
>>> f1
<function lazy_sum.<locals>.sum at 0x013DD618>
>>> f2
<function lazy_sum.<locals>.sum at 0x02F92DF8>
>>> f1 == f2
False
>>> f1() == f2()
True
>>> f1()
25
>>> f2()
25
>>> id(f1())
1627215984
>>> id(f2())
1627215984
Salin selepas log masuk

说明:f1与f2返回函数的位置不一样,所以f1==f2返回结果为False。
但是不影响最后的执行结果,f1()与f2()的执行结果均为25,且用id()进行查看,指向是同一块区域。

栗子二:

def count():
    fs = []
    for i in range(1, 4):
        def f():         # 返回函数f()放在循环里
            return i*i
    fs.append(f)
    return fs
f1, f2, f3 = count()
Salin selepas log masuk

实际执行结果为:f1=9 f2=9 f3=9
可能与实际想的([1,4,9])有点不一样。因为f()函数放在了for循环里,只有当循环结束后,最后才返回i=3的执行结果9。
所以返回函数最好不要引用任何循环变量,或者说后续可能变化的量。那如何来修改呢?

def count():
    def f(j):
        def g():
            return j*j      # 形成闭包
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i))      # 一个i值进入后,f(i)立刻被执行,并加入到fs中
    return fs

f1, f2, f3 = count()  # 返回函数g没有引用j
Salin selepas log masuk

最后结果:[1,4,9] 即f1=1 f2=4 f3=

三、匿名函数lambda

定义:匿名函数指一类无需定义标识符函数名的函数或者子程序。Python允许使用lambda关键字创造匿名函数。

语法:lambda 参数:表达式
  或者 lambda 形参1,…,形参n : function(形参),入参1,…,入参n

注意:1、lambda函数可以接收任意多个参数并且返回单个表达式的值;
  2、lambda中不能包含命令,返回的表达式不能超过一个。

优点:1、可以省去定义函数的过程,精简代码;
  2、对于一些抽象的、不会重复使用的函数可以用lambda进行定义。

例子:

>>> list( map( lambda x: x*x ,[1,2,3] ) )
[1, 4, 9]
Salin selepas log masuk

其中lamdba x : x*x 实现的是:def f(x): return x*x 的功能。

  • 可以把匿名函数赋值给一个变量,再利用变量调用该函数。例如:

>>> f = lambda x:x*x  
>>> f(5) # 调用
>>> g = lambda x,y=2 : x*y
>>> g(2,4)
8
>>> g(2)    # 默认y=2
4
Salin selepas log masuk
  • 可以把匿名函数作为返回值返回,例如:

return lambda x:x*x
Salin selepas log masuk

Atas ialah kandungan terperinci Python中闭包Closure是什么?有哪些应用?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Apr 01, 2025 pm 05:09 PM

Penyelesaian kepada Isu Kebenaran Semasa Melihat Versi Python di Terminal Linux Apabila anda cuba melihat versi Python di Terminal Linux, masukkan Python ...

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam Kaedah Projek dan Masalah Dikemukakan Dalam masa 10 Jam? Apr 02, 2025 am 07:18 AM

Bagaimana Mengajar Asas Pengaturcaraan Pemula Komputer Dalam masa 10 jam? Sekiranya anda hanya mempunyai 10 jam untuk mengajar pemula komputer beberapa pengetahuan pengaturcaraan, apa yang akan anda pilih untuk mengajar ...

Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah? Bagaimana untuk mengelakkan dikesan oleh penyemak imbas apabila menggunakan fiddler di mana-mana untuk membaca lelaki-dalam-tengah? Apr 02, 2025 am 07:15 AM

Cara mengelakkan dikesan semasa menggunakan fiddlerevery di mana untuk bacaan lelaki-dalam-pertengahan apabila anda menggunakan fiddlerevery di mana ...

Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Apr 01, 2025 pm 11:15 PM

Apabila menggunakan Perpustakaan Pandas Python, bagaimana untuk menyalin seluruh lajur antara dua data data dengan struktur yang berbeza adalah masalah biasa. Katakan kita mempunyai dua DAT ...

Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Bagaimanakah uvicorn terus mendengar permintaan http tanpa serving_forever ()? Apr 01, 2025 pm 10:51 PM

Bagaimanakah Uvicorn terus mendengar permintaan HTTP? Uvicorn adalah pelayan web ringan berdasarkan ASGI. Salah satu fungsi terasnya ialah mendengar permintaan HTTP dan teruskan ...

Bagaimana untuk mendapatkan data berita yang melangkaui mekanisme anti-crawler Investing.com? Bagaimana untuk mendapatkan data berita yang melangkaui mekanisme anti-crawler Investing.com? Apr 02, 2025 am 07:03 AM

Memahami Strategi Anti-Crawling of Investing.com Ramai orang sering cuba merangkak data berita dari Investing.com (https://cn.investing.com/news/latest-news) ...

Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Bagaimana secara dinamik membuat objek melalui rentetan dan panggil kaedahnya dalam Python? Apr 01, 2025 pm 11:18 PM

Di Python, bagaimana untuk membuat objek secara dinamik melalui rentetan dan panggil kaedahnya? Ini adalah keperluan pengaturcaraan yang biasa, terutamanya jika perlu dikonfigurasikan atau dijalankan ...

See all articles