zoukankan      html  css  js  c++  java
  • 闭包与迭代器

    函数名的使用

    (函数即变量,基本与变量相同,一个函数名表示的是这个函数加载到内存的地址)

    1.函数名内存地址

    2.函数名具有变量的功能,可以赋值给其他变量,和添加到列表等容器

    3.可以作为函数的实际参数和函数的返回值

    经典模式

     

    闭包:

    在局部作用域中,内层函数对外层函数(非全局)的变量的引用(一个函数名被作为对象被返回,并且该函数名下中包含了外层函数的变量)

    好处:

    1. 保护我们的变量不受侵害
    2. 可以让一个变量常驻内存

     

    可以通过使用__closure__ 检测函数是否是闭包,最内层的函数名.__closure__,如果返回的值None,说明不是闭包

    迭代器

    Iterable: 可迭代对象. 内部包含__iter__()函数

    Iterator: 迭代器. 内部包含__iter__() 同时包含__next__()

    迭代器的特点:

                1. 节省内存.

                2. 惰性机制,必须用__next__()来获取数据

                 3.不能反复,只能向下执行(一次性,取完就没)

    判断数据是否是可迭代对象

    from collections import Iterable,Iterator

    isinstance('abc',Iterable)  判断一个对象是否是可迭代对象
     

    1.isinstance() 函数是判断某个东西是否是属于哪一个类,eg:

    isinstance(‘cisco’,str) 意思是判断‘cisco’是否是一个字符串类型,如果是返回Ture

    否则返回False

    2.通过dir() 函数查看该变量的所有方法中是否含有__iter__ 方法,如果有就是可迭代的,如果还有方法__next__ 就是迭代器

    由于dir() 返回的值一个关于该变量的所有的方法是列表,可以通过__iter__  in  dir(变量名) 通过使用print打印出来的Ture or False  判断

    lis = [1,2,3,4,5,6,7,8,9]
    gg  = lis.__iter__() #对Lis中的__iter__方法进行调用,得到的就是一个迭代器
    print(gg) #<list_iterator object at 0x0000000E687EEC88> 迭代器的内存地址
    while 1:
        try:
            a = gg.__next__()#之后调用生成器中的__next__方法(每次调用就从迭代器里面拿一个值进行返回)
            print(a) #相当于for循环的循环体
        except StopIteration:
            print('over')
            break

    一个可迭代对象在调用__iter__方法后才是一个迭代器(含有__next__方法),

  • 相关阅读:
    luogu P4587 [FJOI2016]神秘数
    luogu P4042 [AHOI2014/JSOI2014]骑士游戏
    luogu P2597 [ZJOI2012]灾难
    一则胡乱科普
    NJU Static Program Analysis 09: Pointer Analysis II
    NJU Static Program Analysis 08: Pointer Analysis I
    NJU Static Program Analysis 07: Interprocedural Analysis
    NJU Static Program Analysis 06: Data Flow Analysis IV
    LianYunGang OI Camp: Contest #2
    NJU Static Program Analysis 05: Data Flow Analysis III
  • 原文地址:https://www.cnblogs.com/vivi0403/p/9883710.html
Copyright © 2011-2022 走看看