1. 程式人生 > >Python基礎【函式】

Python基礎【函式】

函式

函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。
函式能提高應用的模組性,和程式碼的重複利用率。
可以根據自己的需求自行封裝程式碼塊,以便於呼叫。即為自定義函式。


函式定義的規則

  • 函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()。
  • 任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數。
  • 函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明。 - 函式內容以冒號起始,並且縮排。
  • return [表示式] 結束函式,選擇性地返回一個值給呼叫方。
  • 不帶表示式的return相當於返回 None。

    格式:

    > def 函式名(引數列表):
    函式體

    預設情況下,引數值和引數名稱是按函式宣告中定義的順序匹配起來。
    無需傳遞引數時,也可不加引數


例項:

def hello(): ##def空格後加函式名hello和()
print('hello world') ##函式內部輸出'hello world'
hello() ##呼叫定義好的函式

測試結果:

Python基礎【函式】


引數的傳遞

在 python 中,型別屬於物件,變數是沒有型別的:
可更改(mutable)與不可更改(immutable)物件
不可更改的物件:strings, tuples,numbers
可以修改的物件

:list,dict

  • 在傳遞可變物件時,函式內部對參量的改變會影響該物件
  • 在傳遞不可變物件時,函式內部對引數的改變對該物件本身無影響

例項:

def fun(a,b): ##定義函式fun
a = 'test' ##修改引數a的值
b[2] = 'test' ##修改引數b中的值
num = 'str' ##定義數值型別(不可變)
list_test = [2,3,4] ##定義列表型別(可變)
print(num,list_test) ##輸出傳遞引數之前的值
fun(num,list_test) ##呼叫函式
print(num,list_test) ##輸出傳遞引數之後的值

測試結果:

Python基礎【函式】


引數型別

  • 必需引數(位置引數):
    呼叫函式時,引數必須按照順序和對應數量傳入。
    def fun(num,age,score):
    函式體
    fun(1,18,98)     ##呼叫時按照順序且數量相同
  • 關鍵字引數:
    呼叫函式可以不按照函式宣告的順序,關鍵字引數來確定傳入的引數值。
    def fun(num,age,score):
    函式體
    fun(age=18,score=98,num=1)
  • 預設引數:
    在函式宣告時為形參設定預設值,呼叫函式未傳入引數時使用預設引數。
    def fun(num=1,age=18):
    函式體
    fun()  ##未傳引數時使用函式定義時的預設引數
  • 不定長引數:
    函式傳入引數值不定時,將多餘的引數以元組形式封裝。
    
    def fun(*num):
    函式體
    fun('hello','1','2')  ##實引數超過形引數,其餘引數以元組形式封裝,在函式中用num呼叫```


def fun(**num): ##使用可傳入字典型別的引數
函式體
fun(key1=value1,key2=value2)```

def fun(num,*,age): ##*號後面的引數必須用關鍵字傳入
函式體
fun(1,age='20')

函式的返回值

return語句

return [表示式] 語句用於退出函式,選擇性地向呼叫方返回一個表示式。
不帶引數值的return語句返回None。
如果返回多個值,會將多個值封裝成元組返回
def hello():
return('hello')
print(hello()) ##將函式作為引數呼叫時,return語句返回的值,即為函式的值
##這裡相當於print('hello')


變數作用域

程式的變數並不是在哪個位置都可以訪問的。
訪問許可權決定於這個變數是在哪裡賦值的。
變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。
Python的作用域一共有4種,分別是:

  • L (Local) 區域性作用域
  • E (Enclosing) 閉包函式外的函式中
  • G (Global) 全域性作用域
  • B (Built-in) 內建作用域
    以 L > E > G >B 的優先順序查詢:
    > x = int(2.9) # 內建作用域
    g_count = 0 # 全域性作用域
    def outer():
    o_count = 1 # 閉包函式外的函式中
    def inner():
    i_count = 2 # 區域性作用域

  • Python 中只有模組(module),類(class)以及函式(def、lambda)才會引入新的作用域
  • 其它的程式碼塊(如 if/elif/else/、try/except、for/while等)內定義的變數,在其所在作用域的其他範圍仍然生效

global和nonlocal關鍵字

  • 在內部作用域需要對全域性變數進行更改時
    須在內部作用域使用global關鍵字宣告
    > ```
    num = 1
    def fun1():
    global num # 需要使用 global 關鍵字宣告
    print(num)
    num = 123
    print(num)
    fun1()
    print(num)
  • 在內部作用域需要對外層非全域性變數進行更改時
    須在內部作用域使用nonlocal關鍵字宣告
    >```
    def outer():
    num = 10
    def inner():
    nonlocal num # nonlocal關鍵字宣告
    num = 100
    print(num)
    inner()
    print(num) # num值為100
    outer()

引數檢測

isinstance(object,classinfo)

  • 來判斷一個物件是否是一個已知的型別,類似 type()。
    • object -- 例項物件。
    • classinfo -- 可以是直接或間接類名、基本型別或者由它們組成的元組。
    • 返回值 -- 如果物件的型別與引數二的型別(classinfo)相同則返回 True,否則返回 False。

匿名函式

lambda 用來建立匿名函式。
lambda 只是一個表示式,函式體比 def 簡單很多。
lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lambda表示式中封裝有限的邏輯進去。
lambda 函式擁有自己的名稱空間,且不能訪問自己引數列表之外或全域性名稱空間裡的引數。
lambda 函式的語法只包含一個語句
lambda [arg1 [,arg2,.....argn]]:expression
>fun = lambda arg1, arg2: expression
fun( 10, 20 ) ##呼叫時函式的返回值即expression的值