一.函数名的运用
函数名就是一个特殊的变量,与括号配合可以执行函数的变量
1.函数名可以赋值给其他变量
def f1():
print(1)
a = f1
a()# 结果为 1
2.函数名可以当作函数的参数和返回值
def f1():
print(1)
def f2(fn):
fn()
def f3()
print(2)
return f3
a = f2(f1) #print(1)
a() #print(2)
二.闭包
闭包:内层函数对外层函数(非全局)的变量的引用,
def f1():
a=1
def f2()
print(a)
f2()
f1() #print(1)
我们可以使用__closure__来检测函数是否闭包,返回cell就是闭包 返回None就不是闭包
def f1():
a=1
def f2()
print(a)
f2()
print(f2.__closure__) # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
f1() #print(1)
如何在函数外面调用内层函数呢?
def f1()
def f2():
print(1)
return f2
a = f1()
a()
装饰器的雏形
三.迭代器
如何生成一个迭代器
可迭代对象._iter_()
_iter_是帮助我们获取到对象的迭代器.我们拿到迭代器后
使用__next__()来获取一个迭代器中的元素
使用迭代器模拟for循环的机制
lst = [1,2,3]
lst_iter = lst.__iter__()
while 1:
try:#执行try内的代码 如出了下面except声明的错误 则执行except StopIterration:内的代码
i = lst_iter.__next__()
print(i)
except StopIterration:
break
迭代器的特点:
- 节省内存
- 惰性机制 不去拿值就不执行
- 不能反复,只能向下执行
我们可以把要迭代的内容当成子弹. 然后呢. 获取到迭代器__iter__(), 就把子弹都装在弹夹 中. 然后发射就是__next__()把每一个子弹(元素)打出来. 也就是说, for循环的时候. 一开始的 时候是__iter__()来获取迭代器. 后面每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将结束循环.