python基础7(函数 Ⅱ)

1、python代码运行遇到函数时

从python解释器开始执行之后,就在内存中开辟了一个空间
每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。
但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。
等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

2、命名空间

  • “存放名字与值的关系”的空间
  • 内置命名空间
    存放的是python解释器提供的名字(input,print,str...),拿过来就可以使用,内置命名空间的名字在解释器启动的时候就被放入内存
  • 全局命名空间
    当前模块的命名空间
    当代码执行的时候,从上到下按执行的过程加载到内存
  • 局部命名空间
    函数内部定义的名字
    随函数调用而创建,随函数结束而删除
  • 命名空间的加载顺序
    内置命名空间 -> 全局命名空间 -> 局部命名空间
  • 命名空间的取值顺序
    局部命名空间 -> 全局命名空间 -> 内置命名空间

3、作用域

全局作用域:内置命名空间和全局命名空间中的名字都属于全局作用域
局部作用域:函数(局部命名空间中的名字属于局部作用域)

#查看局部作用域中的名字
locals()

#查看全局作用域中的名字
globals()

4、global

对于不可变数据类型,局部中可以获得其值,但是不能修改
如果要修改,可以通过global关键字

a = 1
b = 2
def func():
    global a
    a = 6      #合法
    b = 4       #不合法操作

5、函数嵌套

def outer():
    def inner():
        print('---')
    inner()

outer()

6、nonlocal

在嵌套的函数中,如果我们要修改上层函数的变量,通过上面global是做不到的,因为global获取的是全局中的那个变量,所以可以通过nonlocal来获取(只能获取最接近的那层,也就是上一层中的变量)

a = 1
def outer1():
    a = 2
    def outer2():
        a = 3
        def inner():
            nonlocal a
            a = 5
        inner()
    outer2()

outer1()

#outer2中的a = 3将变成a = 5

7、函数名的本质是内存地址,可以作为容器元素,返回值,参数

#函数名可以赋值
def func():
    print('I am func')

func2 = func
func2()    #实际上执行的是func

#函数名可以作为容器的元素
l = [func,fun2]
for f in l:
    f()

#函数名可以作为返回值
def ohyeah(f):
    f()
    return f

8、闭包

闭包就是内层函数调用外层函数的变量

def outer():
    a = 1
    def inner():
        print(a)

#如果是闭包,调用__closure__将返回cell
def outer():
    a = 1
    def inner():
        print(a)
    print(inner.__closure__)
outer()

#闭包的用法就是在函数外部使用其内部的函数。
#可以使外部函数的变量无需重复创建
def outer():
    a = 1
    def inner():
        print(a)
    return inner
out = outer()
out()
out()

9、三目运算符

def max(a,b):
    return a if a>b else b

 

猜你喜欢

转载自www.cnblogs.com/walthwang/p/10374967.html
0条评论
添加一条新回复