函数:
由若干语句组成的语句块、函数名称、参数列表构成,它是组织代码的最小单元 ,完成一定的功能
作用:结构化编程对代码的最基本的封装,一般按照功能组织一段代码 ,封装的目的为了复用,减少冗余代码 ,代码更加简洁美观、可读易懂
函数参数:参数调用时传入的参数要和定义的个数相匹配(可变参数例外)
位置参数:按照参数定义顺序传入实参
关键字参数:使用形参的名字来出入实参的方式,如果使用了形参名字,那么传参顺序就可和定义顺序不同 。 要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的
位置参数的可变参数:在形参前使用*表示该形参是可变参数,可以接收多个实参 , 收集多个实参为一个tuple
关键字参数的可变参数:形参前使用**符号,表示可以接收多个关键字参数 ,收集的实参名称和值组成一个字典
keyword-only参数(Python3加入) :如果在一个星号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经不是普通的 参数了,而是keyword-only参数 ,args可以看做已经截获了所有的位置参数,x不使用关键字参数就不可能拿到实参
函数func中的位置参数默认值保存在属性__defaults__中,为一个元组,可以使用func.__defaults__进行查看; 属性__kwdefaults__中使用字典保存所有keyword-only参数的默认值
参数列表参数一般顺序是,普通参数、缺省参数、可变位置参数、keyword-only参数(可带缺 省值)、可变关键字参数
参数解构: 给函数提供实参的时候,可以在集合类型前使用*或者**,把集合类型的结构解开,提取出所有 元素作为函数的实参 ,非字典类型使用*解构成位置参数 , 字典类型使用**解构成关键字参数 , 提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配
函数返回值:Python函数使用return语句返回“返回值” ,所有函数都有返回值,如果没有return语句,隐式调用return None , return 语句并不一定是函数的语句块的最后一条语句 , 一个函数可以存在多个return语句,但是只有一条可以被执行。如果没有一条return语句被执 行到,隐式调用return None ,如果函数执行了return语句,函数就会返回,当前被执行的return语句之后的其它语句就不会 被执行了 。作用:结束函数调用、返回值。
函数不能同时返回多个值, return 1, 3, 5 看似返回多个值,隐式的被python封装成了一个元组 。可以使用 x, y, z = showlist() 使用解构提取更为方便。
函数嵌套:在一个函数中定义了另外一个函数,内部函数不能在外部直接使用,会抛NameError异常,因为它不可见
作用域:一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域
全局作用域: 在整个程序运行环境中都可见
局部作用域:在函数、类等内部可见 ,局部变量使用范围不能超过其所在的局部作用域
例:
x +=1 其实是x=x+1,相当于在f内部定义一个局部变量x,但是这个x还没有完成赋值,就被右边拿来做加1操作了,如何解决?
使用global关键字,将f内的x声明为使用外部的全局作用域中定义的x,全局作用域中必须有x的定义
global使用原则: 外部作用域变量会内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为 函数的目的就是为了封装,尽量与外界隔离,如果函数需要使用外部全局变量,请使用函数的形参传参解决
闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成 了闭包。
nonlocal关键字:
使用nonlocal关键字,将变量标记为不在本地作用域定义,而在上级的某一级局部作用域中定义,但不 能是全局作用域中定义
例:
count 是外层函数的局部变量,被内部函数引用 ,内部函数使用nonlocal关键字声明count变量在上级作用域而非本地作用域中定义 ,代码可以正常使用,且形成闭包
默认值的作用域:函数func中的位置参数默认值保存在属性__defaults__中,为一个元组,可以使用func.__defaults__进行查看; 属性__kwdefaults__中使用字典保存所有keyword-only参数的默认值。使用可变类型作为默认值,就可能修改这个默认值,如何做到默认值不会改变呢?
例1:
例2:
第一种方法: 使用影子拷贝创建一个新的对象,永远不能改变传入的参数
第二种方法: 通过值的判断就可以灵活的选择创建或者修改传入对象 ,很多函数的定义,都可以看到使用None这个不可变的值作为默认参数,可以说这是一种惯用法
变量名解析原则LEGB:
函数的销毁:
全局函数销毁:重新定义同名函数,del语句删除函数对象,程序结束时
局部函数销毁:重新在上级作用域定义同名函数,del语句删除函数名称,函数对象的引用计数减1,上级作用域销毁时。
匿名函数:
python借助lambda表达式构建匿名函数
格式:lambda 参数列表:表达式
参数列表不需要小括号,冒号是用来分割参数列表和表达式的,不需要使用return语句,表达式的值,就是匿名函数的返回值,lambda表达式只能卸载一行上,被称为单行函数
匿名函数的调用: