Python 函數之嵌套、閉包

1.函數的嵌套調用:(函數裏面調用函數)

def max(a,b):
    return a if a>b else b

def the_max(x,y,z):
    c = max(x,y) #函數的嵌套調用
    return c if c>z else z

print(the_max(1,2,3))
##
3

2.三元運算

格式:html

變量 = 條件返回True的結果 if 條件 else 條件返回False的結果網絡

條件:1,必需要有結果。2,必需要有if。3,只能是簡單的結果數據結構

##嵌套多個函數也能夠
def max1(x,y):
    m  = x if x>y else y
    return m

def max2(a,b,c,d):
    res1 = max1(a,b)
    res2 = max1(res1,c)
    res3 = max1(res2,d)
    return res3

max2(23,-7,31,11)
# 31

3.函數嵌套定義的執行流程(定義的函數若是不調用就不執行)

##inner閉包

 

 ##在函數嵌套定義時,內部函數能夠使用外部函數的變量app

def outer():
    a = 1#外部函數的變量
    def inner():
        print(a)#內部函數能夠使用外部函數的變量
        print("inner")
    inner()
outer()
#1
#inner

##三層嵌套:函數

def outer():
    a = 1
    def inner1():
        b = 2
        print(a)
        print("inner1")
        def inner2():
            print(a,b)
            print("inner2")
        inner2()
    inner1()
outer()

###
1
inner1
1 2
inner2

關鍵字:nonlocal

  1.外部必須有這個變量(對全局變量無效)

  2.在內部函數聲明nonlocal變量以前不能再出現同名變量

  3.內部修改這個變量若是想在外部有這個變量的第一層函數中生效(只是對最近的一層的局部變量有效)

def f1():
    a = 1
    def f2():
        nonlocal a
        a = 2
    f2()
    print('a in f1 : ',a)

f1()
#a in f1 :  2
def f1():
    a = 1
    def f2():
        #nonlocal a
        a = 2
    f2()
    print('a in f1 : ',a)

f1()
#a in f1 :  1

4 函數的本質(函數名就是內存地址)

第一類對象:(能夠賦值、能夠做爲參數、能夠做爲返回值)url

一、函數名是能夠賦值的spa

def func1():
    print(123)

func2 = func1 #函數名能夠賦值
func2()

L = [func1,func2] #函數名能夠做爲容器數據類型
print(L)
for i in L: 
    i()

####
123
[<function func1 at 0x000001BB8BE42E18>, <function func1 at 0x000001BB8BE42E18>]
123
123

 

二、函數名是能夠做爲一個數據結構的元素(能夠做爲容器數據類型的元素)code

三、函數名是能夠做爲一個函數的參數htm

##函數名能夠做爲參數來傳遞
def f1():
    print("aaa")
def f2(f):
    f()
f2(f1)
##aaa

四、函數名能夠做爲函數的返回值

def f1():
    print("aaa")
def f2(f):
    f()
    return f  #函數名作爲返回值給f3
f3 = f2(f1)
f3()
###
aaa
aaa

5.閉包

#閉包:首先是嵌套函數,而且內部函數調用外部函數的變量
def outer():
    a = 1
    def inner():
        print(a)
    print(inner.__closure__)

outer()

#(<cell at 0x000002567BB095B8: int object at 0x0000000055A06C10>,)

 

##閉包的標準用法:

def outer():
    a = 1
    def inner():
        print(a)
    return inner

inn = outer()
inn()

# 1

嵌套閉包:
def wrapper():
    money = 1000
    def func():
        name = 'eva'
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper()
i = f()
i()
##
eva 1000

##判斷閉包函數的方法__closure__

#輸出的__closure__有cell元素 :是閉包函數
def func():
    name = 'eva'
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f = func()
f()

#輸出的__closure__爲None :不是閉包函數
name = 'span'
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f2 = func2()
f2()
##
None

##閉包函數獲取網絡應用

###############
from urllib.request import urlopen

def get_url():
    url = "http://www.xiaohua100.cn/index.html"
    def get():
        return urlopen(url).read()
    return get

get_func = get_url()
content = get_func()
print(content)

##閉包的好處:在調用內部函數的時候不用重複的生成外部的變量。(節省時間)

相關文章
相關標籤/搜索