函数名称空间与作用域

函数嵌套

函数的嵌套定义

函数内部定义的函数,无法在函数外部使用内部定义的函数

def f1():
    def f2():
        print('from f2')
    f2()
f1()

from f2

函数的嵌套调用

def max2(x,y):
    if x > y:
        return x
    else:
        return y

def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3

print(max4(1,2,3,4))

4

名称空间与作用域

名称空间

内置名称空间

内置名称空间:存放python解释器自带的名字,如int、float、len

生命周期:在解释器启动时生效,在解释器关闭时失效

全局名称空间

全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间,如下面代码中的x、func、1、z

生命周期:在文件执行时生效,在文件执行结束后失效

x = 1

def func()
    pass

1 = [1,2]
if 3 > 2:
    if 4 > 3:
        z = 3

局部名称空间

局部名称空间:用于存放函数调用期间产生的名字,如下面代码的f2

生命周期:在文件执行时函数调用期间时生效,在函数执行结束后失效

def f1():
    def f2():
        print('from f2')
    f2()
f2()

加载顺序

由于.py文件是由python解释器打开的,因此一定是在python解释器中的内置名称空间加载结束后,文件才开始打开,这时候才会产生全局名称空间,但文件内有某一个函数被调用的时候,才会开始产生局部名称空间,因此名称空间的加载顺序为:内置--->全局--->局部

查找顺序

由于名称空间是用来存放变量名与值之间的绑定关系的,所以但凡要查找名字,一定是从三者之一找到,查找顺序为:从当前所在位置开始查找,如果当前所在位置为局部名称空间,则查找顺序为:局部--->全局--->内置

作用域

全局作用域

全局有效,全局存活,包含内置名称空间和全局名称空间

# 全局作用域
x = 1
def bar():
    print(x)
bar()

1

局部作用域

局部有效,临时存储,只包含局部名称空间

# 局部作用域
def f1():
    def f2():
        def f3():
            print(x)
        x = 2
        f3()
     f2()
f1()

2

作用域关系在函数定义阶段就固定死了,与函数调用无关

# 作用域注意点
x = 1
def f1():  # 定义阶段x=1
    print(x)

def f2():
    x = 2
    f1()
f2()

1

函数对象+作用域应用

# 作用域应用
def f1():
    def inner():
        print('from inner')
    return inner
f = f1()  # 把局部定义的函数放在全局之中
def bar()
    f()
bar()

from inner

global关键字

修改全局作用域中的变量

x = 1
def f1():
    x = 2
    def f2():
        global x  # 修改全局
        x = 3
    f2()
f1()
print(x)

3

nonlocal关键字

修改局部作用域中的变量

x = 1
def f1():
    x = 2
    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)
f1()

3

原文地址:https://www.cnblogs.com/gaohuayan/p/10951874.html

时间: 2024-10-29 00:34:51

函数名称空间与作用域的相关文章

Python:函数名称空间与作用域:

Python:函数名称空间与作用域 函数对象:(第一类对象) 定义:函数是第一类对象:函数名可以当做数据来使用 1.可以直接被引用,加()就能运行 def foo(): print("from foo") f=foo f() 2.可以当作参数传入另一个函数 def warpper(x): x() warpper(foo) 3.可以当作另外函数的返回值 def warpper2(): return foo f=warpper2() print(f is foo) 4.可以当作容器类型的一

Python开发【第XXX篇】----函数 -名称空间与作用域

一:函数嵌套,在调用一个函数的过程中,又调用了其他函数 def bar(): print('from bar')def foo(): print('from foo') bar()foo()通过函数的嵌套使用,分解成最小的操作,一次调用 二:函数的嵌套定义:在一个函数的内部,又定义了一个函数 def f1(): x = 1 def f2(): print('from f2') f2()f1() 三:名称空间,存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方内置名称空间:pytho

函数---名称空间和作用域

今日新名词: 1)globals()查看全局作用域的内容; 2)locals()查看局部作用域的内容; 3)global() 调用修改全局作用域变量的权限; 4)nonlocal()调用修改局部作用域变量的权限. ===================================================================== 1)查看全局作用域中的内容:包括名字和对应的值 print(globals()) #查看全局作用域的内容 包括(内置名称空间+全局名称空间) 2)

python基础之函数名称空间与作用域

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

python学习笔记第五节(函数,名称空间,作用域)

python2中 默认存为unicode需要再字符串前加u 循环打印每一行 循环打印整个文件内容方式二下面这种同一时间取一行 先定义后执行 函数定义的时候,只检测语法错误,不执行 函数返回值,默认是元组模式return 只能返回一次 形参与实参 形参就是变量名实参就是值 打破顺序限制 经常变化的值用位置形参,值通常不变的用默认参数.默认参数通常定义成不可变类型.默认参数只在定义时被赋值一次. 可变长参数就是* 关键字参数(关键字参数指的是实参当中指定y=2,z=3等等) *等同于位置参数 函数内

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): return x**2 y=func(10) print(y) def foo(): return None res=foo() print(res) def foo(): return{'a':1} res=foo() print(res['a']) def foo(): return {'a':1},1,'a',[1,2] res=foo() p

11、函数对象、函数的嵌套、名称空间与作用域

一.函数对象 函数对象,函数是第一类对象,即函数可以当做数据传递 具体特点: 1.可以被引用: 1 def foo(): 2 print('from foo') 3 4 func=foo 5 6 print(foo) 7 print(func) 8 func() 2.可以当作参数传递 1 def foo(): 2 print('from foo') 3 4 def bar(func): 5 print(func) 6 func() 7 8 bar(foo) 3.返回值可以是函数 1 def fo

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

一,函数对象 函数对象:函数是第一类对象,即函数可以当做数据传递 1,可以被引用 2,可以做参数的传递 3,返回值可以是函数 4,可以当作容器类型的元素 二,函数嵌套 1,函数的嵌套调用 2,函数的嵌套定义 三,名称空间与作用域 名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系 查看内置名称的两种方法: 三种名称空间 1,内置名称空间:随着python解释器的启动而产生 2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 3,局部名称空间:调用函