在编程语言中函数之所以发挥着巨大的功能,就是其能够对向函数中传入的各种参数起到加工处理的作用,而在python中函数支持默认参数
、必需参数
、可变参数
、关键字参数
和命名关键字参数
。本文将从例子出发介绍这几种参数的使用方式。
必需参数
必需参数正如其名,是函数调用所必需的参数,可以按照函数定义参数的顺序传入参数,也可以使用word = 'argument’这样的指定参数名来传入。
例如如下例子:
def print_it(word1, word2):
print(word1 + ', ' + word2)
# 调用函数的方法:
print_it('hello', 'Mary')
print_it(word1 = 'hello', word2 = 'Mary')
# 这里如果传入的参数少于两个的话,那么就会报错
# 如果只传word1那么报错为:
# TypeError: print_it() missing 1 required positional argument: 'word2'
默认参数
默认参数即函数创建时对某些参数设置了默认值,除非调用函数时额外再传入一个参数顶替掉之前的默认值,否则若不传入的话就会直接使用函数定义时此参数的默认值。要设置默认参数的话需要对这个默认参数进行命名,并在函数创建阶段就构建好参数名 = "默认参数值"
这样的格式。
例如如下例子:
def print_it2(word1 = 'hello', word2 = 'Mary'):
print(word1 + ', ' + word2)
# 由于默认参数的存在,所以在调用函数时可以传递参数值,也可以不传递
# 同时也可以直接按照顺序来传入参数的,如以下这些例子都是可以直接使用的
print_it2()
print_it2(word1 = '你好', word2 = '玛丽')
print_it2(word2 = 'Jack')
print_it2('你好','玛丽')
可变参数
可变参数稍微复杂一点,可变参数的标志就是加一个星号*在参数名之前,其意义是收集所有未匹配的位置参数组成一个元组对象,这样的元组对象中的元素量是根据调用函数时传入的参数量所决定的。
例如:
def print_it3(word1, *word2):
print(word1)
print(word2, type(word2))
print_it3('hello', 'Mary', 'Jack', 'World')
# 上面的运行结果为:
# hello
# ('Mary', 'Jack', 'World') <class 'tuple'>
从上面的例子中看到可变参数获取到了除了第一个位置参数之外的剩下的所有位置参数,除了上面的使用方法外,再补充一种*
在函数中的使用方式:
def print_it3(word1, *word2):
print(word1)
print(word2, type(word2))
word_list = ['hello', 'Mary', 'Jack', 'world']
print_it3(*word_list)
# 直接使用*号将要传入的参数一起打包传给函数,这样调用运行的结果:
# hello
# ('Mary', 'Jack', 'World') <class 'tuple'>
'''
可以看到这里结果同上,这里*做了什么呢,它做了解包操作,
解包操作将传入的可变列表或者元组等中的一个个元素解包成为函数中的一个个位置参数,
因此第一个出现的位置参数word1就获取到了hello这个元素。
由于函数只需要一个位置参数,因此传入的列表中除了第一个位置参数之外
剩下的各个元素就被分配到了可变参数word2中去了
'''
# 通过上面的例子理解一下使用*还可以这样用:
def print_it4(word1, word2):
print(word1 + ', ' + word2)
word_list = ['hello', 'Mary']
print_it4(*word_list)
# 运行结果:
# hello, Mary
# 这里的*号也做了解包操作,有时候这样的操作可能会带来方便哈
# 但是如果这里word_list的元素超过了两个的话,由于解包后产生的位置参数大于函数所需的参数量,
# 这里函数会出现报错
关键字参数
关键字参数的含义即允许函数调用时传入一个或多个包含参数名的参数
,这样即使传入参数时参数放置位置改变了也不影响(因为这些被命名的参数并不能归到默认参数或者位置参数中,与可变参数类似,都是未被函数直接匹配的参数),这些未被匹配的关键字参数在函数内部会被自动组装为一个dict(字典)。
设置关键字参数时在参数前加**号,当然在调用包含关键字参数的函数时也是可以不传入的。
例:
def print_it5(**kwargs):
print(kwargs)
print_it5(word1 = 'hello', word2 = 'Mary')
# 也可以这样
dic = {'word1': 'hello', 'word2': 'Mary'}
print_it5(**dic)
# 上面两种方式得到的结果都是:{'word1': 'hello', 'word2': 'Mary'}
# 可以看出函数从关键字参数中获取到的是一个字典,后续函数可以对这个字典中的内容进行处理
# 同样的类似一个*的可变参数的解包功能,**也能发挥解包功能:
def print_it6(word1, word2):
print(word1 + ', ' + word2)
dic = {'word1': 'hello', 'word2': 'Mary'}
print_it6(**dic)
# 这里**发挥解包功能将word1赋值给对应的word1,word2赋值给对应的word2,但要
# 注意这里传入的字典和函数中的参数名必须是一样的,否则是识别不了的(因为python字典中是没有顺序的)。
# 当然,函数创建时也可以使用默认参数,如 def print_it6(word1, word2='nihao')
# 同时传入的字典的元素数量要和所需要的函数参数数量一致,否则也会报错
# 但是这种情况可以通过在创建函数时加一个关键字参数来解决,如def print_it6(word1, word2, word3)
命名关键字参数
命名关键字参数是一种较简单的关键字参数类型,其与关键字参数的区别就是传入的关键字参数的参数名是确定的,在传入的时候必须要和参数名一起传入(不是按位置顺序直接读取的),且这些参数名都必须要有参数传入才行,要不然就必须在一开始设置默认的关键字参数的参数值。
设置命名关键字参数的标志是有一个*号作为分隔符,*号之后的参数除了可变参数外就是命名关键字参数了。如果函数创建时已包含了可变参数,那么在可变参数后可以直接加入命名关键字参数,当然此处也仅可以使用命名关键字参数,必须在函数调用时同时传入参数名和参数值。
例:
def print_it7(name, coutry, *, height, hobby):
print(name, country, height, hobby)
print_it7('Jack', 'China', height = '1.70', hobby = 'play games')
# 执行结果为:Jack China 1.70 play games
# 如果命名关键字参数中也想设置默认值,只要在定义时定义即可
# 如:def print_it7(name, coutry, *, height = '1.75', hobby)
叮
本文将python函数使用中的几种参数的使用和意义进行了解释,例子比较多,但是使用的方法都在例子中了,希望帮助到某些人。