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函数的注意事项

函数参数的类型决定了它的作用范围。
按住外面的容器类作为参数传递到函数中之后,如果函数修改了这个容器里面的值,那么函数外面的容器也会受到影响,但是函数外面的普通变量作为参数传递到函数中,并且函数修改了这个参数是外面的变量不受影响。

发布了59 篇原创文章 · 获赞 213 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42767604/article/details/105150344
今日推荐