函數進階_月隱學python第11課

目錄

 

1.函數類型

2. 匿名函數

3.傳入函數(理解)

4.閉包

5.偏函數

6.變量的作用域

6.1 變量作用域的分類

6.2 變量作⽤域查找規則

6.3 全局變量和局部變量

6.4 global和nonlocal

函數填空題


1.函數類型


函數也是一種類型,我們自定義的函數就是函數對象,函數名保存了函數對象的引用(地址)

2. 匿名函數


不再使用def 函數名()這種形式定義函數,而是使⽤lambda來創建匿名函數
特點:

  • lambda只是一個表達式,函數體⽐def定義的函數簡單的多
  • lambda的函數體不再是代碼塊,⽽是⼀個表達式
  • lambda只有⼀行,運行效率很高

語法:

3.傳入函數(理解)


一個函數就可以接收另⼀個函數作爲參數,這種函數就稱之爲高階函數,也可以稱之爲傳⼊函數。可以實現通用編程,排序等複雜功能

4.閉包

我們可以在⼀個函數中再定義一個函數,在函數內部定義的函數稱之爲內部函數,內部函數只能在函數內使用,不會污染外部空間。定義內部函數的函數稱之爲外部函數,這樣的定義構成函數的嵌套

  • 內部函數只能在外部函數⾥調用,外界⽆法直接調⽤內部函數

在一個外部函數中定義了一個內部函數,內部函數⾥引⽤了外部函數的變量,並且外部函數的返回值是內函數的引用。這樣內部函數和其執⾏所需的環境變量就構成了一個閉包。
一般情況下,如果⼀個函數結束,函數的內部所有東西都會釋放掉,局部變量都會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現有⾃己的局部變量將來會在內部函數中⽤到,就把這個局部變量綁定給了內部函數,然後⾃己再結束。

 

在閉包中⽆法直接修改外部變量x的值

在python3中可以通過nonlocal關鍵字聲明⼀下x,表示這個變量不是局部變量,需要向上一層變量空間找這個變量

5.偏函數


當⼀個函數有⼤量參數,調⽤的時候非常不方便,可以使⽤偏函數技術,將⼀些參數固定(給默認值),達到簡化函數調用的⽬的。

6.變量的作用域


程序中的變量並不是在任意的位置都可以隨意訪問,在哪里可以訪問取決於這個變量的作⽤域,變量的作用域指的是變量在那段代碼中可以使⽤,可以使用變量的那段代碼就是變量的作用域。在python中,只有函數/類/模塊才引⼊作⽤域,if/elif/else , while/for,try/except等並不會引⼊新的作用域


6.1 變量作用域的分類


按照作用域劃分,可以分爲:

  • L: Local,局部作用域
  • E: Enclosing,閉包作用域【閉包的外部函數中定義的變量】
  • G: Global,全局作用域 在所有函數外定義的變量
  • B: Built-in,內建作用域【內置作用域】
     

6.2 變量作⽤域查找規則


以 L --> E --> G -->B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,最後到內建作用域中找。


6.3 全局變量和局部變量


定義在函數內部的變量擁有⼀個局部作用域,被稱爲局部變量
定義在函數外面的變量擁有⼀個全局作⽤域,被稱爲全局變量
局部變量和全局變量同名,局部優先

6.4 global和nonlocal

函數填空題
 

1. 函數定義
def test1(a,b):
      return a + b
則test1(3,b=5)的值爲___8______; test1(b=10,a=2)的值爲
______12___。

2. 函數定義:
def test(a,b=2,*args):
      return a + b + sum(args)
則test(1,2,3,4,5)的值爲__15_________; test(1)的值爲:
_____3______; test(*[3,2,1,5])的值爲: __11______;
test(*{1:2,3:4,5:6}.values())的值爲___12____。

3. 函數定義:
def test(*args, **kwargs):
      tmp = list(args) + list(kwargs.values())
return sum([tmp[x] for x in range(len(tmp) )if not(x % 2) )]
則 t e s t ( a = 3 , b = 4 , c = 5 ) 的 值 : _ _8 _ _ _ _ ;
test(**{1:2,3:4,5:6,7:8})的值爲: ___無法賦值______;
test(1,3,5,7,a=10,b=3)的值爲: ___16______。

 

4. 函數定義:
def link(*args):
     args = [x if isinstance(x,str) else str(x) for x in args]
     return ‘’.join(args)
則lin k (1 ,2 ,3 )的值爲: __123______; lin k (‘北京’,’python’,’1902’)的值爲__北京python1902________。

5. 函數定義:
def demo(*args):
     return args * 2
則sum(demo(1,2,3))的值爲____12____; len(demo())等於___0______。

6. 函數定義爲:
def judge(a):
    if a > 0:
        return True
則print(“兔⼦” if judge(-1) else ‘狗’)輸出: __狗_____

7. 已知: pf = lambda a,b=2:a + b; 則pf(2) = _4_____;
pf(3,4) = __7____; pf(b=3,a=5) = ___8______;

8. 已知:
def demo(a):
    a = 5
則執⾏a = 10; demo(a);後a = _10____;

9. 已知:
def demo(a):
for key in a:
a[key] += 10
則a = {1:10,2:20,3:30};則執⾏demo(a)後, a =____{1: 20, 2: 30, 3: 40}___________。


 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章