函数基础

函数

函数由若干语句组成的语句块、函数名、参数列表构成。它是组织代码的最小单元
目的:为了完成一定的功能

目前创新互联已为数千家的企业提供了网站建设、域名、虚拟主机网站托管、企业网站设计、武清网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

  • 函数的作用
    结构化编程对代码最基本的封装,一般按照功能组织一段代码
    封装是为了复用,减少冗余代码
    代码更见简洁美观、可读易懂
  • 函数的分类
    内建函数、库函数
  • 函数的定义、调用 例子:
    def 函数名(参数列表): def add(x,y)
    函数体(代码块) result = x+y
    [ return 返回值 ] return result
    out = add(4,5)
    print(out)
    函数的返回值可以用变量接收
    函数名也是标识符,命名要求一样 可看成一个变量
    定义需要在调用之前,调用的时候,需要函数已经定义,否则会抛出NameError
    函数是可调用对象,callable 用来判断 某对象是否是 函数 在测试时不能待用函数,调用后会将返回值 放入callable()来进行检测 ,则返回 False 用已造成结果不准确
    语句块必须缩进
    python的函数没有return语句,隐式会返回一个Neno值
    定义中的参数列表成为形式参数,只有一种符号表达,简称形参
    调用
    函数定义,知识声明了一个函数,它不会被执行,需要调用
    调用的方式,函数名加上小括号,括号内是参数
    调用时写的参数是实际参数,是是在子啊传入的值,简称实参
    函数参数
    参数调用时传入的参数要和定义的个数匹配(可变参数列外)
    位置参数
    def f(x,y,z) 调用使用f(1,3,5) 按位置一一对应传入实参
    按照参数定义顺序传入实参
    关键字参数
    def f(x,y,z) 调用使用 f(x=1,y=3,z=5)
    使用形参的名字来输入实参的方式,如果使用了形参名字,那么传参顺序可以发生变化
    传参
    格式严格
    要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的
    参数默认值(缺省值)

定义时,在形参后跟上一个值
缺省参数不指定,且传参时没有传参则引起报错
作用
参数的默认值可以在未传入足够的实参的时候,对没有给定的参数赋值为默认值
参数非常多的时候,并不需要用户都输入所有参数,可以简化函数调用

定义参数时:非缺省参数不能放在缺省参数之后,否则会报错

位置参数的可变参数 (可变位置参数 args 尽可能多的收集位置参数) 类型是元祖
在形参之前使用
表示该形参是可变参数,可以就收多个实参
收集多个实参为一个tuple
可变位置参数不允许使用关键字传参方式传入
关键字参数的可变参数 (可变关键字参数 kwargs 尽可能多的收集关键字参数) 类型字典 数据可以被修改
形参之前使用
符号,表示可以接收多个关键字参数
收集的实参名称和值组成一个字典
可变位置参数不允许使用关键字传参方式传入
关键字传参时不允许出现重复的key,否则直接报错SyntaxError
可变参数混合使用

def add(*nums):
print(type(nums),nums)
sum = 0
for i in nums:
sum += i
return sum

add(),add({1,2,3}),add((1,2,3)),add(*[1,2,3]),add(1,2,3,4,5)

()
(1, 2, 3)
(1, 2, 3)
(1, 2, 3)
(1, 2, 3, 4, 5)

可变参数总结
有位置可变参数和关键字可变参数
位置可变参数在形参之前使用一个星号*
关键字可变参数在形参之前使用两个星号**
位置可变参数和关键字可变参数都可以收集若干个实参,位置可变参数收集行形成一个tuple,关键字可变参数收集形成一个dict
混合使用参数时,可变参数要放到参数列表的最后,普通参数需要放到参数列表之前,位置可变参数需要在关键字可变参数之前
参数默认值(缺省值)

keyword-only参数
如果在一个星号参数后,或者一个位置可变参数后,出现普通的参数,实际上已经不是普通参数了,而是keyword-only参数
当*args后面出现 keyword参数时,现在的keyword变成了 keyword-only 参数 必须要有参数出传入,否则报错TypeError

*args已经将所有的位置参数全部收集,而后面的keyword-only收集不到实参,产生报错
位置参数、keyword-only可以设置缺省值,以免发生漏传报错
当有位置参数,且没有指定缺省值时,必须传入实参,否则报错 且 实参与位置形参个数要对应
参数规则
参数列表一般顺序:位置参数、带有缺省值的位置参数、可变位置参数、keyword-only参数(可带缺省值的keyword-only参数)、可变关键字参数

参数的结构
参数结构,顾名思义,只能用在参数部分
给函数提供实参时,可以在集合类型前使用*或则*,把集合类型的结构解开,提取里面的每个元素作为函数的实参
非字典类型使用
号解构将类型转换成位置参数
字典类型使用**解构 将类型解构成关键字参数,提取到字典来的vaalue值
提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配

