Python學習筆記__2.3章 函數的參數
# 這是學習廖雪峰老師python教程的學習筆記
1、概覽
python中可用的參數有5種:
必選參數
默認參數
可變參數
關鍵字參數
命名關鍵字參數
參數定義的順序是:必選參數、默認參數、可變參數、命名關鍵字參數、關鍵字參數
2、必選參數
必須傳入的參數。比如下面這個函數,x就是必須傳入的參數
def power(x):
return x * x
3、默認參數
默認參數是一個 事先定義好的參數。你可以不給它傳值,也可以傳一個值取代它。
下面,n是默認參數。
可以power(5),只傳x參數
也可以power(5,3),傳兩個參數
def power(x, n=2):
s = x**n
return s
註:默認參數,必須放在必選參數後面,不然傳值會有歧義
void f(int a=0,int b,int c=0),當你調用f(1,1)時,到底是取f(1,1,0)呢 還是f(0,1,1)?
4、可變參數
可變參數就是傳入的參數個數是可變的。0個到多個都可以
下面這個函數,你可以傳多個參數累加。在函數內部,參數numbers接收到的是一個tuple
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
在調用時,也允許將list或tuple的元素變成可變參數傳進去:
nums = [1, 2, 3]
calc(*nums)
5、關鍵字參數
關鍵字參數允許你傳入0個或多個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict
# 定義一個函數
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
# 不傳 **kw
>>> person('Michael', 30)
name: Michael age: 30 other: {}
# 傳任意個 **kw
>>>
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('Adam', 45, city=extra['city'], job=extra['job'])
>>>person('Jack', 24, **extra)
6、命名關鍵字參數
你必須傳的參數,並且必須傳入參數名。
# 必須傳入 city='xxx',job='xx'
def person(name, age, *, city, job):
print(name, age, city, job)
# 調用函數
>>>person('Jack', 24, city='Beijing', job='Engineer')
如果函數定義中已經有了一個可變參數,後面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了
def person(name, age, *args, city, job):
命名關鍵字參數可以有缺省值,從而簡化調用
def person(name, age, *, city='Beijing', job):
7、小結
默認參數一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤!
要註意定義可變參數和關鍵字參數的語法:
*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的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。
命名的關鍵字參數是為了限制調用者可以傳入的參數名,同時可以提供默認值。
定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符*,否則定義的將是位置參數。
8、例題
編寫函數,允許接受多個參數,進行累乘
# -*- coding: utf-8 -*-
def product(*args):
if args ==():
raise TypeError
s=1
for n in args:
s=n*s
return s
Python學習筆記__2.3章 函數的參數