认识函数和定义函数
1.认识函数
- 概念:函数就是对实现某一特定功能的代码的封装 - 机器
- 函数的分类
- 系统函数(系统造好的机器) - 由Python创建好的函数,例如:print、input、type、max、min、id等
- 自定义函数(自己造机器) - 由程序员自己创建的函数
2.定义函数(创建函数)- 造机器
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
- def - 关键字;固定写法
- 函数名 - 由程序员自己命名
- 要求:是标识符;不能是关键字
- 规范:
- 见名知义(看到函数名大概知道这个函数的功能是什么);
- 所有的字母都小写,多个单词之间用下划线隔开
- 不使用系统的函数名、类名和模块名
- () - 固定写法
- 形参列表 - 以变量名1, 变量名2, 变量名3,…格式存在
- 这儿的每一个变量就是一个形参,如果不需要形参,括号里面什么都不写
- 形参是用来将函数外部的数据传递到函数内部(可以理解成连接函数外部和内部的通道)
- 需不需要形参就看实现函数的功能需不需要额外的数据
- : - 固定写法
- 函数说明文档 - 本质就是文档注释
- 函数体 - 和def保持一个缩进的一条或者多条语句;
- 函数体就是实现函数功能的代码
练习:定义一个函数,求任意两个数的和
def sum_1(num1, num2):
return num1 + num2
num1 = 10
num2 = 3
print(sum_1(num1, num2)) # 13
练习:定义一个函数,求N的阶乘
def factorial(n):
result = 1
for i in range(1, n+1):
result *= i
return result
print(factorial(n = 10)) # 362800
初学者定义函数的基本流程:
- 确定函数功能
- 根据函数功能确定函数名
- 确定形参(看实现函数的功能需不需要额外的数据,需要几个)
- 实现函数的功能(将形参当成对应的数据来使用)
- 确定函数返回值
- 写函数说明文档
调用函数
- 定义函数的时候不会执行函数体(重要!)
- 调用函数
- 语法:函数名(形参列表)
- 说明:
- 函数名 - 需要使用的函数的名字(函数名必须是已经定义过的函数的函数名)
- () - 固定写法
- 实参列表 -
- 多个数据用逗号隔开:数据1, 数据2, 数据3, …
- 原则上定义函数的时候有多少个形参,调用函数就需要多少个实参
- 函数调用过程
- 当代码执行到函数调用表达式的时候:
- 回到函数定义的位置,用实参给形参赋值
- 执行函数体
- 确定函数返回值
- 回到函数调用的位置,接着往后执行
- 当代码执行到函数调用表达式的时候:
返回值
1.返回值 - 将函数内部的数据传递到函数外部
1)怎样将一个数据作为函数的返回值
语法:return 需要返回的数据(需要从函数内部传递到外部的数据)
2)怎样在函数外部获取函数的返回值
获取函数调用表达式的值,就是获取函数的返回值。(函数调用表达式的值就是函数的返回值)
返回值能做的事情,函数调用表达式都可以做
def sum1(num1, num2):
return num1+num2
num1 = 20
num2 = 30
num3 = sum1(num1, num2)
print(num3 + 10) # 60
def func(x, y):
x.append(y*2)
return x
list1 = [func([10, 20], 30), 'abc']
print(list[0][-1]) # 60
return关键字
return的作用有两个:
- 确定函数返回值(将函数内部的数据传递到函数外部)
- 提前结束函数(执行函数体的时候如果遇到了return,那么函数直接结束)
def func1():
print('======')
return
print('++++++')
print('------')
func1() # ======
def download(state):
if not state:
return
print('连接服务器')
download(True) # 连接服务器
def odevity(num):
if num % 2:
return '奇数'
return '偶数'
print(odevity(343)) # 奇数
函数的参数
1.位置参数和关键字参数
- 位置参数 - 直接将多个数据用逗号隔开,让实参和形参从位置上一一对应(第一个实参给第一个形参赋值)
- 关键字参数 - 以
'形参=实参'
的形式传参 - 位置参数和关键字参数混用 - 位置参数必须在关键字参数的前面
def func1(x, y, z):
print(f'x:{x}, y:{y}, z:{}')
# 位置参数
func1(10, 20, 30) # x:10, y:20, z:30
# 关键字参数
func1(x=10, y=20, z=30) # x:10, y:20, z:30
# 混用
func1(10, 20, z=30) # x:10, y:20, z:30
func1(10, z=30, y=20) # x:10, y:20, z:30
2.参数默认值
- 定义函数的时候可以通过
'形参=实参'
给参数赋默认值,调用函数的时候有默认值的参数可以不用传参 - 定义函数的时候可以只给部分参数赋默认值,那么这个时候没有默认值的参数必须在有默认值参数的前面
def func2(x=10, y=20, z=30):
print(f'x:{x}, y:{y}, z:{z}')
func2() # x:10, y:20, z:30
func2(100) # x:100, y:20, z:30
func2(100, 200) # x:100, y:200, z:30
func2(100, 200, 300) # x:100, y:200, z:300
func2(y=200) # x:10, y:200, z:30
3.参数类型说明和返回值类型说明
参数类型说明:
- 无默认值的参数:类型名
- 参数赋默认值
返回值类型说明: ->类型名
def func3(x: list, y='') -> list:
return [10, 20, 30]
print(func3([10])) # [10, 20, 30]
4.不定长参数 - 一个形参可以同时接收多个实参
- 在参数名前加
*
,那么这个参数就可以同时接收多个参数(必须是位置参数)- 原理:带*的参数会变成一个元组,接收到的实参会变成元组中的元素
注意:带*的不定长参数在传参的时候只能用位置参数
def func4(x, y, *z):
print(f'x:{x}, y:{y}, z:{z}')
func4(10, 20, 30, 40, 50) # x:10, y:20, z:(30, 40, 50)
!!!如果定长参数在*对应的不定长参数的后面,定长参数在传参的时候必须使用关键字参数
def func5(*x, y, z):
print(f'x:{x}, y:{y}, z:{z}')
func5(10, 20, y=30, z=40) # x:(10, 20), y:30, z:40
def func6(z, *y, z):
print(f'x:{x}, y:{y}, z:{z}')
func6(10, 20, 30, 40, z=100) # x:10, y:(20, 30, 40), z:100
!!!定义函数的时候,如果参数中有一个独立的*,它的作用是让你调用这个函数的时候*
后面的参数必须用关键字
def func7(x, *, y, z):
pass
func(10, y=100, z=200)
- 在参数名前加
**
,那么这个参数就可以同时接收多个实参(必须是关键字参数)- 原理:带
**
的参数会变成一个字典,接收到的实参会变成字典中的键值对
- 原理:带
def func8(**x):
print(x)
func8() # {}
func8(a=10, b=20, c=30) # {'a': 10, 'b': 20, 'c': 30}