1. 程式人生 > >Python函數之進階二

Python函數之進階二

python 返回值 引用 rst pos 容器 類對象 print pan

一、函數名的本質

函數名本質上就是函數的內存地址。

1、可以被當做值或變量引用

def func():
    print(111)

print(func) #<function func at 0x00000218A911AB70> --函數在內存中的地址
f = func    #將其傳給變量f
print(f)    #<function func at 0x00000279A5A6AB70>
f()         #111

2、函數可以被當做容器類型的元素存儲

#將其當做容器存儲在列表中
def func1():
    print(‘func1‘)
def func2():
    print(‘func2‘)
def func3():
    print(‘func3‘)

lis = [func1, func2, func3]
lis[0]()      #func1
lis[1]()      #func2
lis[2]()      #func3

3、可以當做函數的參數和返回值

#當做參數和返回值
def func1():
    print(‘func1‘)

def func(argv):
    argv()          
    return argv     #func1作為返回值

f = func(func1)     #func1作為參數
f()
#輸出
func1
func1

總結:

# 1、函數名的內存地址--print(函數名).
# 2、函數名可以賦值給其他變量.
# 3、函數名可以當做容器類的元素.
# 4、函數名可以當做函數的參數.
# 5、函數名可以當做函數的返回值.
# 學名:第一類對象(first-class object)
# 總之:可以把函數名當做變量來用

二、閉包

在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包(即:內層函數,對外層函數(非全局)的變量的引用)。

#閉包函數的基本用法
def func():
    name = ‘eva‘
    def inner():
        print(name)
    return inner

f = func()
f()         #eva

檢測閉包函數的公共屬性:__closure__

#閉包函數
#輸出結果如果有 cell 就是閉包函數
def wrapper():
    name = ‘是閉包‘
    def inner():
        print(name)             #是閉包
    inner()
    print(inner.__closure__)    #(<cell at 0x000001945CE07588: str object at 0x000001945CE06B70>,)
wrapper()

# 非閉包函數
#輸出結果如果是 None 就不是閉包函數
name = ‘不是閉包‘
def wrapper():
    def inner():
        print(name)             #不是閉包
    inner()
    print(inner.__closure__)    #None
wrapper()

Python函數之進階二