2021 年新年的钟声已经敲响,勇士在 Python 大世界中的第一个新年是在函数城度过的。函数城是一个很大很大的城邦,在这里有各种稀奇古怪的事情。只要是在这里待过一段时间的人,都会因为这一段经历而终生难忘。
勇士上一次和小姐姐的偶遇中,已经明白了基本的函数用法,了解了函数参数、返回值等概念。
但是函数中的参数在传递的时候,有各种各样的用法。比如关键字参数,可变参数等。
关键字参数
这不,勇士这就遇到了一个函数
def func(name, age='18'):
print(name + age + "岁啦。")
func('小阿狸')# 小阿狸18岁啦。
func('小阿狸', '19')# 小阿狸19岁啦。
勇士发现,在这个函数中有两个参数,并且定义函数的时候将第二个参数进行了赋值。
当调用函数时,需要将实参传递给未被赋值的第一个形参,而第二个参数会使用被定义的值进行打印。当某一个频繁使用的参数为一个固定的值的时候,就可以在定义时先将这个参数赋值。这样在调用时就可以少传一个参数。
但是当这个值需要修改时,我们直接将需要的实参传入调用函数即可,新传入的值会将旧的值替换。
勇士看着这个函数的方法,自己也尝试打了一套函数。
def my_func(name='勇士', age):
print(name + age + '岁啦。')
my_func('19')
# 调用函数报错...
# SyntaxError: non-default argument follows default argument勇
勇士感到有些疑惑,每次我一上手写代码就会报错,心态都要爆炸啦。不过勇士读懂了这个报错原因,原来是非默认参数跟在了默认参数的后面。这个函数在定义的时候,将默认的参数 name 放在了第一个的位置。这里只需要将两个参数的位置进行调换就好啦,并且将默认的参数放在最后,非默认参数一律往前靠。
def func2(name, age='18', addr='BeiJing'):
print(name + age + '岁啦。')
print(name + '的地址是' + addr)
func2('小阿狸')# 小阿狸18岁啦。小阿狸的地址是BeiJing
func2('小阿狸', addr='ShangHai')# 小阿狸18岁啦。小阿狸的地址是ShangHai
如果在定义函数时有多个默认参数,并且在调用时只想改变其中某几个的值。就可以在调用时将这几个值单独拿出来直,接重新定义即可。
这里在第二次调用函数时,直接修改了第三个默认参数的值,但是并不影响第二个参数的使用。也可以实现我们想要的结果,只是在定义函数的时候要记清楚,默认参数需要放在最后的位置哦。
可变参数
勇士感觉 Python 大世界这样传参数的方法真优雅,一边走一边想,那函数定义者怎么知道我传入几个参数呢?
说来话巧,不远处,勇士看到了上次遇到的小姐姐,赶紧上前打招呼。小姐姐也看到了勇士,俩人互相问好,勇士及时向小姐姐提出了心中的疑问。
小姐姐解释说:在函数中其实有一种参数叫做可变参数,这种参数可以接收任意多的变量哦。
勇士感到特别好奇,不是一个参数接收一个参数嘛。这下可学到宝了。
小姐姐说着给勇士演示了一段代码
def f1(normal, *args):
print('normal' = normal)
print('args' = args)
f1(1,2,3,4,5)
# 结果打印
# normal = 1
# args = (2, 3, 4, 5)
看到结果,勇士目瞪口呆,着实被 Python 世界的优雅震惊到了。耳边只传来小姐姐的声音。
勇士你看,在定义函数的时候,第一个参数是普通参数,第二个参数 args 前有一个 * 号,这样在调用函数时,会将多个实参的第一个值给参数 normal,而剩下的所有值,都会传递给带 * 的参数 args,并且以元组的形式存储在变量 args 中。
听完小姐姐的解释,勇士心中的疑惑好像解开了那么一点点。但是还在嘀咕:真神奇呀真神奇。既然这个变量是一个数组的话, 我肯定也可以用 for 循环来遍历它。
得到了小姐姐的肯定,勇士的心中特别激动。小姐姐又给补充道:如果这个变量是两个 * 号呢?
勇士的嘴巴张得更大了,半天吐出几个字,我吃不消了。
小姐姐偷偷笑了起来,接下来的这个也很简单呢。我们再一起看一下吧。
def f2(normal, *args, **kwargs):
print(normal)
for i in args:
print(i)
for key, value in kwargs.items():
print(key + '=' + value)
print('------value-----')
print(type(args))
print(type(kwargs))
勇士看到这一串函数,又看到了以前见过的键值对 key 和 value ,原来两个 * 的参数是一个字典呀。勇士激动的直拍大腿,心中一阵窃喜,原来自己这么聪明。
果不其然,勇士开始调用这个函数
f2(1, 2, 3, key1='1', key2='2', key3='3')
# 输出
# 1
# 2
# 3
# key1=1
# key2=2
# key3=3
#
#
勇士看到输出结果顿时明白了。连忙向小姐姐道谢,小姐姐真是自己生命中的贵人。让自己搞懂了这么多新东西,于是向小姐姐发出邀请,一起去喝奶茶。得到肯定的回答后,两人一起朝着奶茶店走去,消失在函数城的人海中。
勇士加油! PS:勇士都有小姐姐了,你还不来抽奖吗?后台回复【 算法 】即可抽取新年礼物哦更多文章
零基础:Python 世界大冒险之函数城零基础:Python世界大冒险之数据结构部落零基础:Python世界大冒险之字典村零基础:Python世界大冒险之列表村小记 题图来源:pixabay.com点个在看 你最好看