基本格式:def powers(x,n = 7):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print(powers(5))
默認參數可以簡化函數的調用。設置默認參數時,有幾點要注意:
一是必選參數在前,默認參數在后,否則Python的解釋器會報錯
二是如何設置默認參數。
當函數有多個參數時,把變化大的參數放前面,變化小的參數放后面。變化小的參數就可以作為默認參數。
使用默認參數有什么好處?最大的好處是能降低調用函數的難度。
舉個例子,我們寫個一年級小學生注冊的函數,需要傳入name和gender兩個參數:
def enroll(name, gender):
print('name:', name)
print('gender:', gender)
這樣,調用enroll()函數只需要傳入兩個參數:
>>> enroll('Sarah', 'F')
name: Sarah
gender: F
如果要繼續傳入年齡、城市等信息怎么辦?這樣會使得調用函數的復雜度大大增加。
我們可以把年齡和城市設為默認參數:
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')
可見,默認參數降低了函數調用的難度,而一旦需要更復雜的調用時,又可以傳遞更多的參數來實現。無論是簡單調用還是復雜調用,函數只需要定義一個。
當不按順序提供部分默認參數時,需要把參數名寫上。比如調用enroll('Adam', 'M', city='Tianjin'),意思是,city參數用傳進去的值,其他默認參數繼續使用默認值。
定義默認參數要牢記一點:默認參數必須指向不變對象!
如果已經有一個list或者tuple,要調用一個可變參數怎么辦?可以這樣做:
>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
這種寫法當然是可行的,問題是太繁瑣,所以Python允許你在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
*nums表示把nums這個list的所有元素作為可變參數傳進去。
在用def定義內容的時候需要加一個限制關鍵名,就可以用*args的方式,作用是是限制關鍵字參數名字,不出現用命名關鍵字參數就報錯
參數組合
在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
函數的命名以及使用規則
def weeks(*args,**afks_1):
print(afks_1) {'job': 'IT', 'hobby': 'girls'}
print(args) ()
for i in afks_1:
print("%s:%s"%(i,afks_1[i]))
weeks(job = "IT",hobby = "girls")
# 打印效果是:# {'job': 'IT', 'hobby': 'girls'}
# ()
# job:IT
# hobby:girls
由此可見這種打印規則是指的,將兩個數值列印成為一個字典,注意的一點是,前面args僅僅打印一個空值,說明,這個函數的作用僅作用於字典類型,也就是后面有默認數值的
看例子:
由此可以帶出一個新的命名規則,類似於萬能命名規則
# 所以現在講一個萬能的命名參數:
# def f(*args,**wrargs):
# pass
注意這里需要注意一點就是不定參數的位置是有要求的:
1 *args 必須要在第一個,**wrargs必須在第二個,位置不能錯,一錯就報錯
2 下面的實參必須要按照順序放入,放入順序是,前面是元組,后面是字典(默認值),不可以混放,更不能顛倒順序.
注意一點def結束一定要用return接收的值(對象)
這樣可以讓開發者接收到一個對象,並且可以對他進行處理
否則會爆出一個None值
練習題:
以下函數允許計算兩個數的乘積,請稍加改造,變成可接收一個或多個數並計算乘積:
# -*- coding: utf-8 -*-
def product(*numbers): #定義一個函數
if numbers is None or len(numbers)<=0 :
raise TypeError("args not null!") #將函數提前給定好各種情況,如果小於零,等於零或者未輸入
sum = 1
for n in numbers:
sum = sum *n #如果n在給定的數列中,那么就將sum*每一個數值得出總數
return sum
# 測試
print('product(5) =', product(5))
print('product(5, 6) =', product(5, 6))
print('product(5, 6, 7) =', product(5, 6, 7))
print('product(5, 6, 7, 9) =', product(5, 6, 7, 9))
if product(5) != 5:
print('測試失敗!')
elif product(5, 6) != 30:
print('測試失敗!')
elif product(5, 6, 7) != 210:
print('測試失敗!')
elif product(5, 6, 7, 9) != 1890:
print('測試失敗!')
else:
try:
product()
print('測試失敗!')
except TypeError:
print('測試成功!')