學了那麼多天的函式參數(引數),現在來綜合複習一下吧!
位置參數:必填,對應傳入引數的順序:
def func(a, b):
print(a, b)
func('hello', 'world')
hello world
func(b='world', a='hello')
hello world
一樣是位置參數,參數數量固定,有些有預設值:
def func(a, b='world', c=10):
print(a, b, c)
func('hello')
hello world 10
func('hello', c='!')
hello world !
一樣是位置參數:參數數量不固定,無預設值:
def func(a, b, *args):
print(a, b, args)
func(1, 2, 'x', 'y', 'z')
1 2 ('x', 'y', 'z')
但位置引數不能在關鍵字引數後傳入:
func(b=2, a=1, 'x', 'y', 'z')
Input In [10]
func(b=2, a=1, 'x', 'y', 'z')
^
SyntaxError: positional argument follows keyword argument
關鍵字參數:參數數量固定,無預設值:
def func(*, a, b):
print(a, b)
func(a=1, b=2)
1 2
關鍵字參數:參數數量固定,有預設值
def func(*, a=1, b):
print(a, b)
func(a=10, b=20)
10 20
func(b=2)
1 2
同時出現位置參數和關鍵字參數,無預設值:
def func(a, b, *, c, d):
print(a, b, c, d)
func(1, 2, c=3, d=4)
1 2 3 4
func(1, 2, d=4, c=3)
1 2 3 4
func(1, c=3, d=4, b=2)
1 2 3 4
關鍵字參數和位置參數同時出現,有預設值:
def func(a, b=2, *, c, d=4):
print(a, b, c, d)
func(1, c=3)
1 2 3 4
func(c=3, a=1)
1 2 3 4
func(1, 2, c=3, d=4)
1 2 3 4
func(c=3, a=1, b=2, d=4)
1 2 3 4
關鍵字參數和位置參數同時出現,可傳入額外的位置引數:
def func(a, b=2, *args, c=3, d):
print(a, b, args, c, d)
func(1, 2, 'x', 'y', 'z', c=3, d=4)
1 2 ('x', 'y', 'z') 3 4
關鍵字參數和位置參數同時出現,可傳入額外關鍵字引數:
def func(a, b, *, c, d=4, **kwargs):
print(a, b, c, d, kwargs)
func(1, 2, c=3, x=100, y=200, z=300)
1 2 3 4 {'x': 100, 'y': 200, 'z': 300}
func(x=100, y=200, z=300, c=3, b=2, a=1)
1 2 3 4 {'x': 100, 'y': 200, 'z': 300}
關鍵字參數和位置參數同時出現,且可傳入額外的關鍵字引數和位置引數:
def func(a, b, *args, c, d=4, **kwargs):
print(a, b, args, c, d, kwargs)
func(1, 2, 'x', 'y', 'z', c=3, d=5, x=100, y=200, z=300)
1 2 ('x', 'y', 'z') 3 5 {'x': 100, 'y': 200, 'z': 300}
可傳入額外的關鍵字引述和位置引數,或什麼都不傳:
def func(*args, **kwargs):
print(args, kwargs)
func(1, 2, 3, x=100, y=200, z=300)
(1, 2, 3) {'x': 100, 'y': 200, 'z': 300}
func()
() {}
實際上要怎麼應用上述這些設定啊?我們來看一個實例:Python 的 print 函式:
help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
從上述的 help 說明,就可以發現我們學到的那些參數引數設定是怎麼用的了:
print(1, 2, 3)
1 2 3
print(1, 2, 3, sep='--')
1--2--3
print(1, 2, 3, end='***\n')
1 2 3***
print(1, 2, 3, sep='\t', end='\t***\t')
print(4, 5, 6, sep='\t', end='\t***\n')
1 2 3 *** 4 5 6 ***
def calc_hi_lo_avg(*args, log_to_console=False):
hi = int(bool(args)) and max(args)
lo = int(bool(args)) and min(args)
avg = (hi + lo)/2
if log_to_console:
print("high={0}, low={1}, avg={2}".format(hi, lo, avg))
return avg
avg = calc_hi_lo_avg(1, 2, 3, 4, 5)
print(avg)
3.0
avg = calc_hi_lo_avg(1, 2, 3, 4, 5, log_to_console=True)
print(avg)
high=5, low=1, avg=3.0
3.0
好啦,我們明天見!
參考:Python 3: Deep Dive (Part 1 - Functional)