函数
1.有参:当函数的代码逻辑需要依赖外界的数据才能完成功能时
2.无参:当函数的代码逻辑不需要依赖外界的数据才能完成功能时
3.空函数::没有函数体的函数称为空函数,用来编写程序初期定于程序的结构
函数调用:
1.直接调用,函数名加()
2.在表达式中调用函数
3.可以将函数的返回,作为另一个函数的参数
参数:
大体分为:
1.形参:在函数定义阶段的参数
2.实参:调用函数时传递的值
具体分为:
1.位置参数:有几个就必须传几个,实参会按照顺序依次赋值给形参
2.关键字参数(指的是实参):可以在调用时,按照形参的名字传值,可以打破顺序限制,必须在位置参数后面
3.默认值参数,可以在定于函数时,给形参指定一个值,默认值应该设置为不可变类型
4.可变长形参:
*可变长的位置形参,可以接受溢出的位置实数,打包为一个元组类型
**可以接受溢出的位置实数,打包为一个字典类型
可变长实参:
*可以跟任何的可迭代类型(str,list,tuple,set.dict)会把后面的值打散成单个元素以位置参数传给函数
**可以跟mapping(dict)会把后面的值打散成单个key:value以关键字参数传给函数
函数嵌套:
1.嵌套调用:指的是,在函数的执行过程中调用了另一个函数,可以简化外层大函数的代码.使得结构更清晰,可以将一个大的复杂的功能拆分为多个简单的小功能
2.嵌套定义时:在函数的函数体中定义了另一个函数
内部定义的函数,外部无法直接访问和调用
唯一的使用场景就是闭包函数,除此之外不要这么写
名称空间:
namespace就是存储名字的内存空间,存储名称与内存地址绑定关系的内存空间
名称空间的分类:
1.内置名称空间:
存的是解释器自带的名称,例如print,len
特点:在程序运行过程中都有效
生命周期:随着解释器的启动而生效,随着解释器运行结束而失效
2.全局名称空间:
只要是顶着最左边写的,没有任何缩进,就在全局中
特点:在程序运行过程中都有效
生命周期:随着py文件的启动而生效,随着py文件的运行结束而失效
if 1==1:
age=1
age也是全局变量
在if中,如果顶着最左边的没有缩进的,那么if里面的名字也属于全局变量
同样的while for with 也是如此
3.局部名称空间
存的是函数内定义的名字
特点是:仅在函数调用时临时有效
生命周期:随着函数的调用而生效,随着函数的调用而失效
名字的查找顺序:
内置,全局和局部,优先使用局部,其次是全局,最后内置
名称空间的加载顺序:
内置->全局->局部
作用域:有效范围
简单的说就是名字的有效范围
存储名称的三个地方:
内置名称空间
全局名称空间
局部名称文件
由于内置名称空间的名字与全局名称空间的名字,可以在任何位置访问,所以他们可以划到同一个范围,称之为全局范围(全局作用域)
局部名称空间的名字只能在当前的函数中访问,所以它单独划分到一个范围,即局部作用域
global(全局)与nonlocal(不使用本地)关键字
global a,b #声明使用全局变量a,b
放在访问这个值之前
global:当在函数内部修改全局中名字的值
nonlocal a #声明修改外层的a,而不是定义一个新的,不能找全局变量
nonlocal:当需要在内层函数中修改外层函数中的名字
会一层一层的往外找,直到找到位置,只能找函数中的,不能找全局中的名字
函数对象
1.能够被调用
2.可以当做容器类型的元素
3.可以当做函数的参数
4.可以当做函数的返回值
函数名除了可以调用之外,与一个变量名没有本质区别,变量能怎么用,函数名就能怎么用
闭包函数:一个函数被另一个函数包裹
闭包函数也是一种函数
特点:定义在另一个函数中的
包含了对外层函数中名字的引用,无论在任何位置使用这个函数,都包含了外部名字引用
满足以上两条,就是闭包函数
名字所在的作用域,在函数定义阶段就已经固定了,与调用位置无关
目前,可以将闭包理解为,另一种为函数体传值的方式
之前只能通过参数给函数传值
现在可以通过闭包的方式