函数def

函数:把执行一定功能的动作封装到一起>>> def 函数名(形参)      通过一个    函数名(实参)         去调用它,传参来执行功能.动作,输出结果

1.定义:def 关键词开头,空格之后接函数名称和圆括号()。
2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分割。
    参数可以定义多个,也可以不定义。
    参数有很多种,如果涉及到多种参数的定义,应始终遵循位置参数、*args、默认参数、**kwargs顺序定义。
    如上述定义过程中某参数类型缺省,其他参数依旧遵循上述排序
3.注释:函数的第一行语句应该添加注释。
4.函数体:函数内容以冒号起始,并且缩进。
5.返回值:return [表达式] 结束函数。不带表达式的return相当于返回 None.一旦遇到return,结束整个函数。
def 函数名(参数1,参数2,*args,默认参数(a=b),**kwargs):
        """注释:函数功能和参数说明"""
        函数体
        ……
        return 返回值(默认为None)

函数的调用

1.函数名()    函数名后面+圆括号就是函数的调用。
2.参数:圆括号用来接收参数。
     若传入多个参数:
        应先按位置传值,再按关键字传值(有关键传值则改变默认关键字,没有使用默认值)
3.返回值 return
    如果函数有返回值,还应该定义“变量”接收返回值 变量=函数名()  >>>  为函数的返回值
    如果返回值有多个,也可以用多个变量来接收,变量数应和返回值数目一致

无返回值的情况:
函数名()

有返回值的情况:
变量 = 函数名()
返回的多个值会被组织成元组被返回,也可以用多个值来接收

变量1,变量2,... = 函数名()

  变量=函数名()   ,变量为一个元祖(变量1,变量2...)

函数名func为一个内存地址,可以作为参数,返回值,列表.元素,字典的值.

命名空间 作用域

函数的内存使用:
     当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。
     等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。
函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
  
这个“存放名字与值的关系”的空间——叫做命名空间
代码在运行伊始,函数名()被调用时为函数创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中需要再次开辟的临时的空间叫做局部命名空间,内存在全局空间内

py的内存加载的顺序为 py内置空间---->函数执行调用开辟的全局命名空间---->函数运行时需求开辟的位于函数空间内的局部命名空间

              内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

  函数查找时顺序为        先找自己局部空间是否有变量---->自己没有来上一级函数空间来找需求变量---->还没有找py内置的空间

作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围生效

global 

a = 10                    #全局变量
def func():
    global a               
    a = 20              #要再函数内部 更改全局变量
                                  # 先用global 变量名 声明修改全局变量
print(a)                    #>>>10     函数执行前无变化
func()                       #执行函数,而函数的动作时修改全局变量a
print(a)                     #>>>20        函数修改后的a

global关键字

 nonlocal

def f1():
    a = 1
    def f2():
        nonlocal a          # 修改最近的上层函数变量值,没有一直到函数最顶层,再没有报错
                                   #          但是不能为全局变量,报错
        a = 2
    f2()
    print('a in f1 : ',a)     

f1()                             #>>>a in f1: 2                                                                  

闭包

      内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数 

      函数的嵌套:定义在内部的函数无法直接在全局被调用,

   闭包的常用方法:返回内部函数名,给函数外部调用内部函数

函数做返回值        为函数创建一块区域,并为其维护保存自己的数据,可以被外部调用,执行(相对于被内存清除)

def func():
    def inner():
        print(123)
    return inner    >>>返回一个函数地址(inner)
v=func()            >>>v=func()返回inner 函数地址
v()                 >>>相当于inner地址函数加括号,调用,外部调用inner内部函数,
                        执行内部函数,输出结果,其中的变量自己没有可以去上级作用域找

        *内部函数执行时内存空间被创建,执行后,如果内部数据仍被外部引用时,空间会被保留(内存泄露)

        *函数初始化创建者def给与函数空间,执行函数的父级也就是创建者空间,而不是调用者的空间,

    调用者空间有地址指向已有的函数空间,已有的函数找父级也是从他的创建者空间

2.高阶函数 把函数当作参数传递/把函数当作返回值/对函数进行赋值



猜你喜欢

转载自www.cnblogs.com/OB19227/p/10696677.html
def