函数名的使用以及第一类对象,闭包,迭代器

一丶函数的名的应用(第一类对象)

    函数名的命名规范和变量是一样的

  1.可以做列表中的元素进行存储

def func1():
    pass
def func2():
    pass
lst = [func1, func2]
for el in lst:
    el()

  2.可以作为参数传递给函数.

def func():
    pass
def proxy(fn):
    fn()
proxy(func)

 

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

def func():
    def inner():
        pass
    return inner
func()()

  4.函数名的内存地址

def func():
    print("呵呵")
print(func)

结果为:
<function func at 0x0000022951B03E18>

二丶闭包

    闭包:在内层函数中访问外层函数的局部变量

    好处:

      1.保护变量不受外界影响

      2.可以让变量常驻内存

    写法:

def outer():
    a = 10
    def inner():
        print(a)
    return inner

 

    如何判断是不是闭包,可以用__closure__来检测函数是否是闭包,使用函数名__closure__返回cell就是闭包,返回None就不是闭包

def func1():
    name = "alex"
    def func2():
        print(name)
    func2()
    print(func2.__closure__) #(<cell at 0x0000023BA6A6B498: str object at 0x0000023BA6AFA7A0>,)
func1()

 

 

三丶迭代器

    用来遍历列表,字符串,元组........可迭代对象

#对的
s = "abc"
for c in s:
    print(c)

#错的
for i in 123:
    print(i)

  注意看报错信息中有这样一句话:'int' object is not iterable,翻译过来就是整数类型对象是不可迭代的,iterable表示可迭代的,表示可迭代协议,那么如何进行验证你的数据类型是否符合可迭代协议,我们可以通过dir函数来查看类中定义好的所有方法.

s = "我的哈哈哈"
print(dir(s))       #可以打印对象中的方法和函数
print(dir(str))     #也可以打印类中声明的方法和函数

 

   在打印结果中,寻找 __iter__如果能找到,那么这个类的对象就是一个可迭代对象. 

  

    可迭代对象:Iterable,里面有__iter__()可以获取迭代器,没有__next__()

    迭代器:  Iterator,里面有__iter__()可以获取迭代器.,还有__next__()

 

    迭代器特点:

      1.只能向前

      2.惰性机制

      3.省内存(生成器)

  

    for循环的内部机制.

      1.首先获取到迭代器

      2.使用while循环获取数据

      3.it.__next__()来获取数据

      4.处理异常  try:XXXX  except StopIteration:

 

it = xx.__iter__()
while 1:
    try:
        data = it.__next__()
        xxxx
    except StopIteration:
        break

 

posted @ 2018-08-10 16:24  七寸丶  阅读(266)  评论(0编辑  收藏  举报