1.函数名的使用,以及第一类对象
2。闭包
3.迭代器
一函数名的运用:
函数名是一个变量,但他是一个特殊的变量,与括号配合可以执行函数的变量。
函数名的内存地址
def 名():
随便什么体
print(名)
结果是个地址
函数名可以赋值给其他变量
def 名():
print(‘s’)
print(名)
a=名
a() 函数调用 名
3.函数名可以当作容器类的元素
def 1()
print(s)
def 2()。。。。。
lst=【1,2,3,。。】
for i in lst
i()
4.函数名可以当作函数的参数
def func():
print("吃了了么")
def func2(fn):
print("我是func2")
fn() # 执⾏行行传递过来的fn print("我是func2")
func2(func) # 把函数func当成参数传递给func2的参数fn.
传参什么的
5.函数名可以作为函数的返回值
def func_1():
print("这⾥是函数1")
def func_2():
print("这里是函数2")
print("这里是函数1")
return func_2
fn = func_2() # 执⾏行行函数1. 函数1返回的是函数2, 这时fn指向的就是上⾯面函数2 fn() # 执⾏行行上⾯面返回的函数
二 闭包
什么事闭包,闭包就是内层函数,对外层函数(非全局)的变量的引用。叫闭包
我们可以使用__closure__来检测函数是否是闭包,使用函数名.__closure__返回cell就是闭包。返回None就不是闭包
多层嵌套就是一层一层返回没有打印就不返回,11天写的先可最左面的来,没有的打印的话
由它我们可以引出闭包的好处。由于我们在外界可以访问内部函数。那这个时候内部函数访问的时间和时机就不一定了,因为在外部,我可以选择在任意的时间去访问内部函数。这个时候。想一想。我们之前说过,如果一个函数执行完毕,则这个函数中的变量以及局部命名空间中的内部都将会被销毁,在闭包中,如果变量被销毁了,那内部函数将不能正常执行,所以python规定。如果你在内部函数中访问了外层函数中的变量。那么这个变量将不会消亡,将会常驻在内存中,也就是说,使用闭包,可以保证外层函数中的变量在内存中常驻,还有一个好处就是1次常驻,万次使用
三迭代器
我们之前一直在用可迭代对象,进行迭代操作,那么到底什么是可迭代对象。本小节主要讨论可迭代对象。首先我们先回顾一下目前我们所熟知的可迭代对象有哪些:
str, list, tuple, dict, set.为什么他们都是可迭代对象呢,因为他们遵循了迭代协议 这个协议我们可以用dir看一下
print(dir(XXX)) 如果里面有__iter__那么他就是一个可迭代对象 这是查看是否为可迭代对象的第一种方法,我们还可以通过isinstence()函数,来看一个对象是什么类型
我们用__next__()来获取一个迭代器中的元素,我们之前for的工作原理也是这样
lst = [1,2,3] lst_iter = lst.__iter__() while True:
try: i = lst_iter.__next__() print(i)
except StopIteration: break
Iterable: 可迭代对象. 内部包含__iter__()函数
Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().迭代器的特点:
1. 节省内存.
2. 惰性机制
3. 不能反复, 只能向下执⾏行行.