函数的命名空间及作用域

一、函数的定义:

 1.空函数:可以快速帮助你构建项目框架 使项目架构清晰明了
            应用频率非常高

#  购物车的功能,梳理整体的大框架,在依次分布实行各个功能模块

def register():#商品
        pass
def login():
      pass
def shopping(): #购物
     pass
def pay():
    pass
def fun():
    pass
            
   

2.无参函数:

  def   func():

    print('from func')

3:有参函数:

def func(x,y,*arg,*kwargs):
      pass
    

 二、命名关键字参数:在函数定义阶段 写在*与**可变长参数之间的形参

  强调:1、在给命名关键字参数传值的时候 只能用关键字为其传值

     2、在**args和**kwargs 是命名关键字参数 不是默认值参数和位置参数

def func(x,y,*arges,z=9,m,**kwargs):
    print(x,y)
    print(arges)
    print(z,m)
    print(kwargs)
func(3,5,51,78,78,12,89,10,30,7,9,12,z=78,m=89,l=78,p=56)

关于*rags和*kwards:

  函数可以接收调用者传入的任意个数的参数
    def func(*args,**kwargs):
        print(args) #   按位置传值多余的参数都由args统一接收,保存成一个元组的形式
        print(kwargs) #  **之后的变量名一字典的形式返回

三、函数对象:

 1、函数是一类对象:函数名指向的值可以被当作参数传递 

def func():
    print('from func')
print(id(func))
f=func
func()
print(f)
f()  #其实指向的也是函数func指向函数体代码的内存地址

2.函数名可以被当做参数传递给其他函数

def func():
    print('from func')
def index(args):
    print(args)
    args()      #函数名被当做关键字来传参
    print('from func ')
index(func)

3.函数名可以被当做函数的返回值

def index():
    print('index')


def func():
    print('func')
    return index
res = func()  #函数名被当做函数的返回值
print(res)
res()

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

def func():
     print('func')
 print(func())
 l = [1,2,func,func()]  # [1,2,<function func at 0x000001F7D79899D8>,None]
 print(l)

四、函数的嵌套调用

   在函数内部调用其他函数
   作用:可以将复杂的逻辑简单化

def index():
    print('index')
def func():
    print('func')
    return index
res=func()  #函数的嵌套调用,只要被定义后可以在任何地方调用
print(res)
res()

  

                                                        # 被调用后先执行函数内的函数体,没有就网上找,没有就全局找

比较四个值的大小:

def my_max(x,y):
    if x>y:
        return x
    return y
def my_max4(a,b,c,d):
    res1=my_max(a,b)
    res2=my_max(res1,c)
    res3=my_max(res2,d)
    return res3
print(my_max4(-45,58,9,93))

五、名称空间:(解释:存放的是变量名与变量值的内存地址得绑定关系的地方)

username='jason'(函数命名的空间,username指向jason指向的内存空间地址,而username在外部也有自己的空间)

  

代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间

命名空间的本质:存放名字与值的绑定关系

命名空间一共分为三种:

  全局命名空间   # 创建函数名之前定义的变量名与值的关系,一般放在函数体的开端

  局部命名空间   # 在函数运行中也就是函数体内命名的函数叫局部空间

  内置命名空间   # 内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...

 1.全局名称空间:文件级别的代码

        x = 1

                if 1 ==1 :
                    y = 2
                
                print(y)
                while True:   
 x,y,z都会放到全局名称空间
                if for while 无论嵌套多少层 它们内部所创建的名字都是全局名称空间的 z
= 3

2、局部名称空间:函数体内创建的名字都属于局部名称空间

def outer():
    x = 1    ##局部名称
    print('outer')
    def inner():
        print('inner')
    # print(inner)
    return inner

res = outer()
# print(res)
res()

3.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间中了)
                len
                max
                min

  
    生命周期:

 
        内置名称空间:只要python解释器已启动立马创建   关闭python解释器的时候内置名称空间自动销毁
        全局名称空间:只要你右键运行py文件会自动创建   py文件程序运行结束自动销毁
        局部名称空间:函数被调用的时候自动创建  函数指向结束立即销毁(动态创建动态销毁)

三种命名空间之间的加载与取值顺序:

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

取值:在局部调用:局部命名空间->全局命名空间->内置命名空间

   在全局调用:全局命名空间->内置命名空间

小范围的可以用大范围的
但是大范围的不能用小范围的
范围从大到小

在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的
如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。
如果都没有,报错

x = 111
 def f1():
     x = 222
    def f2():
        x = 333
        def f3():
             # x = 444
             def f4():
                 # x = 555
                 print(x)
             x = 777  # 纯粹为了教学演示
             f4()
         x = 777  # 纯粹为了教学演示
     f3()
    f2()
 f1()
  
函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变
    
def func():
    x=1
    def index():
        print(x)
    return index
res=func()
x=963
res()
嵌套例子

作用域

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

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

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

原文地址:https://www.cnblogs.com/Gaimo/p/11163954.html