Day 10 函数进阶

名称空间与作用域

python中,名称空间分三种:全局名称空间, 局部名称空间(临时),内置名称空间

代码在运行初始,创建的存储“变量名与值的关系”的空间叫做全局命名空间;

在函数的运行中开辟的临时的空间叫做局部命名空间。

Python解释器中已经内置好的函数空间叫做内置名称空间

作用域:

    全局作用域 全局名称空间 内置名称空间

    局部作用域 局部名称空间(临时)

取值顺序: 就近原则

    局部名称空间  ---->  全局名称空间 ----->内置名称空间  单向从小到大范围

加载顺序:

    内置名称空间 ----> 全局名称空间(当程序执行时) --- > 局部名称空间(当函数调用的时候)

global与nonlocal关键字

count = 1
def ake():
    count = count + 1  # local variable 'count' referenced before assignment
    print(count)
ake()
如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,
但是对于上面的例题,局部中没有定义,所以它会报错,
global: 1,在局部名称空间声明一个全局变量。
def func2():
global name
name = 'alex'
func2()
print(name)
  2,在局部名称空间可以对全局变量进行修改。
count = 1
def func1():
global count
count = count + 1
print(count)
func1()
print(count)
nonlocal
子函数对父函数的变量进行修改。
      此变量不能是全局变量。
def func1():
count = 666
def inner():
print(count)
def func2():
nonlocal count
count += 1
print('func2',count)
func2()
print('inner',count)
inner()
print('func1',count)
func1()

  

函数名的应用

1 ,函数名就是函数的内存地址。

2, 函数名可以作为变量。

def func1():
    print(666)
    return True
f1 = func1
f2 = f1
f2()
if f2():
    print(1)

  

3,函数名可以作为函数的参数。

def func1():
    print(666)
def func2(x):
    print(x)
    x()
func2(func1)

  

4,函数名可以当做函数的返回值。

def func1():
    def func2():
        print(666)
    return func2
ret = func1()
print(ret)
print(ret())

  

5,函数名可以作为容器类类型的元素

def func1():
    print(111)
def func2():
    print(222)
def func3():
    print(333)
def func4():
    print(444)
l1 = [func1,func2,func3,func4]
for i in l1:
    i()

  

globals()与locals()

globals()#返回全局变量的一个字典,几乎不变

locals()#返回当前位置的局部变量的字典

def func1():
    a = 2
    b = 3
    print(globals())
    print(locals())
    def func2():
        c = 5
        d = 6
        print(globals())
        print(locals())
    func2()
print(globals())
print(locals())
func1()

  

闭包

内层函数对外层函数变量(非全局变量)的引用,并返回,这样就形成了闭包(主要应用在爬虫)。

def func1():
    name = 1
    def func2():
        print(name)
    print(func2.__closure__)#返回(<cell at 0x0000020E9DC395B8: int object at 0x000000005F2D60E0>,)
    func2()
    return func2
func1()

name = 1
def func1():
    def func2():
        print(name)
    print(func2.__closure__)#返回None
    func2()
    return func2
func1()

  

posted @ 2018-08-17 20:09  一捅浆糊  阅读(95)  评论(0编辑  收藏  举报