Knight_day11

【其他、函数名应用、globals() locals()、闭包、可迭代对象与迭代器】

  • 其他

    for

      没break 执行else

      break 不执行else

 

    else

  • 函数名应用

    函数名是一个特殊变量

    1.函数名就是函数的内存地址

    2.函数名可以作为变量

 

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

    4.函数名可以当作函数的返回值

    5.函数名可以作为容器类类型的元素(可用for循环一次执行多个函数)

    以上像函数名这种,叫做第一类对象,当作普通变量用

  • globals() locals()

    globals() 返回包括全局变量的一个字典

    locals() 返回包括当前局部位置的变量字典

  • 闭包

    内层函数对外层函数的变量(非全局变量)引用,且外层函数返回内层函数名,就形成了闭包。

    判断引用:

      __closure__

      返回地址是,返回None

    注意:把变量传给函数,相当于在函数中定义这个变量。

    闭包作用:当程序执行时,遇到函数执行,会在内存中开辟一个局部名称空间,如果这个函数内部形成闭包,那这个空间不会随着函数结束而立即消失(一段时间后有回收机制)。用于爬虫(爬一次就存在内存),装饰器。

  • 可迭代对象与迭代器

    可迭代对象:满足可迭代协议,对象内部含有__iter__方法就是可迭代对象

    常见可迭代对象:str list dict tuple set range

    dir() 返回一个字符串列表,元素为该对象所有方法

    判断:

      判断一个对象是否是可迭代对象:

        1.print('__iter__' in dir(...))

        2.from collections import Iterable

         print(isinstance(..., Iterable))

         注:

          isinstance(..., 这种) 判断...是不是这种,比type()全面,type()只能判断什么数据类型

      判断一个对象是否是迭代器:

        1.对象内含有'__iter__'方法且含有'__next__'方法就是迭代器

         print('__iter__' in dir())

         print('__next__' in dir())

        2.from collections import Iterable

         from collections import Iterator

         print(isinstance(..., Iterable))

         print(isinstance(..., Iterator))

    可迭代对象 vs 迭代器:

      1.可迭代对象不能取值,迭代器可取值。

        可迭代对象 ----> 迭代器:.__iter__() 或 iter()

        迭代器next一次取一个值:str1.__iter__().__next__()  或next() 。超出范围报错

      2.迭代器非常节省内存

        如for循环就是先转迭代器,利用__next__一个一个取值,在内存中只占一个

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

      4.迭代器是单向的,不反复,一条路走到头

  • while循环模拟for循环机制

    1.将可迭代对象转化为迭代器

    2.调用__next__方法取值

    3.利用异常处理解决报错

s1 = 'asdawfwagwagaw'
s1 = s1.__iter__()
while 1:
    try:
        print(s1.__next__())
    except StopIteration:
        break

 

posted @ 2022-02-13 12:55  夜色无边  阅读(43)  评论(0)    收藏  举报