1. 程式人生 > >python 函數function

python 函數function

else ack 啟動 max 都沒有 什麽事 設計 字符 ise


函數

  • 當代碼出現有規律的重復的時候,只寫一次函數實現多次使用(調用)

可使用的函數:

  • 自定義函數
  • 內置函數:文檔 https://docs.python.org/3/library/functions.html,本身內置了很多有用的函數,可以直接調用,如max(),abs()。

調用函數:

  • 要知道函數的名稱和參數
  • 參數數量和參數類型必須正確,否則報TypeError的錯誤,並且給出錯誤信息
  • 數據類型的轉換:int(),float(),str(),bool()

定義函數:

  • 定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然後在縮進塊中編寫函數體,函數的返回值用return
    語句返回。
  • 如果沒有return語句,函數執行完畢後也會返回結果,只是結果為None,就是return。
1 #自定義一個求絕對值的my_abs函數為例:
2 def my_abs(x):
3     if x >= 0:
4         return x
5     else:
6         return -x
  • 解析:如果你已經把my_abs()的函數定義保存為abstest.py文件了,那麽,可以在該文件的當前目錄下啟動Python解釋器,用from abstest import my_abs來導入my_abs()函數,註意abstest是文件名(不含.py擴展名)
  • 空函數:如果想定義一個什麽事也不做的空函數,可以用pass語句:實際上pass可以用來作為占位符
  • 參數檢查:isinstance()
#若傳入是字符‘s’上面的代碼會報錯,加入isinstance()判斷。
1
def my_abs(x): 2 if not isinstance(x, (int, float)): 3 raise TypeError(bad operand type) 4 if x >= 0: 5 return x 6 else: 7 return -x

函數的參數

#計算x的次方
def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s

1 位置參數:對應的參數傳入對應的位置,使用最多的。

如:調用時 power(5, 2)

2 默認參數:若頻繁使用某個參數可以設置為默認的值。

經常計算x2,上面的函數可寫為 def power(x, n=2) ,調用直接可寫power(5),其余情況照位置參數處理。

#是必選參數在前,默認參數在後,否則Python的解釋器會報錯

#當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作為默認參數。

#定義默認參數要牢記一點:默認參數必須指向不變對象!strNone這樣的不變對象,一旦創建,對象內部的數據就不能修改。由於對象不變,多任務環境下同時讀取對象不需要加鎖,同時讀一點 問題都沒有。我們在編寫程序時,如果可以設計一個不變對象,那就盡量設計成不變對象。

 1 #L隨調用而增加改變
 2 def add_end(L=[]):
 3     L.append(END)
 4     return L
 5 
 6 >>> add_end()
 7 [END, END]
 8 >>> add_end()
 9 [END, END, END]
10 
11 #None這個不變參數來實現
12 def add_end(L=None):
13     if L is None:
14         L = []
15     L.append(END)
16     return L

3可變參數:

可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。使用*,可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個tuple

作用:傳可變參數

#計算a2+b2+c2+...
def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

#組裝出一個list或tuple
>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84

#可變參數
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

>>> calc(1, 2)
5
>>> calc()

#已經有一個list或者tuple
nums = [1, 2, 3]
calc(*nums)
14

4 關鍵字參數:

允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict

作用:傳任意參數,以擴展函數的功能

def person(name, age, **kw):
    print( name, age,  kw)

>>> person(Michael, 30)
 Michael 30 {}

>>> person(Bob, 35, city=Beijing)
Bob 35 {city: Beijing}
#已經有的傳入
>>> extra = {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}
>>> person(‘Jack‘, 24, **extra)
name: Jack age: 24 other: {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}

5 命名關鍵字參數:

函數的調用者可以傳入任意不受限制的關鍵字參數。至於到底傳入了哪些,就需要在函數內部通過kw檢查。

#*後面的參數被視為命名關鍵字參數,接收city和job作為關鍵字參數
def person(name, age, *, city, job):
    print(name, age, city, job)

#命名關鍵字參數必須傳入參數名
>>> person(Jack, 24, city=Beijing, job=Engineer)
Jack 24 Beijing Engineer

#函數定義中已經有了一個可變參數,
def person(name, age, *args, city, job):
    print(name, age, args, city, job)

6 參數組合

參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。

def f1(a, b, c=0, *args, **kw):
    print(a =, a, b =, b, c =, c, args =, args, kw =, kw)

def f2(a, b, c=0, *, d, **kw):
    print(a =, a, b =, b, c =, c, d =, d, kw =, kw)

>>> f1(1, 2)
a = 1 b = 2 c = 0 args = () kw = {}
>>> f1(1, 2, c=3)
a = 1 b = 2 c = 3 args = () kw = {}
>>> f1(1, 2, 3, a, b)
a = 1 b = 2 c = 3 args = (a, b) kw = {}
>>> f1(1, 2, 3, a, b, x=99)
a = 1 b = 2 c = 3 args = (a, b) kw = {x: 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {ext: None}

#最神奇的是通過一個tuple和dict,你也可以調用上述函數:

>>> args = (1, 2, 3, 4)
>>> kw = {d: 99, x: #}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {d: 99, x: #}
>>> args = (1, 2, 3)
>>> kw = {d: 88, x: #}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {x: #}

小結

Python的函數具有非常靈活的參數形態,既可以實現簡單的調用,又可以傳入非常復雜的參數。

默認參數一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤!

要註意定義可變參數和關鍵字參數的語法:

*args是可變參數,args接收的是一個tuple;

**kw是關鍵字參數,kw接收的是一個dict。

以及調用函數時如何傳入可變參數和關鍵字參數的語法:

可變參數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過*args傳入:func(*(1, 2, 3))

關鍵字參數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kw傳入:func(**{‘a‘: 1, ‘b‘: 2})

使用*args**kw是Python的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。

命名的關鍵字參數是為了限制調用者可以傳入的參數名,同時可以提供默認值。

定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符*,否則定義的將是位置參數。

python 函數function