一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 def foo(): return len f = foo print(foo) [foo, ] 函数嵌套(把大问题细分成小问题,把小问题平道一起解决) 函数的嵌套定义: 在函数内部又定义了其他函数 函数的嵌套调用:在一个函数内部又调用其他函数 2.名称空间与作用域: 什么是名称空间? 名称空间:存放名字的地方,三种名称空间, (之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方) 名称空间Namespaces:指的就是存放名字与内存地址绑定关系的地方(内存空间) 名称空间分为三大类 内置名称空间: 存放的是python解释器自带的名字 产生:python解释器的启动则产生 销毁:python解释器关闭则销毁 全局名称空间: 在顶级定义的名字 产生:执行python程序时产生 销毁:python程序执行完毕后则销毁 局部名称空间: 在函数内定义的名字 产生: 在函数调用时临时产生 销毁: 在函数调用完毕后则销毁 三种名称空间的产生的先后顺序: 内置->全局->局部 查找名字的顺序:从当前位置往外一层一层查找 如果当前在局部名称空间: 局部->全局->内置 如果当前在全局名称空间: 全局->内置 需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例 # max=1 def f1(): # max=2 def f2(): # max=3 print(max) f2() f1() print(max) 作用域: #1、作用域即作用范围 - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效 - 局部范围(局部名称空间属于该范围):临时存活,局部有效 全局作用域:包含内置与全局名称空间的名字 特点:全局存活,全局有效 局部作用域:包含局部名称空间的名字 特点:临时存活,局部有效 #2、!!!!!作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下 x=1 def f1(): def f2(): print(x) return f2 x=100 def f3(func): x=2 func() x=10000 f3(f1()) #3、查看作用域:globals(),locals() locals 是函数内的名字空间,包括局部变量和形参 globals 全局变量,函数定义所在模块的名字空间 global与nonlocal关键字 global 适用于函数内部修改全局变量的值 nonlocal 适用于嵌套函数中内部函数修改外部变量的值 如果没有使用以上关键字,对全局变量或者外部变量进行修改,python会默认将全局变量隐藏起来 4.闭包函数 = 函数对象 + 函数嵌套定义 + 作用域 闭包函数指的是定义在函数内部的函数, 并且该内部函数包含对外层函数作用域名字的引用 def outter(x): def inner(): print(x) return inner f = outter(10) #闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域, 这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域 #应用领域:延迟计算(原来我们是传参,现在我们是包起来) from urllib.request import urlopen def index(url): def get(): return urlopen(url).read() return get baidu=index('http://www.baidu.com') print(baidu().decode('utf-8'))