一、迭代器概念
1、迭代器的定义
迭代器是访问可迭代对象的一种方法,用迭代器可以访问可迭代对象
迭代器是指iter(可迭代对象)返回的对象
迭代器可以用next(it)函数获取可迭代对象的数据
2、迭代器函数
iter(iterable) 从可迭代对象中返回一个迭代器,iterable必须是一个能提供一个迭代器的对象。
next(iterator)从迭代器iterator中获取下一个记录。如果无法获取下一条记录,则触发StopIteration异常通知
说明
a、迭代器只能往前取值,不能后退
b、用iter函数可以返回一个可迭代对象的迭代器
3、示例
L = [2, 3, 5, 7]
it = iter(L) # 让可迭代对象L 提供一个迭代器 并用it绑定
next(it) # 2
next(it) # 3
next(it) # 5
next(it) # 7
next(it) # StopIteration 异常通知
# 用迭代器获取range对象的数据
it = iter(range(1, 10, 3))
next(it) # 1
next(it) # 4
next(it) # 7
next(it) # StopIteration # 通知next调用者,已无数据
4、for语句和while、iter、next的组合
for 语句实质就是while 、next、iter的组合,for语句会更简单方便,两者实现的效果一样,顾一般参与for语句迭代对象
L = [2, 3, 5, 7]
# 用for循环来访问可迭代对象中的数据
for x in L:
print(x)
# 用while循环访问可迭代对象中的数据
# 第一步,让L给我们一个迭代器
it = iter(L)
# 第二步,循环用it迭代器去获取L中的数据,
# 直到StopIteration为止
while True:
try:
x = next(it)
print(x)
except StopIteration:
break
二、生成器 Generator (python 2.5 及之后的版本)
1、生成器的定义
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象生成器有两种: 生成器函数和生成器表达式
2、生成器函数
含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象注: yield 翻译为(产生或生成)
yield 语法
yield 表达式
yield 说明
yield 用于def 函数中,目的是将此函数作为生成器函数使用
yield 用来生成数据,供迭代器的next(it) 函数使用
yield 示例
def myyield():
'''此函数因为含有yield语句,所以是生成器函数'''
print("即将生成1")
yield 1
print("即将生成3")
yield 3
print("即将生成5")
yield 5
print("即将生成7")
yield 7
print("生成器函数调用结束")
gen = myyield() # gen 绑定是的生成器,生成器是可迭代对象
# 方法1 通过iter和next访问
it = iter(gen)
# next(it)开始执行生成器函数的语句,直到遇见yield语句为止
x = next(it)
print(x)
# 方法2 使用for语句
for x in gen:
print(x) # 1 3 5 7
生成器函数说明
a、生成器函数的调用将返回一个生成器对象,生成器对象是可迭代对象
b、生成器函数调用 return 会触发一个StopIteration异常
3、生成器表达式
语法(表达式 for 变量 in 可迭代对象 [if 真值表达式])
说明:[ ]内的if子句可以省略
作用
用推导式的形式生成一个新的生成器
示例
gen = (x ** 2 for x in range(1, 5))
it = iter(gen)
next(it) # 1
next(it) # 4
next(it) # 9
next(it) # 16
看程序执行结果有什么不同:
1) 程序1 列表推导式,直接生成了lst列表
L = [2, 3, 5, 7]
lst = [x + 1 for x in L]
it = iter(lst)
print(next(it)) # 3
L[1] = 30
print(next(it)) # 4
2) 程序2 生成器表达式,lst内的元素只有在next的时候才生成
L = [2, 3, 5, 7]
lst = (x + 1 for x in L)
it = iter(lst)
print(next(it)) # 3
L[1] = 30
print(next(it)) # 31
三、迭代工具函数
迭代工具函数的作用是生成一个个性化的可迭代对象1、zip(iter1, iter2, iter3, ....)
返回一个zip对象,此对象用于生成一个元组,此元组的中的元素分别由iter1,iter2可迭代对象中的元素构成(元组个数由最小的可迭代对象决定)
2、enumerate(iterable, start=0)
生成带索引的枚举对象,返回的迭代类型为索引-值对 (index-value) 对,默认索引从零开始,也可用start指定应用场景:删除数据
3、示例
numbers = [10086, 10000, 10010, 95588]
names = ['中国移动', '中国电信', '中国联通']
for t in zip(numbers, names):
print(t)
# 运行结果:
(10086, '中国移动')
(10000, '中国电信')
(10010, '中国联通')
for n, a in zip(numbers, names): # 等同于序列赋值
print(a, '的客服号码是:', n)
# 运行结果:
中国移动 的客服号码是: 10086
中国电信 的客服号码是: 10000
中国联通 的客服号码是: 10010
for t in zip(range(2), numbers, names):
print(t)
# 运行结果:
(0, 10086, '中国移动')
(1, 10000, '中国电信')
d = dict(zip(numbers, names)) # 可以通过zip 直接组成字典
>>> d
{10086: '中国移动', 10000: '中国电信', 10010: '中国联通'}
for t in enumerate(names):
print(t)
# 运行结果:
(0, '中国移动')
(1, '中国电信')
(2, '中国联通')
for t in enumerate(names, 20000):
print(t)
# 运行结果:
(20000, '中国移动')
(20001, '中国电信')
(20002, '中国联通')