函数的返回值与作用域
python函数使用return语句返回——“返回值”
所有函数都有返回值,没有return语句,隐式会调用return Neno
return 语句并不一定是函数的语句块的最后一条语句
一个函数可以存在多个return语句,但是只有一条可以被执行。如果没有return语句被执行,隐式调用return Neno
如果有必要,可以显示调用return Neno,可简写为return
如果函数执行了return语句,函数就会返回,当前被执行的return语句之后的语句就不会被执行
作用:
结束函数,返回——返回值

返回多个值
return 只能返回一个值,当你向返回多个值时,python 会以一种方式将其封装为一个元素返回
函数不能同时返回多个值
return 1,2,3 看似返回多个值,其实隐式被python 转换为了一个元组
x,y,z = showlist()#使用解构提取更为方便

函数的嵌套和作用域
在函数中定义另外一个函数叫做嵌套
函数有可见范围,这就是作用于的概念
内部函数不能再外部直接使用,会抛出NameError异常,因为在外部直接找不大该函数 不可见
作用域
一个标识符的可见范围,这就是标识符的作用域范围。一般说是变量的作用域

全局作用域
在整个程序运行环境中都可见
局部作用域
在函数、类等内部可见
局部变量时候用范围不能超过其所在的局部作用域
global全局变量
使用关键字global的变量,将 函数 内的声明变量 声明为使用那个外部的全局变量
全局作用域中,必须要有 变量的定义
赋值即定义,在内部作用域为一个外部作用域的的比那领赋值,不实在内部作用域定义一个洗呢变量,而是将新赋值的变量作用在全局,这里的变量作用域还是全局作用域
global总结
x+=1这种特殊形式产生的错误
x = x+1 当前x属于赋值状态,此时的x并没有值,等号是先算右边在赋值,此时的等号左边x没有值,没有值的情况下+1 在赋值给x 显然是不正确的,故在x += 1 时出现了报错
是因为,先引用后赋值产生的,而python动态语言是赋值才算定义,才能被引用。解决办法,在语句全增加一句辅助语句即可,或者使用global告诉内部作用域,去全局作用域查找变量定义
内部作用域使用的 变量 赋值语句 会重新定义局部作用域使用的变量,但是,一旦这个作用域中使用global声明的变量为 全局的,那么相当于 在为全局作用域的变量赋值

global使用原则
外部作用域变量会在内部作用域可见,但也不雅在这个内部的局部作用于中被直接使用,因为函数的目的就是为了封装,尽可能与外界隔离
如果函数需要使用外部全局变量,请使用函数的形参传参解决
一句话:不用global
闭包
自由变量:
未在本地作用域定义的变量 即定义在内层函数之外的 外层函数作用域中的变量
闭包
就是一个概念,出现在嵌套函数中
内层函数引用了外层函数的自由变量,从而形成了闭包

使用global可以解决,但是这使用的是全局变量,而不是闭包
如果对普通变量闭包,python3 可以使用nonlocal
nonlocal关键字
使用nonlocal关键字,将变量标记为不再本地作用域定义,而在上级的某一级局部作用域中定义,但不能是全局作用域中的定义

默认值作用域
默认值的值是引用的它们在内存中的地址
当默认值的值为非引用类型时,他们的值是不变的。当他们为引用类型时,它们指向的是其内存中的地址,其中的值会发生变化,它们的默认值地址并没有发生变化,还是引用的那个内存地址。这是的默认值就会发生变化

函数地址并没有变,就是说函数这个对象没有变,调用它,它的属性defaultz在使用元祖保存默认值
xyz默认值是引用类型,引用类型元素的变动,并不是元组的变化
属性defaults中使用元组保存所有位置参数默认值,它不会因为在函数体内使用了它而发生变化
属性defaults中使用元组保存所有位置参数默认值
属性kwdefaults中使用字典保存所有keyword-only参数的默认值

使用默认值的方法
一:使用影子拷贝创建一个新的对象,永远不能改变传入的参数
二:通过值得判断就可以领过选择创建或者修改传入对象
这种方式,灵活、被广泛应用
很多函数的定义,都可以看到适应None这个不可变的值作为默认参数,这是一种惯用法

变量名解析原则LEGB
local,本地作用域,局部作用域的local命名空间。函数调用时创建,调用结束消亡
Enclosing,实现了闭包,这个就是嵌套函数的外部函数的命名空间
Global全局作用域,即一个模块的命名空间,模块被import时,创建,解释器退出时消亡
Build-in,内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡
顾名思义 LEGB就是其查找的顺序,就近原则

函数的销毁
全局函数销毁
重新定义同名函数、del语句删除函数对象、程序结束时
局部函数销毁
重新在上级作用域定义同名函数、del语句删除函数名,函数对象的引用计数减1、上级作用域销毁时


当前文章:函数基础
转载来源:http://ybzwz.com/article/gpcgcd.html