python基础-函数详解
文章目录
python基础-函数详解
一、什么是函数
函数:就是一套定义好的流程,输入数据得到结果。函数之间可能相互独立,也可能一个函数的输入是另一个函数的输出,也可能一个函数的内部调用另一个函数。
或者说是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集
二、函数的作用
使用函数可以加强代码的复用性,提高程序编写的效率
三、定义函数
python中函数结构:
def 函数名(参数1,参数2,参数3):
函数体第一行
函数体第二行
……
函数体第N行
return 返回值
一个函数可以有参数,也可以没有参数。如果没有参数函数名后面为一对括号,如果函数有
参数参数可以有一个,也可以有很多个参数,可以以任何数据类型,函数参数,甚至可以是另
一个函数。
函数可以没有return语句,有一个return语句,也可以有多个return语句。
下面3种情况是等价的:
1.没有return语句。
2.Return语句后无任何值。
3.Return None
在函数中可以使用return将里面的结果返回。出来。哪一代运行到了return,那么函数就会结束
return后面的代码都不会被执行。
在一个Python工程中,应保证每个函数名称唯一,函数体就是这个函数需要执行的一系列操作
操作可能只有一行。也可能有很多行。
函数只做一件事Python编码规范建议一个函数的函数体不超过20行代码,如果超过,说明这个函数做了不止一件事,就应该把这个函数拆分成为更小的函数。
四、函数的作用域和命名空间
1.作用域(scope):变量生效的区域
在Python中一共有两种作用域
全局作用域:(类似于windows中path环境变量)
- 全局作用域在程序执行时创建,在程序执行结束时销毁
- 所有函数以外的区域都是全局作用域
- 在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问
函数作用域:
- 函数作用域在函数调用时创建,在调用结束时销毁
- 函数每调用一次就会产生一个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
变量的查找(类似于windows中环境变量的查找)
- 当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,如果没有则继续去上一级作用域中寻找,如果有则使用,如果依然没有则继续去上一级作用域中寻找,以此类推 直到找到全局作用域,依然没有找到,则会抛出异常
NameError: name ‘a’ is not defined
2.命名空间(namespace)
- 命名空间:变量存储的位置,每一个变量都需要存储到指定的命名空间当中
每一个作用域都会有一个它对应的命名空间
全局命名空间,用来保存全局变量。函数命名空间用来保存函数中的变量
命名空间实际上就是一个字典,是一个专门用来存储变量的字典
locals()用来获取当前作用域的命名空间
如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间,返回的是一个字典,可以通过字典的的修改方式添加或者删除变量。
五、调用函数
函数之间可以串行运行数据,先由一个函数处理,在有另一个还出处理函数,也可以嵌套运行在一个函数里面调用另一个函数,当然在函数里面还可以定义函数,这个属于高级函数。
1.函数递归:
整体思想是,将一个大问题分解为一个个的小问题,直到问题无法分解时,再去解决问题
递归式函数的两个要件
1.基线条件
- 问题可以被分解为的最小问题,当满足基线条件时,递归就不在执行了
2.递归条件
- 将问题继续分解的条件
递归和循环类似,基本是可以互相代替的,
循环编写起来比较容易,阅读起来稍难
递归编写起来难,但是方便阅读
2.高阶函数:
接收函数作为参数,或者将函数作为返回值的函数是高阶函数
当我们使用一个函数作为参数时,实际上是将指定的代码传递进了目标函数
五、函数中的参数
1.形参:
定义形参时,可以为形参指定默认值
指定了默认值以后,如果用户传递了参数则默认值没有任何作用
如果用户没有传递,则默认值就会生效
2.实参的传递方式
位置参数
位置参数就是将对应位置的实参复制给对应位置的形参
第一个实参赋值给第一个形参,第二个实参赋值给第二个形参 。。。
fn(1 , 2 , 3)
关键字参数
关键字参数,可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数
fn(b=1 , c=2 , a=3)
print(‘hello’ , end=’’)
位置参数和关键字参数可以混合使用
混合使用关键字和位置参数时,必须将位置参数写到前面
fn(1,c=30)
不定长参数:
在定义函数时,可以在形参前边加上一个*,这样这个形参将会获取到所有的实参
它将会将所有的实参保存到一个元组中
*a会接受所有的位置实参,并且会将这些实参统一保存到一个元组中(装包)
带星号的形参只能有一个
*形参只能接收位置参数,而不能接收关键字参数
def fn3(*a) :
print('a =',a)
**形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中
字典的key就是参数的名字,字典的value就是参数的值
**形参只能有一个,并且必须写在所有参数的最后
六、python函数的注意事项
函数参数的类型决定了它的作用范围。
按住外面的容器类作为参数传递到函数中之后,如果函数修改了这个容器里面的值,那么函数外面的容器也会受到影响,但是函数外面的普通变量作为参数传递到函数中,并且函数修改了这个参数是外面的变量不受影响。