函數作用域和匿名函數


一、匿名函數

- lambda # 關鍵字 和三目運算一樣,做一些簡單的函數定義,使代碼更加簡潔
    - 語法規則:
  lambda <參數>:表達式

  filter(lambda x: x>10, li)

  d = lambda a,b:a+b
  d(1,2)

    - 應用場景:

  1.簡單函數:簡單的函數可以不使用def定義一個函數,使用匿名函數即可
  2.函數調用:類似於filter、map等函數里面,可以使用匿名函數來處理
  3.提高開放效率:名函數的合理利用能夠讓那個代碼更加簡潔


二、函數作用域
    - 函數里面可以訪問函數外面的變量
    - 定義在函數里面的變量,函數外面是不能訪問的
    - 在函數里面可以訪問最外面的(不可變)變量,但是不能對它修改,但可變類型(list set dict bytearray)就可以修改
    - 函數外面定義的變量和函數里面定義的變量重名時,他們不是一個變量。函數里面的變量不影響外面的變量

- global和nonlocal
    - global
  a = 1 # 全局變量

  def yu():
    global a # global 關鍵字 聲明a是全局變量,聲明后在函數內部就可以修改這個變量
    a = a+519
    print(a)
  yu()

    -nonlocal
  def yu():
  a = 1 # 局部變量 在嵌套函數的時候會使用
    def lo():
      nonlocal a # 聲明這個a是局部變量
      a = a + 519
      print(a)
    lo()

  yu()

三、閉包

外部調用函數內層的函數:由於作用域的問題,外部不能調用內部的變量,因此需要閉包。

  def outside():

    print('外層函數')

    def inside():                #  函數里面嵌套函數

      print(‘內層函數’)

    return inside     # 返還的是內層的函數名,是個變量,通過 函數名后面加()實現這個內層函數的調用。

  a = outside()    #  這里a的值為 inside 的函數名

  a()    #   也可以是 outside()() 實現了直接調用內層函數。  
注意:

  1. 函數的名字就相當於一個變量

  2. 閉包可以得到外層函數的局部變量(通過return內層的函數名實現),是函數內部與外部溝通的橋梁。


四、遞歸和回調函數

- 遞歸:

  def sleep(a):

    if a == 5:

      return 1

    print('睡了+%s'%a)

    return sleep(a+1)+a

  print(sleep(0))   # 輸出結果為11 :0+1+2+3+4+1 和 第一個print()的內容。

- 階乘:把上例子的return中的 +a 變為*a,即可實現階乘

    return sleep(a+1)*a

  print(sleep(1))   # 輸出的數值結果變為24:1*2*3*4*1

遞歸的關鍵點:是通過返回函數調用來實現的,注意要加判斷條件終止函數調用,否則就是死循環。

 

- 回調:

回調函數本身是一個函數,只是被傳入另一個函數當中,供其調用。回調函數不一定會被調用,是否調用由被傳入函數的內部邏輯決定。

def fun_a():
print('回調函數,快來調用我')

def fun_b(fun):
fun() # 之前可加判斷條件,來實現是否啟用回調函數。
print('我自己的功能')

fun_b(fun_a)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM