python学习 迭代器、闭包

迭代器

  1. 可迭代对象
    以直接作用于for循环的数据类型有以下几种:
    一类是集合数据类型,如list、tuple、dict、set、str等。
    一类是generator,包括生成器和带 yield 的 generator function。
    这些可以直接作用于 for 循环的对象统称为可迭代对象:Iterable。
  2. 判断是否可以迭代
    可以使用 isinstance() 判断一个对象是否为 Iterable 对象:
    例:
		>>> isinstance('abc',Iterable)
		True
		>>> isinstance([],Iterable)
		True
		>>> isinstance({},Iterable)
		True
		>>> isinstance(100,Iterable)
		False
	我们可以判断出是否为可迭代对象

【注】可以迭代的对象都可以用for循环打印

  1. 迭代器
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    可以使用 isinstance() 判断一个对象是否为Iterator对象:
	>>> isinstance((x for x in range(10)),Iterator)
	True
	>>> isinstance([],Iterator)
	False
	>>> isinstance({},Iterator)
	False
	>>> isinstance('asdf',Iterator)
	False

所以我们可以发现,生成器就是一个迭代器

  1. iter()函数
    生成器都是Iterator对象,但 list、dict、str 虽然是可迭代的(Iterable),却不是迭代器(Iterator)。而 iter() 函数,就是使 list、dict、str 等 Iterable 变成 Iterator。

例1:

		>>> isinstance (iter([]),Iterator)
		True
		>>> isinstance(iter({}),Iterator)
		True
		>>> isinstance(iter('asdf'),Iterator)
		True
		>>> 

例2:

		>>> a=[1,2,3,4,5]
		>>> next(a)
		Traceback (most recent call last):
 		 File "<pyshell#42>", line 1, in <module>
  		  next(a)
		TypeError: 'list' object is not an iterator
		>>> b=iter(a)
		>>> next(b)
		1
		>>> next(b)
		2
		>>> next(b)
		3
		>>> 

总结:
凡是可作用于 for 循环的对象都是 Iterable 类型;
凡是可作用于 next() 函数的对象都是 Iterator 类型;
集合数据类型如:list、dict、str 等,都是 Iterable 但不是 Iterator ,不过可以用 iter() 函数来转换成新的迭代器。

闭包

闭包一个闭包就是你调用了一个函数 a ,这个函数 a 返回了一个函数 b 给你。这个返回的函数 b 就叫做闭包。
程序如下:

def test(number):
    print ('=====1=====')
    def test_in(number2):
        print('======2======')
        print(number+number2)
    print('=====3======')
    return test_in
    
    ret = test(100)
    print('-'*30)
    ret(1)
    ret(100)
    ret(200)

运行结果:
在这里插入图片描述
在不调用闭包函数的时候,程序默认将闭包跳过,直接运行闭包外的函数。但是在执行闭包函数的时候,需要调用外部函数的变量,在函数执行完,再次需要执行的时候,外部函数不需要再次调用,直接执行,所以外部函数不会结束。

应用:

 def test(a,b):
	 def test_in(x):
    	print(a*x+b)

	return test_in
	
	line1 = test(1,1)
	line1(0)
	line2 = test(10,4)
	line2(0)
	line1(0)

运行结果:
在这里插入图片描述
创建两条一次函数的线
创建a,b的值后,每次只需要传一个值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章