Python函式系列之巢狀及閉包(二)

2021-09-27 05:14:22 字數 1425 閱讀 2778

在python程式語言中,在函式體內置立另外乙個函式(物件,因為python一切皆物件,函式其實也是物件)是完全合法的,這種函式叫做內部/巢狀函式。

例子:

# coding : utf-8

def outer():

def inner():

print("is inner method")

print("is outer method")

inner()

#呼叫outer函式

outer()

#呼叫outer()的內部函式,報錯

# inner()

執行結果:

is outer method

is inner method

inner()   #呼叫inner()時,出現如下錯誤

nameerror: name 'inner' is not defined

何為閉包?

如果在乙個內部函式裡,對在外部作用域(不是全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure)

說的明了一點就是:在內部函式中,引用了外部函式的自由變數

閉包的作用:

閉包有兩種呼叫方式:

在內部直接呼叫

返回函式名稱

e.g1.在內部直接呼叫

# -*- coding: utf-8 -*-

def outer(name):

def inner(name):

# name = "mr.zhang"  #這裡的name值會覆蓋呼叫outer函式實參的值,這是涉及變數在函式作用域的範圍

print("sub method :%s" %name)

# 使用__closuer__內建屬性來判斷是否是乙個閉包,返回位址,則是,返回none,則不是閉包函式

print(inner.__closure__)

inner(name)  #在內部直接呼叫

outer("guido")

執行結果:

sub method :guido

(,)

e.g

2.返回函式名稱

# -*- coding: utf-8 -*-

def sumer(num = 0):

count = [num]

def add():

count[0] += 1

return count[0]

return add

f  = sumer(3)

print(f())

print(f())

print(f())

執行結果:

456

python函式巢狀閉包 閉包與巢狀函式

沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...

Python巢狀函式 閉包

python中乙個與眾不同的語法就是可以巢狀函式,所謂巢狀,並不像其他語言中的在乙個函式中呼叫另乙個函式,而是在定義乙個函式的時候,函式體裡還能定義另乙個函式。內函式可以訪問外函式的作用域,這就是 python基礎教程 p105裡 它帶著它的環境 和相關的區域性變數 及 由於python的巢狀作用域...

python函式之高階 函式巢狀,命名空間,閉包

目錄2 函式命名空間與查詢順序 二 命名空間名字的查詢順序 3 函式作用域 4 函式的引數傳遞都是值拷貝 5 閉包函式 一 什麼是函式巢狀在乙個函式內又定義了另外乙個函式二 函式定義def foo def bar print from bar bar foo 這個是通過foo函式呼叫裡面的bar函式...