函数参数和返回值的作用
定义函数时, 是否接受参数, 或者返回结果, 是根据实际的功能需求来决定的!
如果函数内部处理的数据不确定, 就可以将外界的数据以参数传递到函数内部
如果希望一个函数执行完成后, 向外界汇报执行结果, 就可以增加函数的返回值
函数的返回值 进阶
return 一次其实只能返回一个数据, 如果要实现一次返回多个数据, 可以使用 "容器" 装起来 => 比如 Python 的 tuple,Java 的数组
函数多个返回值
- def measure():
- """
- 测量温度和湿度
- :return: 同时返回温度和湿度
- """ print(" 测量开始...")
- temp = 39
- wetness = 50
- print("测量结束...")
- # 元组 - 可以包含多个数据, 因此可以使用元组让函数一次返回多个值
- # 如果函数返回的类型是元组, 小括号可以省略
- # return (temp,wetness)
- return temp,wetness
- # result 接受的是一个元组
- result = measure()
- print(result)
- # 如果函数返回的类型是元组, 同时希望单独的处理元组中的元素
- # 可以使用多个变量, 一次接受函数的返回结果
- gl_temp,gl_wetness = measure()
- print(gl_temp)
- print(gl_wetness)
面试题 -- 交换两个数字
题目要求
有两个整数变量, a=6,b=100
不使用其他变量, 交换两个变量的值
- a = 6
- b = 100
- # 解法 1: 使用中间变量
- temp = a
- a = b
- b = temp
- # 解法 2 : ^ 的运算性质,
- a = a ^ b
- b = a ^ b
- a = a ^ b
- # 解法 3: Python 专用
- # 提示: 等号的右边是一个元组, 只是把小括号省略
- a, b = b, a
函数的参数 进阶
针对函数参数的赋值
在函数内部, 针对参数使用赋值语句, 是不会影响调用函数时传递的实参变量
无论传递的参数是可变还是不可变, 只要是针对参数使用赋值语句, 只会在函数内部修改局部变量的引用, 不会影响到外部变量的引用
一句话: 针对函数参数的赋值是不会影响到外界的, 而是新建一个同名局部变量
- def demo(num,num_list):
- print("函数内部的代码")
- # 在函数内部, 针对函数参数使用赋值语句, 不会修改到外部的实参变量
- num = 100
- num_list = [1,2,3]
- print(num)
- print(num_list)
- print("函数执行完成")
- gl_num = 99
- gl_list = [4,5,6]
- # 把全局变量作为实参传递进去
- demo(gl_num,gl_list)
- print(gl_num)
- print(gl_list)
通过方法来改变可变类型的函数参数
如果传递的参数是可变类型, 在函数内部, 使用方法修改了数据的内容, 同样会影响到外部的数据
针对函数的参数, 赋值不能改变外部, 但是可变类型通过方法可以影响外部
- def demo(num_list):
- print("函数内代码")
- # 使用方法修改列表的内容
- num_list.append(9)
- print(num_list)
- print("函数执行完成")
- gl_list = [1,2,3]
- demo(gl_list)
- print(gl_list)
面试题 -- +=
在 Python 中, 列表变量调用 += 本质上是在执行列表变量 extend 方法, 不会修改变量的引用 => 正常是改变变量的引用的, 但是 += 相当于列表的 extend(), 不会改变列表的引用
- In [1]: a = 1
- In [2]: var1 = id(a)
- In [3]: a += 1
- In [4]: var2 = id(a)
- In [5]: var1 == var2
- Out[5]: False
- # 上下两者是不一样的
- # 前者是相加再重新赋值, 后者是调用 list.extend()
- num_list = num_list + num_list
- num += num_list
- def demo(num, num_list):
- print("函数开始")
- # num += num => num = num + num
- num += num
- # 列表使用 += 不会做相加再赋值的操作!
- # num_list += num_list => num_list.extend()
- num_list += num_list
- print(num)
- print(num_list)
- print("函数完成")
- gl_num = 9
- gl_list = [1, 2, 3]
- demo(gl_num,gl_list)
- print(gl_num)
- print(gl_list)
缺省参数
定义函数时, 可以给某个参数指定一个默认值, 具有默认值的参数叫做缺省参数 => 也就是提前给函数参数确定默认值
调用函数时, 如果没有传入缺省参数的值, 则在函数内部使用定义函数时指定的参数默认值
函数的缺省参数, 将常见的值设置为参数的缺省值, 从而简化函数的调用
list.sort() 的缺省值
- gl_list = [6,3,9]
- # 默认就是升序排序, 因为这种应用需求
- gl_list.sort()
- print(gl_list)
- # 只有当需要降序排序时, 才需要传递 reverse 参数
- gl_list.sort(reverse=True)
- print(gl_list)
指定函数的缺省参数
在参数后面使用赋值语句, 可以指定参数的缺省值
- # 假设班上的男生较多, 所以这里使用男生作为缺省值
- def print_info(name,gender=True):
- """
- :param name: 班上同学的名字
- :param gender: True 男生 False 女生
- """ gender_text =" 男生 "
- if not gender:
- gender_text = "女生"
- print("%s 是 %s" % (name,gender_text))
- print_info("小明")
- print_info("小美",gender=False)
提示
缺省参数, 需要使用最常见的值作为默认值! => 比如 gender=True
如果一个参数的值不能确定, 则不应该设置默认值, 具体的数值在调用函数时, 由外界传递! => 比如 name 基本每个都不一样, 就不应该设置默认值
缺省参数的注意事项
缺省参数的定义位置
必须保证带默认的缺省参数 在参数列表末尾
所以, 以下定义是错误的!
- # 下面缺省函数参数的位置是错误的
- def print_info(name,gender=True,title)
调用带有多个缺省参数的函数
在调用函数时, 如果有多个缺省参数, 需要指定参数名, 这样解释器才能够知道参数的对应关系!
- # 假设班上的男生较多, 所以这里使用男生作为缺省值
- def print_info(name,title="",gender=True):
- """
- :param title: 职位
- :param name: 班上同学的名字
- :param gender: True 男生 False 女生
- """ gender_text =" 男生 "
- if not gender:
- gender_text = "女生"
- print("[%s] %s 是 %s" % (title,name,gender_text))
- print_info("小明")
- print_info("小美",gender=False)
- print_info("老王",title="班长")
多值参数 (知道)
定义支持多值参数的函数
有时可能需要一个函数能够处理的参数个数时不确定的, 这个时候, 就可以使用多值参数
Python 中有两种多值参数:
参数名前面增加一个 * 可以接受元组
参数名前面增加两个 * 可以接受字典
一般在给多值参数命名时, 习惯使用以下两个名字
*args-- 存放元组参数, 前面有一个 *
**kwargs -- 存放字典参数, 前面有两个 *
args 是 arguments 的缩写, 有变量的含义, kw 是 keyword 的缩写, kwargs 可以记忆键值对参数
多值参数
- def demo(num, *args, **kwargs):
- print(num)
- print(args)
- print(kwargs)
- # num ( ) { }
- demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
提示: 多值参数的应用会经常出现在网络上一些大牛开发的框架中, 知道多值参数, 有利于我们能够读懂大牛的代码
多值参数案例 -- 计算任意多个数字的和
需求
定义一个函数 sum_numbers, 可以接受任意多个整数
功能要求: 将传递的所有数字累加并返回累加结果
- def sum_numbers(*args):
- # 打印 args 这个元组
- print(args)
- return sum(args)
- result = sum_numbers(1,2,3,4,5)
- print(result)
元组和字典的拆包
在调用带有多值参数的函数时, 如果希望:
将一个元组变量直接传递给 args
将一个字典变量直接传递给 kwargs
就可以使用拆包, 简化参数的传递, 拆包的方式时:
在元组变量前, 增加一个 *
在字典变量前, 增加两个 *
- ```python
- def demo(*args,**kwargs):
- print(args)
- print(kwargs)
元组变量 / 字典变量
- gl_tuple=(1,2,3)
- gl_dict = {
- "name":"小明","age":18
- }
拆包语法, 简化元组变量 / 字典变量的传递
- demo(*gl_tuple,**gl_dict)
- ```
函数的递归
递归函数的特点
[Python] 函数进阶
来源: http://www.bubuko.com/infodetail-3282391.html