天天看點

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

目錄

  • 一、函數概述
  • 二、函數的建立和調用
  • 三、變量作用域
  • 1.局部變量
  • 2.全局變量
  • 四、函數參數傳遞
  • 1.形參及實參
  • 2.參數檢查
  • 五、四種參數類型
  • 1.必選參數
  • 2.預設參數
  • 3.可變參數
  • 4.關鍵字參數
  • 六、匿名函數
  • 七、遞歸函數
  • 練習

一、函數概述

  • 如果在開發程式時,需要某塊代碼多次,為了提高編寫的效率以及代碼的重用,是以把具有獨立功能的代碼塊組織為一個小子產品,這就是函數。

我們已經接觸過多個函數,比如 input() 、print()、range()、len() 函數等等,這些都是 Python 的内置函數,可以直接使用。程式設計語言中的函數,都可以用下圖概括:

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
  • 從實作函數的角度來看,其至少需要想清楚以下 3 點:

    函數需要幾個關鍵的需要動态變化的資料,這些資料應該被定義成函數的參數。

    函數需要傳出幾個重要的資料(就是調用該函數的人希望得到的資料),這些資料應該被定義成傳回值。

    函數的内部實作過程

二、函數的建立和調用

def get_max(num1,num2):
    result = num1 if num1 > num2 else num2
    return result
max_num = get_max(30,80)
print(max_num)
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

定義函數,也就是建立一個函數,可以了解為建立一個具有某些用途的工具。定義函數需要用 def 關鍵字實作

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

定義一個什麼事也不做的空函數,可以用 pass 語句;pass 可以用來作為占位符,還沒想好怎麼寫函數的代碼,就可以先放一個 pass ,讓代碼能運作起來。

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

調用函數也就是執行函數。如果把建立的函數了解為一個具有某種用途的工具,那麼調用函數就相當于使用該工具。

函數調用的基本文法格式: 函數名([形參值])

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
  • 所謂“傳回值”,就是程式中函數完成一件事情後,最後給調用者的結果。沒有傳回值,預設傳回None
  • 從理論上說,不用函數,也能夠程式設計,我們在前面已經寫了程式,就沒有寫函數,當然,用python的内建函數姑且不算了。現在之是以使用函數,主要是:

    降低程式設計的難度(分而治之的思想)

    代碼重用。避免了重複勞動,提供了工作效率。

三、變量作用域

1.局部變量

  • 局部變量,就是在函數内部定義的變量
  • 不同的函數,可以定義相同的名字的局部變量,但是各用個的不會産生影響
    python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
    python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

2.全局變量

  • 如果一個變量,既能在一個函數中使用,也能在其他的函數中使用,這樣的變量就是全局變量。
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

global的本質是聲明可以修改全局變量的指向, 即變量可以指向新的資料。

1). 不可變類型的全局變量: 指向的資料不能修改, 不使用global時無法修改全局變量。

2). 可變類型的全局變量: 指向的資料可以修改, 不使用global時可以修改全局變量。

四、函數參數傳遞

1.形參及實參

  • 定義時小括号中的參數,用來接收參數用的,稱為 “形參”
  • 調用時小括号中的參數,用來傳遞給函數用的,稱為 “實參”

其中,(num1,num2)是形參,(100,211)是實參

def get_max(num1,num2):
    return num1 if num1 > num2 else num2
result = get_max(100,211)
print((result))
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

2.參數檢查

調用函數時,如果參數個數不對,Python 解釋器會自動檢查出來,并抛出 TypeError;

  • 如果參數類型不對,Python 解釋器就無法幫我們檢查。
  • 資料類型檢查可以用内置函數 isinstance 實作
def get_max(num1:int,num2:int)->int:
    return num1 if num1 > num2 else num2
result = get_max('jia',211)
print((result))
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
def get_max(num1:int,num2:int)->int:
    if isinstance(num1,int) and isinstance(num2,int):
        return num1 if num1 > num2 else num2
    else:
        return 0
result = get_max('jia',211)
print((result))
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

五、四種參數類型

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

1.必選參數

  • 必須要傳遞的參數

形參要求了兩個參數,而實參就不能是一個,必須是兩個,否則報錯!

2.預設參數

  • 預設參數可以降低調用函數的難度。
  • 預設函數容易出錯點: 可變參數不能作為預設參數。
def pow(x,y=2):
    return x ** y
result = pow(2)
print(result)
result = pow(2,3)
print(result)
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

3.可變參數

  • 可變參數就是傳入的參數個數是可變的,可以是 1 個、2 個到任意個,還可以是 0 個。*args - 實際上存進去是一個元組
def my_sum(*args):
    return sum(args)
result = my_sum(1,2,3,4,5,6)
print(result)
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

4.關鍵字參數

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
def enroll(name,age=18,*city,**kwargs):
    print(f"""
        haha
    1.name:{name}
    2.age:{age}
    3.city:{city}
    4.others:{kwargs}
    """)
enroll('user1',sport='basketball',english='cet4',gender='man')
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

六、匿名函數

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
get_max = lambda num1,num2:num1 if num1>num2 else num2
print(get_max(10,244))

pow = lambda x,y=2: x ** y
print(pow(2))
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

七、遞歸函數

  • 已知: 函數可以調用函數。結論: 一個函數在内部調用自己本身,這個函數就是遞歸函數。
    python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
def f(n):
    if n == 1:
        return 1
    return n * f(n-1)
print(f(4))
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

斐波那契數列:

def fib(n):
    if n == 1 or n == 2:
        return 1
    return fib(n-1) + fib(n-2)
print(fib(6))
           

練習

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

解體思路:

python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習
nums = [0,7,0,2]
nums.sort(key=lambda num:1 if num==0 else 0)
print(nums)
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習

變形:偶數在左,奇數在右

nums = [0,7,0,2]
nums.sort(key=lambda num:0 if num%2==0 else 1)
print(nums)
           
python6——函數(參數、匿名函數、遞歸函數)一、函數概述二、函數的建立和調用三、變量作用域1.局部變量2.全局變量四、函數參數傳遞1.形參及實參2.參數檢查五、四種參數類型1.必選參數2.預設參數3.可變參數4.關鍵字參數六、匿名函數七、遞歸函數練習