🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Python 在定义函数时也可以使用可变参数,即允许定义参数个数可变的函数。这样当调用该函数时,可以向其传入任意多个参数。 可变参数,又称不定长参数,即传入函数中的实际参数可以是任意多个。Python 定义可变参数,主要有以下 2 种形式。 ## 1) 可变参数:形参前添加一个 '\*' 此种形式的语法格式如下所示: ``` *args ``` args 表示创建一个名为 args 的空元组,该元组可接受任意多个外界传入的非关键字实参。 下面程序演示了如何定义一个参数可变的函数: ``` # 定义了支持参数收集的函数 def dis_str(home, *str) : print(home) # 输出str元组中的元素 print("str=",str) for s in str : print(s) #可传入任何多个参数 dis_str("http://x.linyiwang.cn","http://x.linyiwang.cn/python/","http://x.linyiwang.cn/shell/") ``` 程序执行结果为: ``` http://x.linyiwang.cn str= ('http://x.linyiwang.cn/python/', 'http://x.linyiwang.cn/shell/') http://x.linyiwang.cn/python/ http://x.linyiwang.cn/shell/ ``` 上面程序中,dis_str() 函数的最后一个参数就是 str 元组,这样在调用该函数时,除了前面位置参数接收对应位置的实参外,其它非关键字参数都会由 str 元组接收。 当然,可变参数并不一定必须为最后一个函数参数,例如修改 dis_str() 函数为: ``` # 定义了支持参数收集的函数 def dis_str(*str,home) : print(home) # 输出str元组中的元素 print("str=",str) for s in str : print(s) dis_str("http://x.linyiwang.cn","http://x.linyiwang.cn/python/",home="http://x.linyiwang.cn/shell/") ``` 可以看到,str 可变参数作为 dis_str() 函数的第一个参数。但需要注意的是,在调用该函数时,必须以关键字参数的形式给普通参数传值,否则 Python 解释器会把所有参数都优先传给可变参数,如果普通参数没有默认值,就会报错。 也就是说,下面代码调用上面的 dia_str() 函数,是不对的: ``` dis_str("http://x.linyiwang.cn","http://x.linyiwang.cn/python/","http://x.linyiwang.cn/shell/") ``` Python 解释器会提供如下报错信息: ``` TypeError: dis_str() missing 1 required keyword-only argument: 'home' ``` 翻译过来就是我们没有给 home 参数传值。当然,如果 home 参数有默认参数,则此调用方式是可行的。 ## 2) 可变参数:形参前添加两个'\*' 这种形式的语法格式如下: ``` **kwargs ``` **kwargs 表示创建一个名为 kwargs 的空字典,该字典可以接收任意多个以关键字参数赋值的实际参数。 例如如下代码: ``` # 定义了支持参数收集的函数 def dis_str(home,*str,**course) : print(home) print(str) print(course) #调用函数 dis_str("我爱学Python",\ "http://x.linyiwang.cn",\ "http://x.linyiwang.cn/python/",\ shell教程="http://x.linyiwang.cn/shell/",\ go教程="http://x.linyiwang.cn/golang/",\ java教程="http://x.linyiwang.cn/java/") ``` 程序输出结果为: ``` 我爱学Python ('http://x.linyiwang.cn', 'http://x.linyiwang.cn/python/') {'shell教程': 'http://x.linyiwang.cn/shell/', 'go教程': 'http://x.linyiwang.cn/golang/', 'java教程': 'http://x.linyiwang.cn/java/'} ``` 上面程序在调用 dis\_str() 函数时,第 1 个参数传递给 home 参数,第 2、3 个非关键字参数传递给 str 元组,最后 2 个关键字参数将由 course 字典接收。 注意,\*args 可变参数的值默认是空元组,\*\*kwargs 可变参数的值默认是空字典。因此,在调用具有可变参数的函数时,不一定非要给它们传值。以调用 dis\_str(home, \*str, \*\*course) 为例,下面的调用方式也是正确的: ``` dis_str(home="http://x.linyiwang.cn/shell/") ``` 程序执行结果为: ``` http://x.linyiwang.cn/shell/ () {} ```