函数的命名空间和作用域

一、函数的命名空间

命名空间:name space是从名称(name)到对象(object)上的映射。

当一个name映射到一个object上时,这个name和这个object就有了绑定(bind)关系,或者说这个name指向了这个object。

每个name只对应一个object,而一个object可有多个名字。这就是类与实例的关系。

不同的命名空间在不同的时刻被创建,并且有不同的生命周期。

内置的命名空间在python解释器启动的时候创建的,并且一直保留,不会删除。

在python程序中的任何地方,都存在着命名空间。

python中有三种命名空间:

局部命名空间:函数内的名称空间就是局部的。

全局命名空间:写在函数外面的变量名。模块内的命名空间就是全局的。

内置命名空间:python解释器启动时创建的,包括异常内型、内建函数和特殊方法,可以在代码中的任何地方调用。

函数外面的变量可以在函数里面调用,函数里面的变量不能在外边用,因为有独自的作用域。

名称空间的加载顺序:

a.python解释器首先运行起来,加载所有内置命名空间中的名字。

b.然后按照顺序加载全局命名空间

c.局部命名空间随函数的调用而创建,随着函数的结束而消除。

命名空间的查找顺序:

a.如果在函数内调用一个变量,先在函数内(局部命名空间)查找,如果没有找到则去函数外部(全局命名空间)查找,如果还是没有找到,则去内置命名空间中查找,内置空间再找不到那就只有报错。

b.如果在函数外调用一个一个变量,先查全局命名空间,也就是本地,如果没有找到,那就去内置命名空间中查找,这里找不着也没辙。

二、函数的作用域

作用域:一个名字可以使用的区域范围。

全局作用域:内置名字空间和全局名字空间中的名字都属于全局作用域
局部作用域:局部名字空间中的名字属于局部作用域。
局部作用域可以使用全局作用域中的变量
而全局作用域不能使用局部作用域中的变量
局部作用域中的变量又可以被更小的作用域所调用
作用域链:小范围作用域可以使用大范围的变量,但作用域链是单向的,不能反向。

globals():保存了在全局域中的名字和值,无论在哪打印值都一样
locals():保存了当前作用域中变量,根据执行的位置来决定作用域中的内容
如果在全局执行,globals()和locals()的结果是相同的

global :声明参数是全局变量

nonlocal :调用最近的这个参数

用几个例子来演示:

(1)代码的加载顺序

#代码执行的顺序
def func2():                             #1  读取函数
    print(‘my name is func2‘)             #5
    print(‘多写一行‘)                             #6
    if True:                                          #7
        print(‘又多写了一行‘)                      #8
    return ‘func2的返回值‘                        #9

def func():                              #2
    ret = func2()                            #4   调用函数
    print(ret)                                            #10
    n = 20                                                  #11
    print(n)                                                   #12   

func()                                     #3  执行函数

(2)函数的镶嵌

def func():
    def kebi():
        print(‘我是科比.布莱恩特‘)
    kebi()    #要想调用kebi,必须先要再func()里面调用

func()

(3)作用域

n = 1
def func():
    print(n)      #会报错,在圈子里不能改变圈子外的值
    n = n+1

func()
n = 1
def func():
    global n    #用global来声明这是一个全局变量
    n = n+1
    print(n)

func()

结果:
2

如果想调用局部中的变量

n = 0
def func1():
    n = 1
    def func2():
        nonlocal n  #调用就近的一个局部变量,不会调用全局变量
        n +=1
    func2()
    print(n)
func1()
print(n)

结果:
2
0

三、函数的名字

函数名可以赋值

def foo(sr):
    print(sr*2)
bar = foo
bar(123)

结果:
246

可以作为一个数据结构的元素

def foo(sr):
    print(sr*2)
lst = [1,2,foo,5]
print(lst)

结果:
[1, 2, <function foo at 0x000002DD65CE4048>, 5]

 <function foo at 0x000002DD65CE4048> foo的内存地址

函数可以作为一个函数的参数

def foo(sr):
    print(sr*2)
def bar(lst):
    return lst
print(bar(foo))

结果:
<function foo at 0x000002AE437C4048>

函数的名字可以作为一个函数的返回值

def foo(sr):
    print(sr*2)
def bar():
    return foo
print(bar())

结果:
<function foo at 0x000001DF93844048>
时间: 2024-07-29 10:24:48

函数的命名空间和作用域的相关文章

函数_命名空间和作用域

#函数进阶----命名空间和作用域 # a = 1# def func():# print(a)# func() 调用是可以的 # def func():# a = 1## func()# print(a) 不可以的 #命名空间和作用域# print()# input()# list# tuple#命名空间有三种# 内置的命名空间--------->python解释器 #就是python解释器一启动就可以使用的名字存储在内置命名空间中 #内置的名字在启动解释器的时候被加载到内存里 # 全局命名空

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

day12函数的命名空间,作用域,闭包等

一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c = 5 if a>b else 10 # print(c) 二.函数的命名空间 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的

【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

Python基础day-6[函数,命名空间,作用域]

函数的返回值 通常有参函数是需要返回值的. 返回值的几种形式: 1.如果函数内没有return就返回None 2.return 返回的数据类型没有限制,也可以返回多个值,以元组形式,括号可加可不加 return的效果: 终止函数的执行,只能返回一次值. 函数参数的使用 python是一种弱类型的语言,参数可以传入任何类型数据 形参与实参:可以理解为形参就是变量名,而实参就是变量值 def foo(x,y) #x,y 是形参 return x+y foo(1,2) #1,2 是实参 位置参数:按照

函数(命名空间和作用域)

命名空间: 内置命名空间:就是解释器一启动就可以使用的名字,存储在内置命名空间内,启动解释器时加载到内存: 全局命名空间:在程序从上到下被执行的工程中依次加载到内存,放置我们设置的所有变量名和函数名: 局部内存空间:就是函数内部定义的名字.当调用函数时会产生这个命名空间,随着函数执行结束,这个命名空间就消失了: 在局部:可以使用全局和内置命名空间的名字:多个函数拥有多个局部命名空间,互不共享. 在全局:可以使用内置空间的名字,但不能使用局部空间的名字. 在内置:不可以使用全局及局部空间的名字:

python开发函数进阶:命名空间,作用域,函数的本质,闭包,内置方法(globales)

一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序 硬盘上--内存里#内置-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载) 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #全局命名空间 5 a = 5 6 b = 8 7 #局部命名空间(函数) 8 def my_max(): 9 c = a if a > b else b 10 return c 11 m = my_max() 12 pr

python入门基础-三元表达式、命名空间、作用域、函数名本质、闭包

1.三元表达式(三目运算式) #1 三元表达式(三目运算法) #格式为: 为真时的结果 if 判定条件 else 为假时的结果 #另外三元表达式只适合较为简洁的条件判定,较为复杂的判定建议不要用这种方式写代码,因为比较让他人难以理解. a = 10 b = 15 compare = a if a > b else b #谁大返回谁 print(compare) 2.命名空间(namespace) #2 命名空间(namespace) #命名空间是名称和对象的印象,也可以将命名空间理解成一个字典,

python3命名空间与作用域,闭包函数,装饰器

一.命名空间与作用域 命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值 1.命名空间 name='egon' #定义变量 def func(): #定义函数 pass class Foo: #定义类 pass 2.命名空间的分类 (1)内置名称空间: 随着python解释器的启动而产生,包括异常类型.内建函数和特殊方法,可以代码中任意地方调用 print(sum) print(max) print(min) print(max([1,2,3])) import bui