1. 程式人生 > 實用技巧 >python筆記(3)---函式(1)

python筆記(3)---函式(1)

函式以及函式使用的注意事項(1)

目錄

函式的基本定義方式

在python中定義一個函式的方式的模板如下:

def fun_name(arg):
    return value

其中必須寫的是def相當於英文的definite(定義)的意思,直接可以理解為定義一個名為fun_name的函式,其中函式的引數是arg,也可以不只是一個值,可以是多個值,用逗號分割符隔開,返回一個value

指定引數的位置和引數的初始化方式

在python中假如你定義了一個函式:

def fun(a,b):
    print(a,b)
a=10
b=20
print(fun(a,b))

在上面的函式中分析一下執行過程如下:首先你定義了一個名稱為fun的函式,這個函式有兩個引數:a,b,但是沒有返回值:所以最底下的print(fun(a,b))執行完成後輸出列印的是None

引數的預設值

依舊是上面的程式碼 我們考慮下面這樣的情況:

def fun(a,b=20):
    print(a,b)

a=20
print(fun(a))

觀察和上面的程式碼不同的地方是我們給引數b增加了一個預設的值,這個預設值可以指定任何的型別就像命名一樣,但是有一個潛規則:指定預設值的引數必須在不指定預設值的引數的後面

,上面的函式輸出是20,20
可以採用只輸入沒有指定預設值的引數就像上面那樣,也可以輸入兩個引數像這樣:

fun(10,12)
#也可以
fun(a=10,b=12)
fun(b=12,a=10)
#用引數的名字指定引數的值

這樣a的值初始化為10,b的預設值20被覆蓋掉變為12進入到函式中

指定位置的引數傳遞方式

在python3.8中新加入了一種指定位置傳引數的方式,通俗的來講,就是傳遞引數的時候只能按照引數的順序進行傳遞,不能按照引數的名字進行傳遞引數也就是說不能使用上面指定的fun(a=10,b=12)的方式進行傳遞引數,只能fun(10,12)的進行傳遞,要想讓函式中的引數是這樣的規則進行呼叫,初始化函式的語法應該如下:

def fun(a,b,/,c): #在'/'符號之前的所有引數都被設定為按位置傳參
    #在'/'之後的引數可以使用fun(1,1,12)(c=12),也可以使用fun(1,1,c=12)的方式
    print(a,b,c)
指定引數的傳遞方式

在上面呼叫函式的例子中有一種呼叫的格式是fun(a=10,b=12)的方式,這種方式就是指定引數的傳遞,因為用到了引數名字去指定引數的值,在指定引數的傳遞中
你可以不考慮引數的位置因素,例如fun(a=10,b=12)和fun(b=12,a=10)是相同的效果的傳遞和函式呼叫
如何在函式中使用這樣的規則侷限於一部分的引數:

def fun(*,a,b): #在引數之前用符號'*'表示之後的引數都要按照引數傳遞
    print(a,b)
fun(a=1,b=3)#正確
fun(b=3,a=1)#正確
fun(1,3)#錯誤

Question1:說說為什麼上面的fun(1,3)是錯誤的?

小結:

對於一個函式如下

def fun(a,b,/,c,d,*,e,f):
    print(a,b,c,d,e,f)

對於引數a,b而言我們知道引數a,b是按照位置傳遞的引數,而e,f是按照引數進行傳遞的引數,那麼c,d呢?
c,d是既能按照引數傳遞也能按照位置傳遞的引數,也就是說你可以直接fun(1,2,3,4,e=5,f=6)的初始化,也可以
fun(1,2,c=3,d=4,e=5,f=6)的進行初始化,兩種規則都適合使用

函式的返回值

函式的返回值通常來講只有一個,緊跟在return關鍵字之後:

def fun(a):
    return a
#a可以是任何物件(list tuple 字典 字串)以及任何的資料型別 

如果函式沒有寫返回值的話,那麼預設的返回值是None

Question2 :如何在函式中返回多個值?寫出程式碼檢驗你的想法?

函式中的函式(子函式):

先看下面的程式碼:

def fun():
    def subfun1(x):
        print(x)
    return subfun1
f=fun()
print(f(1))

分析:考慮上面的函式fun()我們定義了一個subfun1(x)的函式,並且呼叫這個函式之後將subfun1的函式座位返回值返回
然後用f接受這個返回值也就是說此時f=subfun(x)的函式f是這個函式的第二個名字,通過f(1)呼叫這個函式,print(1)進行輸出列印

理論上來講子函式可以定義任意多個,對於變數的作用域的問題:

def fun():
    x1=10
    def subfun1(x):
        x2=12
        x1=x1+1#錯誤,不可以使用外部的塊的內容 
    x2=x2+1#錯誤 不能使用子函式塊的內容
    return subfun1

也就是說子函式和外部的函式之間是彼此獨立的不可以互相溝通

lambda函式

lambda函式作為一種簡單的使用的方式,有時候可以當成一種規則的去使用:在有的python的內建函式中可以傳遞lamda函式作為引數
比如:排序 對映 之類的函式(sorted(),map())都可以傳遞一個lambda函式
lambda函式有時候也叫做匿名函式

定義方式如下:

f=lambda x,y:x*y #呼叫方式為
f(1,2) #x=1 y=2 返回1*2
# lambda arg1,arg2...:函式體
#首先寫一個lambda 緊接著是引數列表 arg1,arg2.... 在:後跟的是函式體

使用場景

L=[1,1,2,3,4]
print(sorted(L,key=lambda x:abs(3-x)))

按照L中的值和3的距離的大小進行排序,key是一個僅按照引數傳遞的引數

list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

對列表[1, 2, 3, 4, 5, 6, 7, 8, 9]中的值都進行x*x的操作