闭包与迭代器

函数名的使用

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

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__方法),

原文地址:https://www.cnblogs.com/vivi0403/p/9883710.html