7.匿名函數、函數做用域、遞歸函數、閉包

      匿名函數       

filter(lambda x: x>10, li)閉包

語法規則: lambda 參數 : 表達式函數

簡單的函數,能夠不用使用def定義一個函數,使用匿名函數便可性能

函數調用,相似於filter、map等函數裏面,可使用匿名函數來處理spa

提升開發效率,匿名函數的合理利用可以讓那個代碼更加簡潔code

print((lambda x,y:x+y)(11,22))

33
f = lambda x,y:x+y
print(f(11,22))

33
li = [1,3,34,2,4,6,86,4,4]
# def func(n):
#     if n>4:
#         return n
aa = filter(lambda n:n>4,li)
print(list(aa))

[34, 6, 86]

    函數做用域     

1、示例

外部不能訪問函數內部變量:blog

def func():
    a = 222   #局部變量
    print('函數裏邊:',a)
    return a
func()
print('函數外面:',a)

函數裏邊: 222
Traceback (most recent call last):
  File "/home/pyvip/projects/home/pyvip/projects/基礎班/複習.py", line 7, in <module>
    print('函數外面:',a)
NameError: name 'a' is not defined

函數裏面不能修改函數外部變量:遞歸

a = 11        #全局變量
def func():
    # global a
    a += 1  #局部變量
    print('函數裏邊:',a)
    return a
func()
print('函數外面:',a)

  File "/home/pyvip/projects/home/pyvip/projects/基礎班/複習.py", line 7, in <module>
    func()
  File "/home/pyvip/projects/home/pyvip/projects/基礎班/複習.py", line 4, in func
    a += 1  #局部變量
UnboundLocalError: local variable 'a' referenced before assignment

函數內部可以訪問函數外部變量:ip

a = 11        #全局變量
def func():
    # a = 222   #局部變量
    print('函數裏邊:',a)
    return a
func()
print('函數外面:',a)

函數裏面和函數外部變量名相同:內存

a = 11        #全局變量
def func():
    a = 222   #局部變量
    print('函數裏邊:',a)
    return a
func()
print('函數外面:',a)

函數裏邊: 222
函數外面: 11

、global 和 nonlocal

1.global 

a = 11        #全局變量
def func():
    global a         #聲明a是個全局變量
    a += 1  #局部變量
    print('函數裏邊:',a)
    return a
func()
print('函數外面:',a)

函數裏邊: 12
函數外面: 12

2.nonlocal

a = 11        #全局變量
def func():
    # global  a         #聲明a是個全局變量
    a = 666  #局部變量
    print('外層函數func:',a)
    def fun1():
        nonlocal a                 #聲明a的修改對外層函數有效
        a = 999
        print('內層函數fun1:,a)
    fun1()
func()
print('函數外面:',a)

外層函數func: 666
內層函數fun1: 999
函數外面: 11

     遞歸函數       

 遞歸中能夠函數自身調用自身,可是使用時相似於條 件循環同樣,要有遞歸的終止條件作用域

使用遞歸時,經常可讓代碼更加簡潔 遞歸會佔用比較多的內存,當遞歸次數比較多時,性能就會下降, 所以不建議多使用遞歸

def fun(n):
    if n==1:
        return n
    else:
        return n*fun(n-1)

a = fun(6)
print(a)


720

          閉包           

閉包是函數裏面嵌套函數,外層函數返回裏層函數,這種狀況稱之爲閉包 閉包是概念,不是某種函數類型,和遞歸的概念相似,就是種特殊的函數調用 閉包能夠獲得外層函數的局部變量,是函數內部和函數外部溝通的橋樑,大多數時候和和裝飾器一塊兒使用

1、內嵌函數

def fun():

    def fun1():
        print('嵌套的內層函數')
    print('-----調用了fun-----')

    return fun1

result = fun()
print(result)

2、閉包

def fun1():
    a = 1
    def fun2():                                #1.函數裏邊嵌套一個函數
        print('=====fun2=======',a)            #2.外層函數返回的是內層函數的函數名
    return fun2                                #3.內層函數有引用外層函數的變量

a = fun1()
a()


=====fun2======= 1
相關文章
相關標籤/搜索