如果函数内部处理的数据不确定,就可以将外界的数据以参数的形式传递到函数内部
如果希望一个函数执行完成后,向外界汇报执行结果,就可以增加函数的返回值
函数的返回值
在程序开发中,有时希望一个函数执行结束后告诉调用者结果,以便调用者针对具体结果做后续处理
返回值是函数完成工作后,最后给调用者的一个结果
在函数中使用return关键字可以返回结果
调用函数一方,可以使用变量来接收函数的返回结果
元组可以包含多个数据, 因此可以使用元组让函数一次返回多个值
def measure():
"""测量温度和湿度"""
print("测量开始")
temp = 39
wetness = 50
print("测量结束")
# 元组可以包含多个数据, 因此可以使用元组让函数一次返回多个值
# return (temp, wetness) # 小括号可以省略
return temp, wetness
result = measure()
print(result)
# 如果函数返回的类型是元组,同时希望单独的处理元组中的元素,可以使用多个变量,一次接收函数的返回结果
# 使用多个变量接收结果时,变量的个数应该和元组中元素的个数保持一致
gl_temp, gl_wetness = measure()
函数的参数
无论传递的参数是可变还是不可变,只要针对参数使用赋值语句,会在函数内部修改局部变量的引用,不会影响到外部变量的引用
def demo(num, num_list):
print("*" * 50 + "\n函数内部的代码")
# 在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量
num = 100
num_list = [1, 2, 3]
print(num)
print(num_list)
print("函数执行完成\n" + "*" * 50)
gl_num = 99
gl_list = [4, 5, 6]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
如果传递的参数是可变类型,在函数内部,使用方法修改了数据的内容,同样会影响到外部的数据
def demo1(num_list):
print("^" * 50 + "\n函数内部的代码")
# 使用方法修改列表的内容
# 如果传递的参数是可变类型,在函数内部,使用方法修改了数据的内容,同时会影响到外部的数据
num_list.append(9)
print(num_list)
print("函数执行完成\n" + "^" * 50)
gl_list = [4, 5, 6]
demo1(gl_list)
print(gl_list)
在python中,列表变量调用+=本质上是在执行列表变量的extend方法,不会修改变量的引用
def demo2(num, num_list):
print("<" * 50 + "\n函数内部的代码")
num += num
print(num)
# 列表变量使用+不会做相加再赋值的操作, 本质上是调用列表的extend方法
num_list += num_list
num_list.extend(num_list)
print(num_list)
print("函数执行完成\n" + "<" * 50)
gl_num = 99
gl_list = [4, 5, 6]
demo2(gl_num, gl_list)
print(gl_num)
print(gl_list)
函数的缺省参数
定义函数时,可以给某个参数指定一个默认值,具有默认值的参数就叫做缺省参数
调用函数时,如果没有传入缺省参数的值,则在函数内部使用定义函数时指定的参数默认值
函数的缺省参数,将常见的值设置为参数的缺省值,从而简化函数的调用
对列表排序的方法:
# 带有默认值的缺省参数必须在参数列表末尾
# 在调用函数时,如果有多个缺省参数,需要指定参数名
def print_info_sort():
gl_list = [6, 4, 9]
# 默认按照升序排序
gl_list.sort()
# 如果需要降序排序,需要执行reverse参数
gl_list.sort(reverse=True)
print(gl_list)
print_info_sort()
指定函数的缺省参数:在参数后使用赋值语句,可以指定参数的缺省值
def print_info(name, gender=True):
"""
假设班上男生居多
:param name:班上同学的姓名
:param gender: True男生 False女生
:return:
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s是%s" % (name, gender_text))
print_info("小明")
print_info("小美", False)
注:
- 缺省参数需要使用最常见的值作为默认值
- 如果一个参数的值不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递
- 带有默认值的缺省参数必须在参数列表末尾
- 在调用函数时,如果有多个缺省参数,需要指定参数名
多值参数
多值参数指一个函数能够处理的参数个数是不确定的,这个时候就可以使用多值参数
python中有两种多值参数:
- 参数名前增加一个"*"可以接收元组
- 参数名前增加两个"*"可以接受字典
一般给多值参数命名时习惯用以下两个名字:
- *args 存放元组参数
- **kwargs 存放字典参数
def demo(num, *nums, **person):
print(num)
print(nums)
print(person)
demo(1)
print("-" * 50)
demo(1, 2, 3, 4, 5)
print("-" * 50)
demo(1, 2, 3, 4, 5, name="小明", age=18)
print("-" * 50)
数字累加案例:
def sum_numbers(*args):
num = 0
print(args)
# 循环遍历
for n in args:
num += n
return num
result = sum_numbers(1, 2, 3, 4)
print(result)
元组和字典的拆包
在调用带有多值参数的函数时,如果希望:
- 将一个元组变量直接传递给args
- 将一个字典变量直接传递给kwargs
就可以用拆包,简化参数的传递,拆包的方式:
- 在元组变量前增加一个*
- 在字典变量前增加两个*
def demo3(*args, **kwargs):
print(args)
print(kwargs)
# 需要将一个元组变量/字典变量传递给函数对应的参数
gl_nums = (1, 2, 3)
gl_xiaoming = {"name":"小明", "age":18}
# 会把num_tuple 和 xiaoming 作为元组传递个args
# demo3(gl_nums, gl_xiaoming) 不拆包会都传递给第一个参数
demo3(*gl_nums, **gl_xiaoming)