def fn():
print("我叫fn")
fn()
print(fn)## <function fn at 0x0000000001D12E18>
fn()
gn = fn #函数名可以进行赋值
print(gn)# <function fn at 0x0000000001D12E18>
gn()
fn = 666
print(fn) #666
def func1()
print("朱祁镇")
def func2()
print("徐杰")
def func3():
print("王阳明")
def func4():
print("魏忠贤")
lst = [func1,func2,func3,func4]#函数+() 就是调用
print(lst)
lst[0]()
for el in lst: #el是列表中的每一项
el() #拿到的是函数. 执行函数
def wrapper():
def inner():
print("哈哈哈")
return inner#函数名可以像返回值一样返回
ret = wrapper() #接收的是inner函数
ret() #调用函数inner 在函数外面访问了函数内部的函数
函数可以作为参数进行传递
def func1():
print("谢晋")
def func2():
print('杨士奇')
def func3():
print('徐渭')
def func4():
print("柳如是")
#代理.装饰器的雏形
de proxy(a)
print("我是代理")
a()
print("代理执行完毕")
proxy(func1)
proxy(func2) #将函数当做参数进行传参
闭包
闭包的优点
1.可以保持变量不被其他人侵害
2.保持一个常量常驻与内存
def wrapper():
a = "哈哈" #如果把a放到全局作用域是不安全的一种写法,因为好多内容用着同一个变量,则把它放到一个局部作用域中
name = "周杰伦"
def inner
print(name)#在内层函数中使用了外层的函数的局部变量
print(a)
return inner #返回函数名
ret = wrapper() #ret是inner函数
ret() #调用函数
def wrapper():
name = "周杰伦" #局部变量常驻与内存
def inner():
print(name) #在内层函数中使用外层函数的局部变量
return inner #返回函数名
#inner()
ret = wrapper() #ret是一个内层函数
ret() #ret是inner,执行的时机是不确定的,必须保证里边的name是存在的
#超级简单的爬虫
from urllib.request import urlopen #导入一个模块
def func():
#获取到网页中的内容,当网速很慢的时候.反复的打开这个网站 很慢
content = urloppen("https://www.dytt8.net/
").read()
def inner():
return content.decode("gbk") #网页内容
return inner
print("开始网络请求")
ret = func() #网络请求已经关闭
print("网络请求完毕")
print("第一次",ret())
print("第二次",ret()) #加载到内存 不用每次都进行网络请求 直接进行内存的调用 但是变量多的话 内存可能撑不下
def wrapper():
name = "alex"
def inner():
print("name")
print(inner.__closure__) #查看是