迭代器
- 可迭代对象
以直接作用于for循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等。
一类是generator,包括生成器和带 yield 的 generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象:Iterable。 - 判断是否可以迭代
可以使用 isinstance() 判断一个对象是否为 Iterable 对象:
例:
>>> isinstance('abc',Iterable)
True
>>> isinstance([],Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance(100,Iterable)
False
我们可以判断出是否为可迭代对象
【注】可以迭代的对象都可以用for循环打印
- 迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用 isinstance() 判断一个对象是否为Iterator对象:
>>> isinstance((x for x in range(10)),Iterator)
True
>>> isinstance([],Iterator)
False
>>> isinstance({},Iterator)
False
>>> isinstance('asdf',Iterator)
False
所以我们可以发现,生成器就是一个迭代器
- 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的值后,每次只需要传一个值