1、名称空间

名称空间分为三种:

(1)内置名称空间:python解释器内部自己定义的程序占用内存的空间为内置名称空间,在解释器启动时就会自行加载到内存中,如我们常用的print,input,str,list等等。

(2)全局名称空间:用户在全局位置自定义的变量占用内存的空间称为全局名称空间,在程序执行时,才会加载到内存中。

(3)局部名称空间:定义一个函数,在函数内部定义的程序占用的内存空间称为局部名称空间,在执行函数时,程序加载到内存,开辟一个临时内存空间,程序执行完成后释放。

名称空间的加载顺序为:内置名称空间(启动python解释器时加载) --> 全局名称空间(执行程序时加载,从上到下依次加载) --> 局部名称空间(执行函数时加载,只果定义则不加载)

 

2、作用域

作用域分为两种:

(1)全局作用域:全局作用域包括内置命名空间和全局命名空间,在整个程序任意部位都可以调用,全局有效。

(2)局部作用域:局部作用域指的就是局部命名空间,只在局部位置适用。

 

3、取值顺序

局部调用时:局部名称空间 --> 全局名称空 --> 内置名称空间

全局调用时:全局名称空间 --> 内置名称空间

 

4、函数的嵌套

(1) 函数的调用:

def reg(a,b):
    ret =  a if a > b else b
    return ret

def reg1(c,d,e,f):
    res1 = reg(c,d)
    res2 = reg(res1,e)
    res3 = reg(res2,f)
    return res3

print(reg1(10,2,25,6))

 

(2) 函数的嵌套:

def fun1():
    name = 'alex'
    def fun2():
        name1 = 'eric'
        print(name1)
    fun2()
    return name

print(fun1())

 

(3) 函数链:

def fun1():
    print(444) #第1步
    def fun2():
        print(222) #第2步
        def fun3():
            print(111) #第3步
            def fun4():
                print(555) #第4步
            fun4() #第4步
        fun3()  #第3步
    fun2()  #第2步
fun1()  #第1步

 

5、内置函数globals() locals()

globals()作用:取全局作用域内的所有变量

locals()的作用:去指定位置的作用域的所有变量

name = 'alex'
age = 19
def func1():
    name1 = 'eric'
    return name1

func1()
print(globals())  #globals()和locals()都在全局作用域执行
print(locals())

结果:

name = 'alex'
age = 19
def func1():
    name1 = 'eric'
    print(locals())   #locals()在局部作用域执行
    return name1
func1()
print(globals())   #globals()在全局作用域执行

结果:

6、关键字global,nonlocal

global:在局部作用域执行global可以修改全局作用域的变量,一旦修改全局生效。

nonlocal:在更深层次的函数内部,可以修改它上一层或更上层函数内部的变量,一旦修改整个局部生效。

不加global的时候:(只能引用不能修改)

name = 'alex'
def func1():
    name = name.capitalize()
    print(name)

func1()
print(name)

结果:

 

加上global:

name = 'alex'
def func1():
    global name
    name = name.capitalize()
    print(name)

func1()
print(name)

结果:

nonlocal:(在不加nonlocal的情况下,报的错和不加global一样)

def func1():
    name = 'alex'
    def func2():
        nonlocal name
        name = name.upper()
        print(name)
    func2()
    print(name)

func1()

结果:

7、函数名的应用

(1) 函数名可以当做参数传给另一个函数。

def func1():
    name = 'alex'
    print(name)

def func2(x):
    x()

func2(func1)

 

结果:

 

(2) 函数名可以当做一个函数的返回的值。

def func1():
    name = 'alex'
    print(name)

def func2(x):
    x()
    return x   #返回一个值,就必须有一个值去接收这个值的内容

f1 = func2(func1)   #f1就是接收return返回的值
f1()   #由于返回的是函数名,所以加个括号才能运行,如果是一个普通值,则直接print运行就可以

 

(3) 可以给函数名随便定义变量名。

def func1():
    name = 'alex'
    return name

f1 = func1()
f2 = f1
f3 = f2
print(f3)

结果:

 

(4) 可以当做容器数据类型的元素。

def func1():
    name = 'alex'
    return name

def func2():
    name = 'eric'
    return name

def func3():
    name = 'twonss'
    return name

def func4():
    name = 'tom'
    return name

l = [func1,func2,func3,func4]

for line in l:
    print(line())

结果:

8、闭包函数

概念:(1)内部函数包含对于外部作用域而非全局作用变量的引用,这个内部的函数称为闭包函数。

   (2)闭包函数常用于定义装饰器上,因为闭包函数在执行完成后,不会释放内部的临时空间。

区分一个函数是不是闭包用__closure__

def func1():
    name = 'alex'
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

func1()()

结果:

 

posted on 2018-05-30 15:03  花豆豆  阅读(88)  评论(0编辑  收藏  举报