在编程中,函数就是生命!
作为使用Python的新手——无论是编程新手,还是熟悉另一语言的人——都需要学习函数定义中的参数数目是否和想要传达的变元数目匹配。
这是基础性知识——有助于了解这个世界。
然而,接触到函数定义中的*args和**kwargs时,也会让新手刚开始就遇到心理障碍。
在Python中的代码中经常会见到这两个词 args 和 kwargs,前面通常还会加上一个或者两个星号。
别被这些语句所绊倒。其实这些并不是什么超级特殊的参数,也并不奇特,只是编程人员约定的变量名字,args 是 arguments 的缩写,表示位置参数;kwargs 是 keyword arguments 的缩写,表示关键字参数。
这其实就是 Python 中可变参数的两种形式,并且 *args 必须放在 **kwargs 的前面,因为位置参数在关键字参数的前面。
接下来,我们就具体学学如何使用它们。
位置参数vs关键字参数
为了学习什么是*args和**kwargs,我们需要区分两个概念。
首先,分清楚位置参数和关键字参数的区别。在最基本的函数中,做一个匹配游戏——参数1与参数1匹配,参数2与参数2匹配,诸如此类。
-
def printThese(a,b,c):
-
print(a, "is stored in a")
-
print(b, "is stored in b")
-
print(c, "is stored inc")printThese(1,2,3)
-
"""
-
1 is stored in a
-
2 is stored in b
-
3 is stored in c
-
"""
三项参数都是必需的,缺了其中一个就会致错。
-
def printThese(a,b,c):
-
print(a, "is stored in a")
-
print(b, "is stored in b")
-
print(c, "is stored inc")printThese(1,2)
-
"""
-
TypeError: printThese() missing 1 required positional argument: 'c'
-
"""
为某函数定义中的参数给定默认值,该参数随后就会变为可选参数。
-
def printThese(a,b,c=None):
-
print(a, "is stored in a")
-
print(b, "is stored in b")
-
print(c, "is stored inc")printThese(1,2)
-
"""
-
1 is stored in a
-
2 is stored in b
-
None is stored in c
-
"""
另外,这些可选参数也会成为可供选择的关键字,则此时可以规定函数调用参数名称并相应进行映射。
将三个变量默认值设为None,然后看看如何在不考虑顺序的情况下进行映射。
-
defprintThese(a=None,b=None,c=None):
-
print(a, "is stored in a")
-
print(b, "is stored in b")
-
print(c, "is stored inc")printThese(c=3, a=1)
-
"""
-
def printThese(a=None,b=None,c=None):
-
print(a, "is stored in a")
-
print(b, "is stored in b")
-
print(c, "is stored inc")printThese(c=3, a=1)
-
"""
-
1 is stored in a
-
None is stored in b
-
3 is stored in c
-
"""
Splat运算符
来源:Pexels
从开始说我爱该运算符的名称开始——太……可视化了。*常常与乘法运算有关,但是在Python中,则是splat运算符的两倍。
该运算符就像一个彩盒。笔者把延伸运算符——相当于splat的JavaScript——这个过程可以看做是打开一个多米诺骨牌,形成一个更大的序列,但是splat需要更有力的类比。
利用以下例子更容易解释清楚。
-
a = [1,2,3]
-
b = [*a,4,5,6]print(b) # [1,2,3,4,5,6]
在代码实例中,将a的内容移入(解包)到新列表b中。
如何使用*args和**kwargs
我们知道splat运算符解包多个值,并且知道函数参数有两种类型。若现在还未弄明白,那么可以将*args理解为变元的缩写,而**kwargs理解为关键字变元的缩写。
各参数用于解压其各自的变元类型,允许使用可变字长变元列表进行函数调用。例如,创建一个函数表示学生的考试分数。
-
def printScores(student,*scores):
-
print(f"Student Name:{student}")
-
for score in scores:
-
print(score)printScores("Jonathan",100, 95, 88, 92, 99)
-
"""
-
Student Name: Jonathan
-
100
-
95
-
88
-
92
-
99
-
"""
噢,等等,我并未称呼其为*args?是的,“args”是一个标准化规范,但仍然只是一个名称。事实上,在*args中,唯一的星号是真正的参与者,创建了列表,其内容则是来自函数调用的位置参数(在这些定义变元后)。
这些理清楚之后,**kwargs就很容易理解了。名称并不重要,重要的是双星号创建了字典,其内容是关键字参数,来自函数调用(在这些定义变元后)。
为了更好地演示,我们创建一个函数,输出参加全国英语等级考试的人员名单。
-
def printPetNames(owner,**pets):
-
print(f"Owner Name:{owner}")
-
for pet,name in pets.items():
-
print(f"{pet}:{name}")printPetNames("Jonathan", dog="Brock",fish=["Larry", "Curly", "Moe"],turtle="Shelldon")"""
-
Owner Name: Jonathan
-
dog: Brock
-
fish: ['Larry', 'Curly', 'Moe']
-
turtle: Shelldon
-
"""
来源:Pexels
最后,再给大家提供一些额外的“知识福利”。
下面一些谏言可有助于大家规避常见的陷阱并扩展知识面。
· 利用*args和**kwargs作为标准化规范,把握好位置参数和关键字参数;
· 不能将**kwargs置于*args前,否则将产生错误;
· 清楚意识到关键字参数和**kwargs之间的冲突,该值本是传达**kwarg的意思,但是却不明就里的成为关键字参数的名称;
· 在函数调用时可以采用splat运算符。
全文共2911字,预计学习时长9分钟来源:Pexels在编程中,函数就是生命!作为使用Python的新手——无论是编程新手,还是熟悉另一语言的人——都需要学习函数定义中的参数数目是否和想要传达的变元数目匹配。这是基础性知识——有助于了解这个世界。然而,接触到函数定义中的*args和**kwargs时,也会让新手刚开始就遇到心理障碍。在Python中的代码中经常会见到这两个词 args 和 kwar...
Python
的动态
参数
有两种,分别是*
args
和**k
war
gs
,这里面的关键是一个和两个星号的区别,而不是
args
和k
war
gs
在名字上的区别,实际上你可以
使用
*any或**whatever的方式。但就如self一样,默认大家都
使用
*
args
和**k
war
gs
。
注意:动态
参数
,必须放在所有的位置
参数
和默认
参数
后面!
def func(name, age, sex='male', *
args
, **k
war
gs
): # 位置
参数
默认
参数
动态
参数
*
args
一个星号表示接收任意个参
文章目录指针与函数1 指针作为函数的
参数
2 数组作为函数的
参数
3 引用4 指向函数的指针
指针与函数
指针最重要的应用是作为
函数参数
,它使得被调函数除了返回值之外,能够将更多的运算结果返回到主调函数
中
。因此,指针是
函数参数
传递的重要工具。
1 指针作为函数的
参数
函数形参可以是指针类型,一般形式为:
返回类型 函数名(指向类型 *指针变量名,...)
1、在定义函数时,可以在形参前边加上一个*,这样这个形参将会获取到所有的实参,它将所有的实参保存到一个元组
中
注意:*1、带星号的形参只能有一个
2、 带星号的
参数
,可以和其他
参数
配合
使用
3、可变
参数
不是必须卸载最后,但是注意,带的
参数
后的所有
参数
,必须以关键字
参数
的形式传递
4、如果在形参的开头直接写一个,则要求我们的所有的
参数
必须以关键字
参数
的形式传递
5、形参只能接受位置
参数
,而不能接收关键字
参数
# *a会接受所有的位置实参,并且将这些实参同意保存到一个元组
中
(装包)
def fn