![b6b2a735e1a7e768ae17f5635a733e5b.png](https://i-blog.csdnimg.cn/blog_migrate/257a02c9351738daa2d213c582f7fda7.jpeg)
我们今天来简单的来说一下Python的 for 循环,在说之前,我们首先要有一个概念:在Python中是万物皆对象的。
我们先用Python来写一个简单的for循环。
# 循环输出列表中的每个元素
arr_list = [1,2,3,4,5,6,7,8,9,10]
for num in arr_list:
print(num)
这样我们就写出了一个最简单的 for 循环,目测很简单,但是细思极恐。
![824943232680f94529740ecaa6912b4f.png](https://i-blog.csdnimg.cn/blog_migrate/4b50dfd642cbf8348ab4fd0d6d25ca9b.jpeg)
我们可以来思考几个问题:
- python 如何判断 for 循环结束。
- python 是如何进行的循环 。
- 在python中,什么对象可以进行 for 循环操作。
在python中万物皆对象,所以列表(list)也是一个对象。在python中,可迭代对象都可以支持for 循环。那么问题来了,什么是可迭代对象?答案是:调用了迭代器的对象称之为可迭代对象
迭代器
什么是迭代器,迭代器是指一个对象实现了 __iter __和 __next__ 方法并且可以被 for 循环就可以称之为迭代器了。咱们来敲一段代码。
class NumsIter:
def __init__(self,num):
"""
构造函数传递一个 num 进来
:param num:
"""
self.num = num # 循环截至的条件
self.count = 0 # 循环开始的值
def __iter__(self):
"""
返回一个 迭代器,这里就直接返回这个对象本身
:return:
"""
return self
def __next__(self):
"""
每一次for 循环调用一次 返回一个值
:return:
"""
res = self.count
if self.count == self.num: # 如果 count == num 我们就抛出一个StopIteration 异常
self.count = 0 # 循环结束 重新初始化 count
raise StopIteration # 抛出StopIteration 结束循环。
self.count += 1 # 没被for 循环调用一次 count 就加 1
return res
if __name__ == "__main__":
for i in NumsIter(10):
print(i)
# 输出
"""
0
1
2
3
4
5
6
7
8
9
"""
首先,一个迭代器的一个特征是实现了 __iter__ 方法 和 __next__ 方法 ,其中 __iter__ 会返回一个迭代器,一般这个方法都返回自己(self)。
在每次循环都会调用 __next_ 方法,__next_ 方法会返回一个值或一组值,这个值就是我们for i in arr__list 中的 i 。
每次都返回一个值,什么时候停止呢,这个由我们自己决定当循环需要结束时我们只需要抛出一个 StopIteration 循环就结束了。
通过上述代码我们可以看到迭代器具有一个特点就是惰性求值,每一次循环的值,我们都是算出来的,并不是我事先存储起来的。一般for循环计算大量有规律的数据时,我们可以使用迭代器,这样可以减少内存的占用。
总结:
- 实现了迭代器的对象称之为可迭代对象,但一般可迭代对象都是容器,即起到了存储数据的作用。一个可迭代对象可能就是一个迭代器。
- 一个标准的迭代器具有的特点:
(1) 实现了 __iter__ 方法和 __next__ 方法 。
(2) 迭代器 具有惰性求值的特点。
(3) __next__ 方法中会抛出 StopIteration 异常用于结束 for 循环。