函数
什么是函数
在程序中,函数就是具备某一功能的工具,事先将准备好的工具准备好就是函数的定义
为什么要用函数
没有函数的话,写程序的时候会遇到以下问题:
-
程序长
-
扩展性差
-
可读性差
如何用函数:
先定义函数,再使用函数
函数的分类:内置函数和自定义函数
定义函数
语法
有参数函数,及应用场景
在函数定义阶段括号内有参数,成为有参函数
注意: 定义时有参,意味着调用的时候也必须传入参数
如果函数逻辑代码需要依赖外部传入的值。必须定义为有参函数
无参数函数,及应用场景
定义函数时,参数是函数体接收外部传值的一种媒介,其实就是一个变量名
在函数阶段,括号内没有参数,成为无参函数
注意:定义时无参,意味着调用的时候也无需传入参数
如果代码逻辑不需要依赖外部传入的值,则必须定义为无参函数
空函数,及应用场景
当你知道你需要实现某种功能的时候,但不知如何代码实现的时候,你可以暂时写一个空函数
def func():
pass
调用函数
函数名() 即调用函数
会执行函数代码,直到碰到return 或者执行完函数内所有代码结束
如何调用函数
函数调用的三种方式
def max_self(x,y):
if x>y:
return x
else:
return y
# 1
max_self(1,2)
# 2
res = max_self(1,2)
# 3
max_self(max_self(2000,3000),4000)
函数的返回值
函数参数的应用:形参和实参,位置形参,位置实参,关键字实参,默认形参,*args **kargs
形参
在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名
实参
在函数调用阶段,括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值
位置形参
在函数定义阶段按照从左到右的循序依次定义的形参,称之为位置形参
特点:按照为之定义的形参,都必须被传值,多一个也不行少一个也不行
位置实参
在函数调用阶段,按照从左到右的顺序依次定义的实参,被称之为位置实参
特点: 按照位置为对应的形参依次传值
关键字实参
在调用函数时,按照key=value的形势为指定的参数传值,成为关键字实参
特点:可以打破位置的限制,但仍能为指定的形参赋值
注意:
-
可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边
-
可以混用位置实参和关键字实参,但是不能对一个形参重复赋值
默认形参
在定义阶段就已经被赋值。
特点,在定义阶段就已经被赋值,意味着调用时可以不用为他赋值
注意:
-
位置形参必须放在默认形参的左边
-
默认形参的值,之在定义阶段复制一次,也就是说默认参数的值在函数定义阶段就已经固定
-
默认参数的值通常是不可变类型
总结:
实参的应用:取决于个人习惯
形参的应用:
-
大多数情况的调用值不一样,变化较大,就应该将该参数定义成位置形参
-
大多数情况的调用之一样,变化较小,就应该将该参数定义成默认形参
高级函数(函数对象)
可变长参数:指的是在调用函数时,传入的参数个数可以不固定
调用函数时,传值的方式无非两种,一种为位置实参,一种是关键字实参,因此形参也必须有两种解决方法,以此来分别接受溢出的位置实参(*)和关键字实参(**)
可变长实参 *
实参中的* ,* 会将*后参数的值循环取出,打散成位置实参,以后但凡碰到实参中带 *的,他就是位置实参,应该马上打散成位置实参去看
可变长形参 **
形参中的 **会将溢出的关键字实参全部接受,然后存储字典的形势,然后把字典赋值给 * *后的参数, 约定俗成 * * 后的参数名为kwargs
可变长实参之**
实参中的**,会将后参数的值循环取出,打散成关键字实参
命名关键字形参
需求: 函数的使用者必须按照关键字实参传
命名关键字形参,在函数定义阶段,* 后面的参数都是命名关键字参数
特点: 在传值的时候,必须按照key=value的方式传值,而且key鼻血命名关键字参数指定的参数名
函数对象的四大功能
-
引用
-
当做参数传给一个函数
-
可以当做函数的返回值
-
可以当做容器类型的元素
函数嵌套
函数内部定义的函数,无法在函数外部使用内部定义的函数
函数内部的函数只能在函数内部调用
作用域和名称空间
内置名称空间
存放python解释器自带的名字,如int float 等
生命周期,再解释器启动时生效,再解释器关闭时失效
全局名称空间
全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间下,如x,fun , z
生命周期:在文件执行时生效,在文件执行结束后失效
局部名称空间
局部名称空间: 用于存放函数调用期间函数体产生的名字
生命周期:在文件执行函数调用期间生效,在函数执行结束后失效
加载顺序
内置------->全局------->局部
查找顺序
局部------->全局-------->内置 ( 从当前位置开始查找,如果当前位置为全局,则为全局)
闭包函数
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)
闭包函数: 函数内部函数对外部作用域而非全局作用域的引用
提示 :我们之前都是通过参数将外部的值传给函数,闭包提供另外一种思想
两种方式: 使用参数的形式 包给函数
装饰器
什么装饰器,指为装饰器对象添加额外功能,因此定义一个装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能
注意:
-
装饰器本身其实是可以任意可调用的对象
-
被装饰的对象也可以是任意可调用的对象
为什么要用装饰器:例如。我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改该方法的使用模式,这时候可以使用装饰器,因为一旦软件上线后,一般对修改源代码是封闭的,对于扩展功能是开放的
两大原则:
-
不修改被装饰对象的源代码
-
不修改被装饰对象的调用方式
第一种传参方式:改变调用方式
第二种传参方式:包给函数-外包