前言
本人自学了廖雪峰老师编写的Python教程,将在学习过程中的一些心得、方法 成体系的写成 本Python系列,所举的部分例子可能会和廖雪峰老师举的例子一致,本Python系列仅供大家学习参考,也相当于本人的学习笔记。
一、迭代
1、迭代概念
- 迭代的定义:后一个元素跟前一个元素有必要关联,也就是说前一个元素影响着后一个元素,比如把列表或元组用for循环来遍历,这种遍历就是迭代。
- python中可迭代的对象:列表、元组、字典、字符串
- 只要是可以被for循环遍历的对象,就是可迭代的对象
2、判断对象是否是可迭代对象
- isinstance() 函数可判断 变量 类型
from collections.abc import Iterable
li = [1,2,'3']
tup = ('a','b')
dic = {1:'first',2:'second'}
print(isinstance(li,Iterable))
print(isinstance('abc',Iterable))
print(isinstance(tup,Iterable))
print(isinstance(dic,Iterable))
3、迭代器
- 可以被 next() 调用并不断的返回下一个值的对象 称为迭代器(Iterator)
from collections.abc import Iterator
isinstance([],Iterator)
False
isinstance({},Iterator)
False
isinstance('ab',Iterator)
False
可以看到列表、字典、字符串都不是迭代器,但他们是可迭代对象
isinstance((i for i in range(10)),Iterator)
True
可以看到生成器都是迭代器
二、生成器(generator)
1、生成器概念
- 在python中,一边循环,一边计算 的机制,叫做生成器
举个例子:在python中,我要读取一个列表,需要创建一个连续的内存空间,用来存储列表中的所有的元素,在使用生成器的时候,就不需要一开始就读取整个列表的所有元素,不需要向操作系统申请巨大的连续内存空间来存储列表中的所有元素,因为列表中的元素是按照某种算法推算出来的,在循环过程中,不断的推算后续元素,节约了内存空间
2、创建生成器
方法一:
- 把生成列表的 [] 换成 () 即可
gen = (i for i in range(10))
方法二:
- 在函数中,用 yield 语句来定义要打印的变量
def fib(max):
n,a,b = 1,0,1
while n <= max:
yield b
a,b = b,a+b
n=n+1
return 'done'
函数型生成器,每次执行到 yield 语句时会停止,返回 yield 定义的变量,下一次next() 调用时,从 yield 语句的下一个语句开始执行
3、调用生成器
- 生成器保留的是算法,next() 函数可以调用生成器,每调用一次就计算一次,直到计算到最后一个元素,再计算,抛出StopIteration的错误
gen = (i for i in range(10))
next(gen)
0
next(gen)
1
next(gen)
2
- 或者用for 循环遍历
gen = (i for i in range(10))
for i in gen:
print(i)
0
1
2
3
4
5
6
7
8
9
三、小结
- 凡是可以被用作 for 循环的对象都是可迭代(Iterable)对象
- 凡是可以被 next() 函数调用的对象,都是 Iterator 类型,表示一个惰性计算序列
- 集合数据类型(list,dict,str 等)是可迭代对象,不是迭代器,但是可以通过iter()获取一个生成器对象
- for 循环本质上就是不断地调用 next() 函数实现的
for i in [1,2,3]
pass
# 等价于
it=iter([1,2,3]) # 先变成 Iterator
while True: # 循环
try:
x=next(it) # 获取下一个值
except StopIteration:
break # 遇到 StopIteration 报错就退出循环