python基础(十一)—函数(三)
函数名
1.函数名的内存地址 (直接打印函数名)
def func(): pass print(func)
2.函数名可以赋值给其他变量
def func(): pass f = func print(f)
3.函数名可以当作容器类元素
def a(): print(1) def b(): print(2) def c(): print(3) def d(): print(4) def e(): print(5) li = [a,b,c,d,e] for i in li: i()
4.函数名可以当作函数的参数
def a(x): x() return b() def b(): print(666) print(a(b))
5.函数名可以当作函数返回值
def a(x):
x()
return b()
def b():
print(666)
print(a(b))
函数名就是第一类对象
闭包
闭包就是内层函数,对外层函数(非全局函数)的变量引用叫做闭包
def a(): a = 2 def b(): c = a + 1 print(c) b() a()
_closure_
def a(): x = 2 def b(): c = x + 1 print(c)
print(b._closure_) #检测函数是不是闭包,有cell就是闭包 b() a()
x = 2
def a(): def b(): c = x + 1 print(c)
print(b._closure_) #检测函数是不是闭包,有None就不是闭包 b() a()
在外层函数的内部执行inner
def a(): def b(): print(666) return b #函数返回值返回给函数调用者a() a()()
如果说你的内存函数是个闭包,python中有一个几只,遇到闭包他会在内存中开启一个内存空间,不会随着函数的结束而关闭
闭包函数应用(爬虫)
from urllib.request import urlopen # print(urlopen('https://123.sogou.com/').read()) def index(url): c = urlopen(url).read() def a(): with open('爬虫','a') as f1: f1.write(c.decode('utf-8')) a() index('https://i.cnblogs.com/EditArticles.aspx?postid=8406818&update=1')
闭包的嵌套
def f(): c = 1 def f1(): b = 2 def f3(): print(c + b) return f3 return f1 f()()()
装饰器
简单的装饰器
import time def f(): a = 1 def times(x): def inner(): start = time.time() time.sleep(0.1) x() end = time.time() print('执行效率时间%s'%(end-start)) return inner f = times(f) f()
语法糖@