iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0

學了那麼多天的函式參數(引數),現在來綜合複習一下吧!

位置參數:必填,對應傳入引數的順序:

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 函式:

The Print Function

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)


上一篇
**kwargs
下一篇
unpacking 應用:A Simple Function Timer
系列文
小青蛇變大蟒蛇——進階Python學起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言