使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表取值的过程。
for value in [1, 2, 4]:
print(value)
元组,列表,字典,字符串,集合,range都是可迭代对象
from collections import Iterable
result = isinstance((3, 5), Iterable)
print("元组是否是可迭代对象:", result)
result = isinstance([3, 5], Iterable)
print("列表是否是可迭代对象:", result)
result = isinstance({"name":"张三"}, Iterable)
print("字典是否是可迭代对象:", result)
result = isinstance("hello", Iterable)
print("字符串是否是可迭代对象:", result)
result = isinstance({3, 5}, Iterable)
print("集合是否是可迭代对象:", result)
result = isinstance(range(5), Iterable)
print("range是否是可迭代对象:", result)
result = isinstance(5, Iterable)
print("整数是否是可迭代对象:", result)
提示: 以后还根据对象判断是否是其它类型,比如以后可以判断函数里面的参数是否是自己想要的类型
result = isinstance(5, int)
print("整数是否是int类型对象:", result)
class Student(object):
pass
stu = Student()
result = isinstance(stu, Iterable)
print("stu是否是可迭代对象:", result)
result = isinstance(stu, Student)
print("stu是否是Student类型的对象:", result)
自定义可迭代对象:在类里面定义__iter__方法创建的对象就是可迭代对象。
from collections import Iterable
class MyList(object):
def __init__(self):
self.my_list = list()
def append_item(self, item):
self.my_list.append(item)
def __iter__(self):
pass # 可迭代对象的本质:遍历可迭代对象的时候其实获取的是可迭代对象的迭代器,然后通过迭代器获取对象中的数据
my_list = MyList()
my_list.append_item(1)
my_list.append_item(2)
result = isinstance(my_list, Iterable)
print(result)
for value in my_list;
print(value)
结果:
Traceback (most recent call last):
True
File "/Users/hbin/Desktop/untitled/aa.py", line 24, in
for value in my_list:
TypeError: iter() returned non-iterator of type 'NoneType'
通过执行结果可以看出来,遍历可迭代对象依次获取数据需要迭代器
from collections import Iterable
from collections import Iterator
自定义可迭代对象:在类里面定义__iter__方法创建的对象就是可迭代对象。
class MyList(object):
def __init__(self):
self.my_list = list()
def append_item(self, item):
self.my_list.append(item)
def __iter__(self):
可迭代对象的本质:遍历可迭代对象的时候其实获取的是迭代对象的迭代器,然后通过迭代器获取对象中的数据
my_iterator = MyIterator(self.my_list)
return my_iterator
自定义迭代器对象:在类里面定义__iter__和————next__方法创建的对象就是迭代器对象
class MyIterator(object):
def __init__(self, my_list):
self.my_list = my_list
self.current_index = 0
result = isinstance(self, Iterator)
print("MyIterator创建的对象是否是迭代器:", result)
def __iter__(self):
return self
def __next__(self):
if self.current_index < len(self.my_list):
self.current_index += 1
return self.my_list[self.current_index - 1]
else:
raise StopIteration # 数据读取完成,需要抛出一个停止迭代的异常
my_list = MyList()
my_list.append_item(1)
my_list.append_item(2)
result = isinstance(my_list, Iterable)
print(result)
for value in my_list;
print(value)
运行结果:
True
MyIterator创建的对象是否是迭代器: True
1
2
遍历的是可迭代对象
我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值,如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过按照衣服那个的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有迭代的数据都一次性缓存下来供后续一次读取,这样就节省大量的存储(内存)空间。
0, 1 , 1, 2, 3, 5, 8, 13, 21, 34
现在通过for…in…循环来遍历迭代斐波那契数列中的前n个数,那么这个斐波那契数列可以
class Fibonacci(object):
def __init__(self, num):
num: 表示生成多少fibonacci数字
self.num = num
记录Fibonacci前两个值
self.a = 0
self.b = 1
记录当前生成数字的索引
self.current_index = 0
def __iter__(self):
return self
def __next__(self):
if self.current_index < self.num:
result = self.a
self.a, self.b = self.b, self.a + self.b
self.cuurent_index += 1
return result
else:
raise StopIteration
fib = Fibonacci(5)
for value in fib:
print(value)
结果:
0
1
1
2
3
生成器是一类特殊的迭代器,它不需要再像上面的类一样写__iter__()和__next__()方法了,使用更加方便,它依然可以使用next函数和for循环取值。