递归

迭代器

参考 https://docs.python.org/zh-cn/3.9/tutorial/classes.html#iterators

为什么要用迭代器

优点
1:迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件)
2:迭代器与列表比较,迭代器是惰性计算的,更节省内存(同一时刻只有一个值在内存中)
缺点:
1:无法获取迭代器的长度,使用不如列表索引取值灵活
2:一次性的,只能往后取值,不能倒着取值

在幕后,[for](https://docs.python.org/zh-cn/3.9/reference/compound_stmts.html#for) 语句会在容器对象上调用 [iter()](https://docs.python.org/zh-cn/3.9/library/functions.html#iter)

因此,关于遍历,推荐用for语句,而不是while语句

总结

关于迭代器,知道原理了解以下这两点就行

  • 这是python的一种内存优化机制
  • 提供了一种不依赖于索引的取值方式
  • 迭代器有两种创建方式:类、生成器

    生成器

    https://docs.python.org/zh-cn/3.9/tutorial/classes.html#generators
    这里需要掌握yield语句创建生成器的方式

    定义生成器

    1. def countdown(n):
    2. print('start coutdown')
    3. while n > 0:
    4. yield n #1
    5. n-=1
    6. print('done')

    next()调用生成器

    ```python g=countdown(5) print(g) #

print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) # StopIteration

  1. <a name="Rijxk"></a>
  2. ### for语句调用生成器
  3. ```python
  4. g=countdown(5)
  5. print(g) # <generator object countdown at 0x0000019E52B92120>
  6. for i in g: #iter(g)
  7. print(i)

while语句调用生成器

  1. while True:
  2. try:
  3. print(next(g))
  4. except StopIteration:
  5. break

for语句本质

https://docs.python.org/zh-cn/3.9/tutorial/classes.html#iterators

在幕后,[for](https://docs.python.org/zh-cn/3.9/reference/compound_stmts.html#for) 语句会在容器对象上调用 [iter()](https://docs.python.org/zh-cn/3.9/library/functions.html#iter)。

  1. for i in t: # t被for转换成iter(t)
  2. print(i)

等效于

  1. t = [1, 2, 3, 4, 5].__iter__() # 可以通过__iter__()方法或iter()内建函数把Iterable类型变成Iterator对象。
  2. # 循环:
  3. while True:
  4. try:
  5. # 获得下一个值:
  6. i = t.__next__()
  7. print(i)
  8. except StopIteration:
  9. # 遇到StopIteration就退出循环
  10. break
  11. t = iter([1, 2, 3, 4, 5]) # 可以通过__iter__()方法或iter()内建函数把Iterable类型变成Iterator对象。
  12. # 循环:
  13. while True:
  14. try:
  15. # 获得下一个值:
  16. i = next(t)
  17. print(i)
  18. except StopIteration:
  19. # 遇到StopIteration就退出循环
  20. break

总结

这部分的知识,涉及到了类(class),建议简单看下类基础再来看这里。
注解:可知,[for](https://docs.python.org/zh-cn/3.9/reference/compound_stmts.html#for)语句遍历前会对遍历对象进行iter()处理,迭代器无论是类还是生成器创建的,底层都有iter()、next()方法,iter() 本质上还是调用iter(),
next()本质上还是调用next()。

  • 优点(和其它循环(whilei)相比的):比while等循环功能强大,不仅遍历的对象种类多,而且比普通循环效率更高(自动把遍历对象生成迭代器)
  • 定义:遍历可迭代对象(string,list,dict等),如果是遍历可迭代对象,for会自动把in后面的可迭代对象转换成迭代器,把所有元素依次加载到内存,遍历完成后自动处理异常