1. 程式人生 > >day5 函式和引數

day5 函式和引數

函式就是最基本的一種程式碼抽象的方式

定義一個函式使用def語句

def my_abs(x):
  if x >= 0:
    return x
  else:
    return -x

定義一個什麼事也不做的空函式(可以用來作為佔位符)

def nop():

  pass

資料型別檢查可以用內建函式 isinstance()實現:

def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x

定義函式時,需要確定函式名和引數個數;
如果有必要,可以先對引數的資料型別做檢查;
函式體內部可以用 return 隨時返回函式結果;
函式執行完畢也沒有 return 語句時,自動 return None。
函式可以同時返回多個值,但其實就是一個 tuple。

位置引數

計算平方,立方,4次方。。。。

def power(x, n):
    s = 1
    while n > 0:
          n = n - 1
          s = s * x
     return s
a = power(5, 2)
print(a)

設定預設引數時,有幾點要注意:
一是必選引數在前,預設引數在後,否則 Python 的直譯器會報錯
(思考一下為什麼預設引數不能放在必選引數前面);
二是如何設定預設引數。
當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。
變化小的引數就可以作為預設引數。
使用預設引數有什麼好處?
最大的好處是能降低呼叫函式的難度。

三預設引數必須指向不變物件

預設引數

def enroll(name, gender, age=6, city='Beijing'):
   print('name:', name)
   print('gender:', gender)
   print('age:', age)
   print('city:', city)
>>> enroll('Sarah', 'F')
name: Sarah
gender: F
age: 6
city: Beijing

呼叫的時候,既可以按順序提供預設引數,比如調
用 enroll('Bob', 'M', 7)

可以不按順序提供部分預設引數。當不按順序提供部分預設引數時,
需要把引數名寫上。比如呼叫 enroll('Adam', 'M', city='Tianjin')

可變引數

在函式內部自動組裝成list或tuple

給定一組數字 a,b,c……,請計算 a的平方加b的平方加c的平方.....

方法1 list或tuple

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, 3)
14
>>> calc(1, 3, 5, 7)
84

已經有一個 list 或者 tuple,要呼叫一個可變引數

>>> nums = [1, 2, 3]
>>> calc(*nums)
14

關鍵字引數

充許傳入0個或任意個含引數名的引數,在函式內部自動組裝成dict

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

>>> person('Michael', 30)
name: Michael age: 30 other: {}
也可以傳入任意個數的關鍵字參
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

和可變引數類似,也可以先組裝出一個 dict,然後,把該 dict 轉換為關
鍵字引數傳進去:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
當然,上面複雜的呼叫可以用簡化的寫法:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

注意kw獲得的dict是extra的拷貝,kw的改動不會影響到函式外的extra

命名關鍵字引數

限制關鍵字引數的名字,就可以用命名關鍵字引數例如,只接
收 city 和 job 作為關鍵字引數
def person(name, age, *, city, job):
    print(name, age, city, job)
和關鍵字引數**kw 不同,命名關鍵字引數需要一個特殊分隔符*,*後面
的引數被視為命名關鍵字引數,命名關鍵字引數必須傳入引數名。

命名關鍵字引數可以有預設值,從而簡化呼叫:
def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
由於命名關鍵字引數 city 具有預設值,呼叫時,可不傳入 city 引數:
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer

引數定義的順序必須是:必選引數、預設引數、可變引數/命名關鍵字引數和關鍵字引數。