13_函数进阶

一、Python执行流程

分析一下Python内部的执行原理

1 name = 'zhangsan'
2 def func():
3     name = 'lisi'
4     age = 20
5     print('%s %d'%(name,age))
6 
7 func()

在python代码运行的时候,Python解释器会想系统申请一块内存,Python从上至下逐行翻译,遇到变量,会把变量和变量值的对应记录到内存中,遇到函数定义的时候,解释器只把函数名读入到内存,表示只当这个函数已经存在,至于函数内部的变量和逻辑,解释器根本不关心。

遇到函数调用,解释器会再开辟一块内存来存储这个函数里边的内容,这个时候才会关注函数里面的变量。函数内部的变量会被存储在新开辟的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存会被释放。

二、名称空间和作用域

2.1名称空间一共分为三种:

全局名称空间:每个py拥有自己的名称空间,他记录了变量,包括类、函数和其他调用的模块,上面程序中:name就位于全局名称空间

局部名称空间:每个函数拥有自己的名称空间,他记录了函数的变量,参数、局部定义的变量。上面程序中:func()函数中name和age位于局部名称空间

内置名称空间:Python内置的函数,任何模块都可以调用它,比如print() len() count()等

2.2名称空间的加载顺序和取值顺序:

加载顺序:

先加载内置名称空间(程序加载前)、其次是全局名称空间(程序运行中:从上至下),最后是局部名称空间(程序调用函数时,才会被加载)。

取值顺序:

局部名称空间,全局名称空间,最后是内置名称空间

程序在寻找变量时,从小范围,一层一层到大范围寻找。

name = 'zhangsan'
def func():
    name = 'lisi'
    age = 20
    print('%s %d'%(name,age))

func()

从程序的打印可以看出,name 是  lisi。

三、作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效。

局部作用域:局部名称空间,只在局部范围有效。

 globals和locals方法

print(globals())
print(locals())
View Code
def func():
    a = 12
    b = 20
    print(locals())
    print(globals())

func()
View Code

global关键字,nonlocal关键字。

global:

  1,声明一个全局变量。

  2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

1 name = 'zhangsan'
2 def func():
3     global name
4     name = 'lisi'
5     age = 20
6 func()
7 
8 print(name) # name 就是 lisi

nonlocal:

  1,不能修改全局变量。

  2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

四、函数的嵌套调用和作用链

4.1函数的嵌套调用

函数的嵌套调用

 1 def max2(*args):
 2     return args[0] if args[0] > args[1] else args[1]
 3 def max4(*args):
 4     ret = max2(args[0],args[1])
 5     ret1 = max2(ret,args[2])
 6     ret2 = max2(ret1,args[3])
 7     return ret2
 8 
 9 ret = max4(23,-7,31,11)
10 print(ret)
原文地址:https://www.cnblogs.com/weihengblog/p/8399710.html