Python基础(十): 函数的基本概念
2018-03-03 本文已影响7人
伯wen
函数的概念
- 概念: 写了一段代码实现了某个小功能; 然后把这些代码集中到一块, 起一个名字; 下一次就可以根据这个名字再次使用这个代码块, 这就是函数
- 作用
- 方便代码的重用
- 分解任务, 简化程序逻辑
- 使代码更加模块化
- 函数分类
- 内建函数: Python中已经存在的函数
- 三方函数: 其他人写的函数, 我们只需要调用
- 自定义函数: 根据需求, 我们自己写的函数
函数的基本使用
- 定义:
def 函数名(参数列表):
函数体
- 调用:
函数名(参数列表)
无参无返回值函数
- 没有参数, 也没有返回值的函数
def test():
print(1 + 2)
test() # 打印: 3
函数的参数
-
单个参数的函数
- 定义
def test(num): print(num ** 2)
- 调用
test(3) # 打印: 9
- 上述代码中,
num
是形参, 函数调用时的3
是实参
-
多个参数的函数
- 定义
def sum(num1, num2, num3): print(num1 + num2 + num3)
- 调用:
# 形参与实参一一对应 sum(1, 2, 3) # 打印: 6
# 指明形参名称, 不需要按照顺序 sum(num3 = 3, num1 = 1, num2 = 2) # 打印: 6
-
不定长参数: 不同的应用场景, 传递参数数量不等
- 参数为元组: 在参数名前添加一个
*
, 表示该函数参数数量不固定, 在函数内参数以元组的方式使用- 定义
def sum(*args): result = 0 for i in args: result += i print(result)
- 调用
sum(1, 2, 3, 4) # 打印: 10
- 参数为字典: 在参数名前添加
**
, 表示该函数参数数量不固定, 在函数内参数以字典的方式使用, 调用该函数时需要指明参数的key
和value
- 定义:
def info(**kwargs): print("我的名字是 %s, 年龄是 %d" % (kwargs["name"], kwargs["age"]))
- 调用
info(name="张三", age=18) # 打印: 我的名字是 张三, 年龄是 18
- 装包: 把传递的参数, 包装成一个集合, 称之为"装包", 上述两种方式都是装包的过程
- 拆包: 把集合参数, 再次分解成单独的个体, 称之为"拆包"
- 现有如下函数
def sum(*args): print(args)
- 我们现在知道,
sum
函数中的args参数, 是一个元组, 那么如果我们在函数调用时传入一个元组
tuple = (1, 2, 3, 4) sum(tuple) # 打印: ((1, 2, 3, 4),)
- 很明显, 传入的元组被装包成了一个嵌套元组
- 如果我们想要传入的元组, 在
sum
函数内部的args
与实参tuple
一样, 则需要拆包
sum(*tuple) # 打印: (1, 2, 3, 4)
- 参数为字典, 与之类似
def info(**kwargs): print(kwargs)
dic = {"name" : "张三", "age" : 18} info(**dic) # 打印: {'name': '张三', 'age': 18}
- 拆包的应用场景, 可以用字典拆包的方式给多参数函数传递实参
def sum(num1, num2): print(num1 + num2)
dic = {"num1" : 1, "num2" : 2} sum(**dic) # 打印: 3
- 参数为元组: 在参数名前添加一个
-
缺省参数: 函数定义时, 可以给某些参数设置默认值, 调用时可以不传递该参数, 使用默认值
- 定义
def sum(num1 = 1, num2 = 2): print(num1 + num2)
- 调用
sum() # 打印: 3 sum(num2 = 5) # 打印: 6
-
注意事项:
- 函数调用时, 参数传递分为两种, 分别为 值传递 和 地址传递
- 值传递: 调用函数时, 函数内修改形参的值, 函数外的实参不变
- 地址传递: 调用函数时, 将实参的地址传递给形参, 形参改变值, 实参的值也会改变
- Python中只有地址传递, 没有值传递
Pyhton中参数的地址传递分为两种
- 当实参是不可变的数据类型时, 函数内形参改变, 不会改变实参
- 当实参是可变的数据类型时, 函数内形参改变, 实参也会改变
函数的返回值
- 当我们通过某个函数, 处理好数据之后, 想要拿到处理的结果, 就是函数的返回值
- 语法
def 函数名(参数列表): 函数体 return 返回值
- 注意事项
-
return
后面的代码不会被执行 - 一个函数只有一个返回值, 只会返回一次
- 如果想要返回多个值, 需要把这些值包装成集合, 例如元组, 列表, 字典...
-
函数的使用描述
- 场景: 为我们自己写的函数添加注释, 方便自己和其他人使用
- 定义: 直接在函数体的最上面, 添加三个双引号对注释
def 函数名(参数列表):
'''这里是函数的使用描述(注释)'''
函数体
- 示例:
def sum(num1, num2):
'''
求两个数的和
:param num1: 数值1, 数值类型
:param num2: 数值2, 数值类型
:return: 返回两个数的和, 数值类型
'''
retrun num1 + num2
- 可以使用
help(函数名)
函数来查看一个函数的使用文档
help(sum)
# 打印如下:
Help on function sum in module __main__:
sum(num1, num2)
求两个数的和
:param num1: 数值1, 数值类型
:param num2: 数值2, 数值类型
:return: 返回两个数的和, 数值类型
- 函数的注释一般需要说明三点: 函数的功能, 参数和返回值