27.函數(6)----閉包

1.初識閉包

閉包全稱是閉包函數,由外函數和內函數構成
閉:指該函數存在內嵌函數,返回值是內嵌函數;
包:外函數將內函數包起來形成一個’包’,內函數這個’包’引用外函數的名稱
閉和包缺一都不能叫閉包函數。

ps: 內嵌函數.__ closure __如果有值,則他和外部函數組成閉包,如果爲None,則不是閉包

閉包函數的基本寫法:

def outer():
	x  外部變量x
	def inner():
		引用外部變量x
		xxxx
	return inner

示例代碼1:

def func():
	x = 1
	def a():
		print(x)
	print(a.__cloure__)
	return a
func()	

首先a是func內嵌函數,func返回了a,滿足了'閉',其次a引用了他外層作用域(func內部)的變量x,滿足了'包',所以func是閉包函數

結果爲:
在這裏插入圖片描述
示例代碼2:

x = 1
def func():
	def a():
		print(x)
	print(a.__closure__)
	return a
func()

首先a是func內嵌函數,func返回了a,滿足了'閉',但是a中並沒有引用func內部的變量,不滿足'包',所以func不是一個閉包函數

結果爲:
在這裏插入圖片描述

2.閉包應用

1.保護局部變量

def outer():
	x = 1
	pritn(id(x))
	def inner():
		print(id(x))
	return inner
outer()()

結果如下:
在這裏插入圖片描述
我們知道函數調用結束,會將函數內部的變量給釋放掉,但是形成閉包之後,外部函數的變量被內嵌函數引用了,所以外部函數所處的名稱空間不會被釋放掉,而是繼續存在內存中,這樣就可以保護變量,常駐內存。

2.給函數體傳參
一般給函數體傳參需要給函數加形參,但是使用閉包可以在不給函數添加形參的情況下使用參數:

def func(x,y):
    print(x,y)
func(1,2)					結果是:1,2


def outer(x,y):
    def func():
		print(x,y)			
    return func
func = outer(1,2)
func()						結果是1,2

3.裝飾器(以後文章會講)
這是閉包最經典的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章