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. 不能反复, 只能向下执⾏行行.