函数
1.什么是函数
- 概念
函数就是实现某一特定功能的代码封装,一个函数对应一个功能。
- 分类
- 系统函数 – 由Python语言已经创建好的函数(Python自带的函数)。
- 自定义函数 – 由程序员自己创建的函数。
2.定义函数
1.语法
def 函数名(形参列表):
函数说明文档
函数体
2.说明:
-
def – 关键字固定写法。
-
函数名 – 由程序员自己命名。
-
要求:是标识符,不能是关键字。
-
范围:见名知意、不能使用系统函数名、类名、模块名,字母都小写,多个单词用下划线隔开。
-
形参列表
- 以’变量名1, 变量名2, 变量名3,…'的形式存在,这儿每一个变量就是一个形参;形参可以一个都没有,也可以有多个。
- 形参可以将函数外部数据传递到函数内部。
- 定义函数的时候需不需要形参需要几个看实现函数的功能需不需要额外的数据,需要几个。
-
函数说明文档
- 本质就是和def保持一个缩进的多行注释;用来对函数的功能、参数、和返回值进行说明。
-
函数体 - 实现函数功能的代码
#例:写一个函数统计指定字符串中数字字符的个数
def count_num(str1):
"""统计数字字符个数"""
count = 0
for x in str1:
if x.isdigit():
count += 1
print(count)
#例:定义一个函数,获取指定列表中所有数字元素
def get_num(list1):
"""获取数字元素"""
new_list = []
for x in list1:
if type(x) in (int, float):
new_list.append(x)
print(new_list)
3.调用函数
-
函数在定义时不会执行函数,只有在调用时才会执行。
-
调用语法:函数名(实参列表)
- 函数名 ---- 需要哪个函数的功能就调用哪个函数,想要调用哪个函数就写哪个函数的函数名。
- 函数名必须是已经定义过的函数名
- 实参列表 ---- 以 ‘数据1, 数据2, 数据3,…’ 的形式存在;实参就是真正通过形参传递到函数内部的数据实参的个数由形参决定,默认情况被调用的函数有多少个形参调用的时候就需要多少个实参
-
函数调用过程 – 代码执行到函数调用语句的时候
- 第一步:回到函数定义位置
- 第二部:传参(用实参给形参赋值的过程),传参的时候必须保证每个形参都有值
- 第三部:执行函数体
- 第四部:确认返回值
- 第五步:回到函数调用的位置,继续往后执行代码
4.函数的参数
4.1位置参数和关键字参数
- 位置参数
调用函数的时候直接将多个数据用逗号隔开,实参和形参从位置上一一对应。
- 关键字参数
调用函数的时候,在数据前面加上“形参名 = ”,实参和形参由形参名来对应
- 两种参数混合使用
要求必须保证位置参数在关键字参数的前面
def func1(x, y, z):
print(f"x:{x}, y:{y}, z:{z}")
func1(10, 20, 30)
func1(x=10, y=20, z=30)
func1(z=3, x=1, y=2)
func1(10, z=10, y=30)
4.2参数默认值
-
定义函数的时候可以给形参赋默认值,调用函数的时候已经有默认的参数可以不用传参,直接只用默认值
-
如果是给部分参数赋默认值,必须保证没有默认值的参数在有默认值参数的前面
4.3参数类型说明
参数类型说明 ---- 定义函数的时候指定参数类型
-
没有默认值的参数添加类型说明 ---- 形参名:数据类型
-
有默认值的参数,默认值的类型就是参数的类型
4.4不定长参数
- 带*的不定长参数
- 在形参前面加*,那么这个参数就变成一个元组,用来接收对应的所有的实参(实参是元组的元素)
- 如果函数参数在带*的参数的后面,那么后面的这些参数在调用的时候必须使用关键字参数
def sum1(*nums):
print(nums)
sum1(10, 20)
sum1(2, 34, 5)
sum1(10, 29, 38, 9, 19)
sum1(1)
sum1()
5.函数的返回值
- 什么是返回值
意义:返回值就是从函数内部传递到函数外部的数据
-
如何确定返回值
- 在函数体中,将需要返回的数据放到return的后面
- return后面的值是多少,函数的返回值就是多少,如果没有return,就返回值None
-
如何获取返回值
- 在函数外部获取函数调用表达式的结果
- 函数调用表达式的值就是函数的返回值
-
什么时候需要返回值
- 如果实现函数的功能产生了新的数据,将新的数据作为返回值返回
6.匿名函数
- 匿名函数本质还是函数,除了定义语法不同外,其他东西都一样
(* ̄(oo) ̄):匿名函数只能实现功能很简单的函数
- 语法:
函数名 = lambda 形参列表:返回值
7.变量的作用域
7.1变量的作用域
- 变量的作用域:变量定义以后可以使用的范围
- 根据作用域的不同我们将变量分为全局变量和局部变量两种
7.2全局变量
-
没有定义在函数和类里面的变量都是全局变量
-
全局变量的作用域是从定义开始到程序结束
-
全局变量保存在全局的栈区间,全局栈区间在程序结束后才会自动释放
7.3局部变量
-
定义在函数中的变量是局部变量,其中包括形参
-
局部变量的作用域是从定义开始到函数结束
(* ̄(oo) ̄):调用函数的时候系统会自动给这个函数创建一个临时栈区间用来保存在函数中产生的数据(包括局部变量),当函数调用结束这个临时栈区间会自动释放。
8.函数就是变量
-
在Python中定义函数其实就是定义类型是function的变量,函数名就是变量名(变量能做的事情函数都能做)。
-
高阶函数:实参高阶函数、返回值高阶函数
- func1是实参高阶函数 – 因为他有一个参数是函数
- func2是返回值是高阶函数
9.实参高阶函数
9.1常用的实参高阶函数:
max, min, sorted(sort), map, reduce
-
max(序列) ---- 求序列中值最大的元素
-
max(序列, key=函数) ---- 根据函数指定的规则获取序列中最大的元素
- 函数要求:有且只有一个参数;有一个返回值
-
min(序列, key=函数) ---- 根据函数指定的规则获取序列中最小的元素
-
sored(序列, key=函数) - 根据函数指定的规则对序列中的元素进行从小到大排序
-
列表.sort(序列, key=函数) - 根据函数指定的规则对序列中的元素进行从小到大排序
9.2map
将序列中的元素按照函数指定的规则进行变换得到一个新的序列
①map(函数, 序列)
- 函数要求:
- 有且只有一个参数(代表原序列中的元素)
- 有一个返回值(新序列中的元素)
②map(函数, 序列1, 序列2)
- 函数要求:
- 有且只有2个参数(分别代表原序列中元素)
- 有一个返回值(新序列中的元素)
③map(函数, 序列1, 序列2, 序列3)
- 函数要求:
- 有且只有3个参数(分别代表原序列中元素)
- 有一个返回值(新序列中的元素)
④map(函数, 序列1, 序列2, 序列3,…)
9.3reduce
将序列中的元素按照指定的规则合并成一个数据
语法:reduce(函数, 序列, 初始值)
初始值:一般是0、1或者空串
- 函数要求
- 有且只有两个参数(第一个参数指向初始值;第二个参数指向序列中的每个元素)
- 有一个返回值(决定合并方式)
(* ̄(oo) ̄):使用reduce之前必须先从functools模块中导入