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()

浙公网安备 33010602011771号