一:函数的基础知识

今日 重点知识

一:函数是第一类对象

  1.函数名可以被传递

name = 'jason'
x = name
print(x)
print(id(x),id(name))
def func():
print('func123')
print('func')
print(id(func))
f=func #在函数定义阶段
func()# 在函数调用阶段
print(f,id(f),id(func))
f() #其实指向的也是函数fun从指向航叔体代码的内存地址
2.函数名可以被当做参数传递给其他函数
def func():             # 第五步
print('from func') #第六步
def index(args): #第二步 func=args
print(args) # 第三步 ====>print(func) 此时就是func中存的地址
args() # 第四步
print('from index') # 第七步
index(func) # 第一步
'''
结果: <function func at 0x00000239C8223E18>
    from func
    from index
3.函数名可以被当做函数的返回值
def index():        #第七步
print('index') #第八步
def func(): #第二步
print('func') #第三步 打印func
return index #第四步 把index作为返回值返回给res
res = func() # 第一步
print(res) #第五步 res 相当于 index 就是答应他的地址
res() #第六步 相当于index()
结果为:func
<function index at 0x000002A2459A3E18>
index

4.函数名可以被当做容器类型的参数

def func():         #第二步
print('func1') #第三步
print(func()) #第一步
l = [1,2,func,func()] #第四步
print(l) #第五步
结果为:func1
None
func1
[1, 2, <function func at 0x000001F579AA3E18>, None]

 二:名称空间

  名称空间是什么?
     就是放名字的地方
     详细解释:存放的是变量名与变量值的内存地址得绑定关系的地方
    要想访问一个变量的值 必须先去名称空间中拿到对应的名字 才能够访问变量的值

    1,名称空间的分类:

      1,内置名称空间

        即python自身内部创建好的,提前定义好的,例如 len, max, min

      2,局部名称空间

        在函数内部的,函数体内创建的名字都属于局部名称空间

      3,全局名称空间

        相对于文件级别的,在for while,中创建的名字都是全局名称空间的

    2,生命周期(名称空间)

      1,内置名称空间:在python解释器启动时就已经创建好的,关闭解释器立马销毁

       2,全局名称空间:右键运行执行文件时创建,执行结束完立马销毁

       3,局部名称空间:函数调用时,自动创建,函数执行完毕,立马销毁,自动销毁

    3,名称空间的查找顺序:

        名字的查找顺序:

          1,首先要确定你当前在那(全局还是局部)

            1,站在全局:首先在全局找,找不到再去内置名称空间找

            2,站在局部:首先在局部找,找不到再去全局找,全局无就去内置找。

+     总结:函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******) 

          局部与局部之间是并列关系,站在全局找,只有全局和内置

        作用域作用

作用域

         全局作用域:   全局有效,:

              内置名称空间

              全局名称空间

  局部作用域:  局部有效

          局部作用域

  在局部修改全局的变量:global   

  global 在局部修改全局的不可变数据类型

      局部修改全局 如果想修改多个 逗号隔开

   nonlocal:局部修局部 如果想修改多个 逗号隔开

           
原文地址:https://www.cnblogs.com/Fzhiyuan/p/11167246.html