1.函数参数定义中使用独立的*符号:
在函数定义时,使用了一个独立的*符号,这表示在*符号后面的参数,调用函数时,必须使用key=value的形式进行参数传递。在Python的标准库中,有不少模块的接口函数的定义都在使用这种方式。

def test_keyvalue(a,b,*,x,y=2,z=3):
    print(a,b,x,y,z)... test_keyvalue(1,2,3,4,5)
# Traceback (most recent call last):  File "", line 1, in TypeError: test_keyvalue() takes 2 positional arguments but 5 were given
test_keyvalue(1,2,x=3,y=4,z=5)
# 1 2 3 4 5
test_keyvalue(1,2,x=3)
# 1 2 3 2 3
test_keyvalue(1,2,x=3,z=8,y=9)
# 1 2 3 9 8
test_keyvalue(x=3,z=8,y=9,a=3,b=5)
# 3 5 3 9 8

注意:test_keyvalue函数的定义,参数列表中有一个*符号,这个符号我们不能将其理解为一个参数,而是一个分隔符。*分隔符后面的参数,在函数调用时,必须使用key=value形式。
继续看上面的示例代码,不管a和b两个参数的传递采用固定位置的方式,还是采用key=value的方式,x,y和z这三个参数,都只能使用key=value的形式传递。如果所有参数都采用key=value的方式传递,顺序就无所谓了。
os.chmod函数,和os.stat()函数,都使用了Python的这个特性。

有的时候需要设计一种函数,这种函数的参数个数不确定,或者说要求函数的参数不限个数,只有在函数被调用的时候,才能确定参数的数量。下面来介绍一下这两种方法
2.tuple参数(*args)
我们在设计函数参数的时候,如果使用一个*符号后跟字母,表示这是一个tuple参数,tuple内数据的个数,就不限制了。
*args参数在函数内部,是一个tuple类型的对象,使用时要去掉前面的*符号,直接使用args。在调用函数时,看不出来这是一个tuple,调用时并无特别之处,只是参数的数量不确定,可以很多,注意哦,也可以没有参数。
实现不限参数个数的函数接口,一般都使用这种方式,tuple对象内的各数据类型应该保持一致,如果不一致,大概率这不是一个好的设计,因为对各数据的处理方式会不一样。

def add(*args):
    print(args)   
    print(type(args))
    sum = 0
    for i in range(len(args)):
        sum += args[i]
    print(sum)
add(1,2,3)
# (1, 2, 3)  <class 'tuple'>  6
add(1,2,3,8,9,666)
# (1, 2, 3, 8, 9, 666)  <class 'tuple'>  689
add()
# ()  <class 'tuple'>  0

3.dict参数(**kwargs
设计函数参数时,如果使用两个**符号后跟字母,表示这个参数是一个dict对象。这种方式也可实现函数参数的个数不限。
采用**kwargs参数,函数调用时,要写成key=value的形式。同样的,这种方式也兼容没有参数输入。
使用这种方式的dict参数,函数内部可能需要预先知道有哪些key值可以使用,或者就是直接遍历所有的key和value。

def test_kw(**kwargs):
    print(kwargs) 
    print(type(kwargs))
    for k,v in kwargs.items():
        print(k,':',v)
test_kw(a=1,b=2,c=3,d=4)
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}  
# <class 'dict'>  
# a:1  b:2  c:3  d:4
test_kw(a=1,b=2,c=3,d=4,x=999)
# {'a':1, 'b':2, 'c':3, 'd':4, 'x':999}
# <class 'dict'>
# a:1  b:2  c:3  d:4  x:999
test_kw()
# {}  <class 'dict'>

一个函数,替换输入字符串中的某些字符,返回新字符串,替换规则通过**kwargs传入。

def char_replace(originstr, **kwargs):
    newstr = ''
    for c in originstr:
        if c in kwargs.keys():
            newstr += kwargs[c]
        else:    
            newstr += c
     return newstr
char_replace('abcde', a='x')
# 'xbcde'
char_replace('abcde', a='x',c='y')
# 'xbyde'
char_replace('abcde', a='x',c='y',e='z')
# 'xbydz'

参考/转载:
https://www.pynote.net/archives/368
https://www.pynote.net/archives/534

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