函数对象:
函数也是一类对象:函数名指向的值可以被当做参数传递(可以被引用)
函数名可以被当做参数传递给其他函数
函数名可以被当做函数的返回值
函数名可以被当做容器类型的参数
1 #函数是第一类对象: 指的是函数可以被当做数据传递 2 3 def func(): 4 print('from func') 5 6 #可被引用 7 f=func 8 9 #函数名可以当做函数的参数传递给其他函数 10 def func(): 11 print('from func') 12 def foo(x): 13 print(x) 14 x() 15 16 foo(func) 17 18 #函数名可以当做函数的返回值 19 def foo(): 20 print('from foo') 21 def bar(): 22 return foo 23 f=bar() 24 print(f) 25 print(foo) 26 f() 27 28 x=0 29 def f1(): 30 x=1 31 def f2(): 32 # x=2 33 print(x) 34 return f2 35 f=f1() 36 print(f) 37 f() 38 39 40 41 #函数名可以当做容器类型的元素(参数) 42 def select(): 43 print('select function') 44 45 func_dic={ 46 'select':select, 47 } 48 49 print(func_dic['select']) 50 func_dic['select']()
函数嵌套调用:
函数的嵌套调用是在函数内部调用其他函数,它可以将复杂的逻辑简单化
但是函数内定义的函数只能在函数内调用,就像函数内定义的变量,外面无法调用
写一个函数,该函数用户可以通过传参的不同控制函数执行不同的功能
1 def f1(): 2 def f2(): 3 def f3(): 4 print('from f3') 5 print('from f2') 6 f3() 7 print('from f1') 8 f2() 9 f1()
名称空间:
名称空间就是存放的是变量名与变量值的内存地址得绑定关系的地方
我们给这个“存放名字与值的关系”的空间起了一个名字——叫做命名空间
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间,在函数的运行中开辟的临时的空间叫做局部命名空间。
名称空间命名 | 名称空间定义 | 名称空间的生命周期 | |
内置名称空间 | python自带的名字,如print、int、str | 在python解释器启动时创建,一直保留直到解释器退出时自动销毁。 | |
全局名称空间 | 文件级别定义的名字,都会放在全局名称空间(没有缩进的所有定义的名字) | 在你运行py文件的时候会自动创建,py文件运行结束自动销毁。 | |
局部名称空间 | 定义在函数内部的名字 | 在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。 |
三种命名空间之间的加载与取值顺序:
加载顺序 | 内置名称空间 | 全局名称空间 | 局部名称空间 |
取值顺序 | 局部名称空间 | 全局名称空间 | 内置名称空间 |
作用域:
作用域是针对变量而言,指申明的变量在程序里的可应用范围,或者称为变量的可见性。
作用域按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效。
局部作用域:局部名称空间,只能在局部范围内生效
全局作用域 | globals | 文件执行结束,变量删除,重新定义后才会失效 |
局部作用域 | locals | 局部要改全局变量,要先声明 globals x,再定义x(尽量避免) |
命名空间定义了在某个作用域内变量名和绑定值之间的对应关系,命名空间是键值对的集合,变量名与值是一一对应关系,作用域定义了命名空间中的变量能够在多大范围内起作用。
命名空间在python解释器中是以字典的形式存在的,是以一种可以看得见摸得着的实体存在的。作用域是python解释器定义的一种规则,该规则确定了运行时变量查找的顺序,是一种形而上的虚的规定。
python解释器查找变量时,会按照顺序依次查找局部作用域,嵌套作用域,全局作用域,内建作用域,在任意一个作用域中找到变量则停止查找,所有作用域查找完成没有找到对应的变量,则输出异常。
在局部作用域中,可以看到局部作用域、嵌套作用域、全局作用域、内建作用域中所有定义的变量。
在全局作用域中,可以看到全局作用域、内建作用域中的所有定义的变量,无法看到局部作用域中的变量。