学习目标:
一、了解迭代对象、迭代器和迭代的区别和联系。
二、迭代对象有哪些?
三、关于迭代器和生成器
1. 迭代器的定义;
2. 迭代器的创建;
3. 迭代器的判断。
四、迭代的使用
学习内容:
Python中任意的对象,只要它定义了可以返回⼀个迭代器的__iter__
⽅法,或者定义了可以⽀持下标索引的__getitem__
⽅法,那么它就是⼀个可迭代对象。
任意对象,只要定义了next
(Python2) 或者__next__
⽅法,它就是⼀个迭代器。
1. 迭代器的定义
迭代器指的是迭代取值的工具。
迭代是指一个重复的过程,每一次重复都是基于上一次结果而来,迭代提供了一种通用的不依赖索引的迭代取值方式。
2. 可迭代对象与迭代器的异同
2.1.可迭代对象
但凡内置有__iter__
方法的对象,都称为可迭代对象。
常见可迭代的对象:str,list,tuple,dict,set,
文件对象。
2.2.迭代器对象
既内置有__iter__
方法,又内置__next__
方法的对象。执行该方法可以不依赖索引取值。
执行迭代器的__iter__
方法得到的依然是迭代器。
文件对象本身就是一个迭代器对象.
迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象。
迭代:⽤简单的话讲,它就是从某个地⽅(⽐如⼀个列表)取出⼀个元素的过程。比如,当我们使⽤⼀
个循环来遍历某个东西时,这个过程本⾝就叫迭代。
生成器也是⼀种迭代器,但只能对其迭代⼀次。
因为生成器并没有把所有的值存在内存中,⽽是在运⾏时⽣成值。遍历使⽤时,要么⽤for
循环,要么将它
们传递给任意可以进⾏迭代的函数和结构中。
⼤多数时候⽣成器是以函数来实现的,函数并不返回⼀个值,⽽是yield(“⽣出”)
⼀个值。
def def_generator_name(*args, **kwargs):
if kwargs["numbers"]:
for i in range(kwargs["numbers"]):
yield i
else:
return None
if __name__ == "__main__":
gen = def_generator_name(numbers=12)
print(type(gen), gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
输出:<class 'generator'> 0 1 2 3 4
3. 迭代器的优缺点
迭代器优点:
1).提供了一种通用不依赖索引的迭代取值方式;
2).同一时刻在内存中只存在一个值,更节省内存;
迭代器缺点:
1).取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去;
2).无法预测迭代器的长度;
手动创建迭代器
# 手写一个迭代器对象
class MyRange:
def __init__(self, n):
self.i = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i <= self.n:
i = self.i
self.i += 1
return i
else:
raise StopIteration
测试:
ran = MyRange(5)
print(hasattr(ran, "__next__"))
print([i for i in ran])
# 方法二iter()
range2 = iter([1, 2, 3, 4, 5, 6])
print(hasattr(range2, "__next__"))
print([i for i in range2])
输出:
True
[1, 2, 3, 4, 5]
True
[1, 2, 3, 4, 5, 6]