在上一篇教程中,我们了解了函数的定义以及参数的设定。
这一篇教程,我们继续了解一些更加灵活的参数设定。
先来看一段示例代码。
例如,我们定义一个根据输入的姓名参数,返回一个姓名列表的方法。
示例代码:
def creat_name_list(name_list,name1,name2,name3): # 定义函数并设定参数 name_list.append(name1) # 为列表添加新元素 name_list.append(name2) name_list.append(name3) lst = [] # 创建空列表 creat_name_list(lst,'小楼老师','苍井老师','吉泽老师') #调用函数并传入参数 print(lst) # 显示输出结果为:['小楼老师', '苍井老师', '吉泽老师']
特别说明:在上方的代码中,大家应该能够注意到,虽然我们没有对lst这个列表进行直接操作,但是它发生了改变。也就是说我们在函数外部创建的lst和函数内部的参数name_list是同一个列表。这样的操作仅限于可变的数据结构,而数字、字符串以及元组是不能够被改变的,所以无法进行这样的修改。
示例代码:
def change_number(num): # 定义函数并设定参数 num = 1 # 修改参数变量的值 n = 0 # 创建变量 change_number(n) # 调用函数并传入参数 print(n) # 显示输出结果为:0
以上是关于对修改函数外部变量的举例,让我们能够知道当外部变量是不可变的数据结构,作为参数传入函数时,在函数内部的修改操作无法对外部变量产生影响;而当外部变量是可变的数据结构,作为参数传入函数时,在函数内部的修改能够让外部变量发生改变。
接下来,我们回过头来看第一段代码。
当我们希望输入多个姓名,创建一个姓名列表时,往往姓名的数量是不固定的。
而我们定义参数时,位置参数或者关键字参数的数量却是固定的。
很显然,当我们想写入4个姓名时,第一段代码没有办法满足我们的需求。
我们只有通过将参数增加为4个才能实现。
但是,如果忽然我们改变了主意,要写入5个姓名呢?
所以,改变函数的参数数量并不是一个好方法。
这里,我们来使用收集参数来解决这个问题。
示例代码:
def creat_name_list(name_list, *names): # 定义函数并设定参数,*names为收集参数 print(type(names)) # 显示输出参数names的数据类型,结果为:<class 'tuple'> if names: # 判断收集参数names不为空值 for name in names: # 循环遍历names name_list.append(name) # 为列表添加新元素 lst = [] # 创建空列表 creat_name_list(lst, '小楼老师', '苍井老师', '吉泽老师', '樱井老师') # 调用函数并传入参数 print(lst) # 显示输出结果为:['小楼老师', '苍井老师', '吉泽老师', '樱井老师']
在上方的代码中,大家能够看到,参数中除了位置参数name_lsit,只设定了一个参数“*names”。
这个names在第2句代码中,我们获取到它是一个元组类型。
也就是说,这个收集参数是一个元组类型的变量,它把我们传入的多个姓名(无论几个),全部存放在了一个元组中。
然后,我们对names进行循环遍历,就能够取出这些姓名,添加到列表中。
到这里,大家一定都已知道收集参数的设定只需要给变量名称前面加上一个拼接(Splicing)操作符“*”就可以了。
特别说明:上方代码中,是在函数外部创建了列表,并作为参数传入到函数中。我们也可以在函数内部去创建这个列表,然后通过return语句返回。
示例代码:
def creat_name_list(*names): # 定义函数并设定参数,*names为收集参数 print(type(names)) # 显示输出参数names的数据类型,结果为:<class 'tuple'> name_list = list(names) # 将元组names转换为列表并存入变量name_list return name_list # 返回列表 lst = creat_name_list('小楼老师', '苍井老师', '吉泽老师', '樱井老师') # 调用函数并传入参数,通过变量接收返回值 print(lst) # 显示输出结果为:['小楼老师', '苍井老师', '吉泽老师', '樱井老师']
另外,也可以通过收集参数的方式,灵活的传入多个关键字参数。
设定参数时,在变量名称前加上拼接操作符“**”即可。
例如,我们通过输入用户的姓名、年龄、身高、体重信息,创建一个用户信息的列表。
示例代码:
def creat_user(**user_info): # 定义函数并设定参数,*user_info为收集参数 print(type(user_info)) # 显示输出参数user_info的数据类型,结果为:<class 'dict'> return user_info # 返回参数值 user=creat_user( name='小楼老师',age=18, height='182',weight= '90KG') # 调用函数并传入参数 print(user) # 显示输出结果为:{'name': '小楼老师', 'age': 18, 'height': '182', 'weight': '90KG'}
在上方代码中,我们设定了一个收集参数获取所有传入的关键字参数。
在代码第二句中,我们能够获取到变量user_info的类型为字典。
那么,这个字典我们可以直接作为返回值,通过return语句返回。
——————————————————————–
在之前的案例中,大家能够看到拼接操作符“*”和“**”在设定参数时的作用。
实际上,这两个操作符,我们还能够反过来使用。
示例代码:
def get_volume(length, width, height): # 定义函数并设定参数 return length * width * height # 返回计算结果 params = (3, 4, 5) # 创建参数元组 print(get_volume(*params)) # 显示输出结果为:60
在上方的示例代码中,我们定义了一个计算体积的函数,并且设定了固定数量的参数。
然后,我们有一个变量params,是一个元素数量与函数参数数量相等的数组。
当我们调用这个函数时,就无需把数组中的元素取出,而是直接在变量名称前面加上星号“*”,做为参数传入函数中。
这样的做法和我们分开传入参数的结果是一样的。
因为,星号“*”可以解析可迭代序列。
当然,“**”也可以类似使用。
例如,我们通过一组用户信息,返回一个用户描述的字符串。
示例代码:
def user_info(name,age,height,sex='男'): # 定义函数并设定参数 info = '姓名-%s 性别-%s 年龄-%s 身高-%s'% (name,sex,age,height) # 格式化字符串 return info # 返回结果 params = {'name': '小楼', 'age': '18', 'height': '180CM'} # 创建参数字典 print(user_info(**params)) # 调用函数,并传入参数,显示输出结果为:姓名-小楼 性别-男 年龄-18 身高-180CM
另外,还要补充说明一点。
单星号“*”可以解析可迭代序列的作用不仅限在参数处理中。
举个小例子,让两个元组混合为集合。
示例代码:
s1 = {(1, 2, 3), (3, 4, 5)} s2 = {*(1, 2, 3), *(3, 4, 5)} print(s1) # 显示输出结果为:{(3, 4, 5), (1, 2, 3)} print(s2) # 显示输出结果为:{1, 2, 3, 4, 5}
本节知识点:
1、函数内部修改外部变量值;
2、使用收集参数,获取非固定数量的参数;
3、使用拼接操作符。
本节英文单词与中文释义:
1、create:创建
2、info:信息
3、age:年龄
4、height:高度
5、width:宽度
6、weight:重量
7、splicing:拼接
8、params:参数
9、volume:体积
练习:从参数(18,7,4,26,8,23,20,17,2,11)中取出所有的偶数。
答案:(见评论1楼)
转载请注明:魔力Python » Python3萌新入门笔记(19)