Python閉包

閉包

	學習閉包前先要知道

	函數名的運用
		函數名就是一個變量,可是他是一個特殊的變量,與括號配合能夠執行函數的變量。

		1.函數名的內存地址

			def func():
    			print('hello')
			print(func)	

			結果:
				<function func at 0x10ef39ea0>

		2.函數名能夠賦值給其餘變量

			def func():
			    print("hello")
			print(func)
			a = func # 把函數當成一個變量賦值給另外一個變量
			a() #函數調用func()

			結果:
				<function func at 0x10a5a5ea0>
				hello	

		3.函數名能夠當作容器類的元素

			def func1():
			    print("呵")
			def func2():
			    print("呵")
			def func3():
			    print("呵")
			def func4(): 
			    print("呵")
			lst = [func1, func2, func3]
			for i in lst:
			    i()

			結果:
				呵
				呵
				呵

		4.函數名能夠當作函數的參數

			def func():
			    print("吃了了麼")
			def func2(fn):
			    print("我是func2")
			    fn() # 執行傳遞過來的fn
			    print("我是func2")
			func2(func) # 把函數func當成參數傳遞給func2的參數fn.

			結果:
				我是func2
				吃了了麼
				我是func2

		5.函數名能夠做爲函數的返回值

			def func_1():
			    print("這⾥是函數1")
			    def func_2():
			        print("這⾥是函數2")
			    print("這⾥是函數1")
			    return func_2
			fn = func_1() # 執行函數1. 函數1返回的是函數2, 這時fn指向的就是上⾯函數2
			fn() # 執⾏上面返回的函數

			結果:
				這⾥是函數1
				這⾥是函數1
				這⾥是函數2

閉包:
	閉包就是內層函數對外層函數(非全局)的變量的引用。叫閉包。


	咱們能夠使用__closure__來檢測函數是不是閉包. 
	使用函數名.__closure__返回cell就是閉包. 返回None就不是閉包

	def outer():
		name = "我愛你中國"
		# 內部函數
		def inner():
		    print(name)
		return inner
	fn = outer() # 訪問外部函數, 獲取到內部函數的函數地址
	fn() # 訪問內部函數
	print(fn.__closure__)

	def fu():
	    print('e')
	fu()
	print(fu.__closure__)

	結果:
		我愛你中國
		(<cell at 0x104994708: str object at 0x1049ee2a0>,)
		e
		None


	 def outer():
	    name = "我愛你中國"
	    # 內部函數
		def inner():	
	        print(name)
	    return inner
	fn = outer() # 訪問外部函數, 獲取到內部函數的函數地址 
	fn() # 訪問內部函數

	結果:
		我愛你中國

	def func1():
    	def func2():
        	def func3():
            	print("嘿嘿")
        	return func3
    	return func2
	func1()()()

	結果:
		嘿嘿

	閉包好處:
		因爲咱們在外界能夠訪問內部函數. 那這個時候內部函數訪問的時間和時機
		就不必定了, 由於在外部, 咱們能夠選擇在任意的時間去訪問內部函數. 
		這個時候. 想想. 咱們以前說過, 若是一個函數執行完畢. 則這個函數
		中的變量以及局部命名空間中的內容都將會被銷燬. 在閉包中. 若是變量被
		銷燬了. 那內部函數將不能正常執行.因此,python規定. 若是你在內部函
		數中訪問了外層函數中的變量. 那麼這個變量將不會消亡. 將會常駐在內存中.
		也就是說. 使⽤用閉包, 能夠保證外層函數中的變量在內存中常駐.
相關文章
相關標籤/搜索