函数名的本质,闭包和迭代

函数名的本质:

函数名本质上就是函数的内存地址。

1.函数名可以作为变量:

def func1():
  print(666)
f1 = funv1
f1()

2.函数名可以作为函数的参数

 

def func1():
    print(666)
def func2(x):
    x()
func2(func1)

3.函数名可以作为当作函数的返回值:

def wraaper():
    def inner():
        print('inner')
    return inner
ret = wraaper()
ret()

4.函数名可以作为容器类类型的元素:

def func1():
    print('in func1')
def func2():
    print('in func2')
def func3():
    print('in func3')
def func4():
    print('in func4')
li = [func1,func2,func3,func4]
for i in l1:
    i()

 向上面的函数名:第一类对象

globals() locals()

1.globals():返回全局变量的一个字典。

2.locals():返回当前位置的局部变量的字典

闭包:

内层函数对外层函数的变量(非全局变量)的引用,并返回,这样就形成了闭包:

def wraaaper():
  name = 'alex'
    def inner():
      print(name)
    inner()
    return inner
wraaper()

 功能:当程序执行时,遇到了函数的执行在内存中开辟一个空间,基本名称空间,如果这个函数内部形成了闭包,那么他就不会随着函数的结束而消失。

可迭代对象

对象内部含有__iter__方法就是一个对象。可迭代对象就满足可迭代协议,判断一个对象是否时可迭代对象:

print('__iter__' in dic(s1))

  

from collections imprt Iterable
print(isinstance('alex,Iterable)) Ture

迭代器

对象内部含有__iter__方法且含有__next__方法就是一个迭代器。

可迭代对象vs迭代器

1.可迭代对象不能取值,迭代器是可以取值的

2.迭代器非常节省内存

3.迭代器每次只会取一个值

迭代器单向的不反复

 

posted on 2018-08-23 10:29  不吃鱼的洋  阅读(259)  评论(0编辑  收藏  举报