python函数本质与闭包
默认参数特殊情况
def func_1(li = []) : li.append(1) print(li) func_1() func_1() func_1() func_1() $[1] $[1, 1] $[1, 1, 1] $[1, 1, 1, 1]
三元运算符
def func_1(a,b): return a if a> b else b
命名空间
"存放名字与值的关系”的空间起了一个名字——叫做命名空间
全局命名空间:创建的存储“变量名与值的关系”的空间
局部命名空间:在函数的运行中开辟的临时的空间
内置命名空间:中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
全局和内置同名-使用全局
def input(): print('put put put in input now') def func(): input() func() #重写了input方法,现在input走自定义方法,变量也如些
作用域:
a = 1 def func() : a += 1 对于不可变数据类型 在局部可查看全局,但不能修改 如想修改需要添加global a = 1 def func() : global a a += 1 以上方法不安全,建议少用 解决方法是传参或用返回值接收
关键字:locals() globals()
函数的本质
函数的本质:就是一串内存地址
函数名本质上就是函数的内存地址
1.可以被引用
2.可以被当作容器类型的元素
3.可以当作函数的参数和返回值
第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体。
函数的嵌套与作用域
#比较三个数大小 def func_max(a,b) : return a if a>b else b def func_max1(a,b,c) : z = max(a,b) return max(z,c)
函数的嵌套:
def outer() : def inner() : print('inner') return inner outer()
初始闭包:
def outer(): a = 1 def inner(): print(a) print(inner.__closure__) outer()
inner.__closure__调用后出现cell为闭包 嵌套函数,内部函数调用外部函数的变量
如果把inner当做内存地址,传到外部,则a值不会消失 inn全局变量,内部函数用到a,因为inn不消失,一直在调用a, 所以a一直存在
print(inner.__closure__)这句话放的位置可能会出问题,像下面这样写打印出来确是闭包,
但这是错误的
def outer(): def inner(a): print(a) print(inner.__closure__) outer()
简单应用闭包:提取目标网页源代码
import urllib #模块,简单理解为urllib.py文件 from urllib.request import urlopen #可以打开网页 urlopen('www.....').read() print(ret) def get_url(): url = 'wwww' def inner(): urlopen(url).read() print(ret) return inner get_func = get_url() get_func()