递归
迭代器
参考 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)
总结
关于迭代器,知道原理了解以下这两点就行
- 这是python的一种内存优化机制
- 提供了一种不依赖于索引的取值方式
- 迭代器有两种创建方式:类、生成器
生成器
https://docs.python.org/zh-cn/3.9/tutorial/classes.html#generators
这里需要掌握yield语句创建生成器的方式定义生成器
def countdown(n):
print('start coutdown')
while n > 0:
yield n #1
n-=1
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
<a name="Rijxk"></a>
### for语句调用生成器
```python
g=countdown(5)
print(g) # <generator object countdown at 0x0000019E52B92120>
for i in g: #iter(g)
print(i)
while语句调用生成器
while True:
try:
print(next(g))
except StopIteration:
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)。
for i in t: # t被for转换成iter(t)
print(i)
等效于
t = [1, 2, 3, 4, 5].__iter__() # 可以通过__iter__()方法或iter()内建函数把Iterable类型变成Iterator对象。
# 循环:
while True:
try:
# 获得下一个值:
i = t.__next__()
print(i)
except StopIteration:
# 遇到StopIteration就退出循环
break
或
t = iter([1, 2, 3, 4, 5]) # 可以通过__iter__()方法或iter()内建函数把Iterable类型变成Iterator对象。
# 循环:
while True:
try:
# 获得下一个值:
i = next(t)
print(i)
except StopIteration:
# 遇到StopIteration就退出循环
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后面的可迭代对象转换成迭代器,把所有元素依次加载到内存,遍历完成后自动处理异常