1、迭代器
1.1 定义
迭代器是访问可迭代对象的工具
迭代器是指iter(obj) 函数返回的对象(实例)
迭代器可以用next(it)函数获取可迭代对象的数据
1.2 迭代器函数 iter 和 next
·iter(iteratle)从可迭代对象中返回一个迭代器,iteratle必须是能提供一个迭代器的对象
·next(iterator)从迭代器iterator中获取下一个记录,如果无法获取下一条记录,触发StopIterator异常
1.3 说明:
迭代器只能往前取值,不会后退
用iter函数可以返回一个可迭代对象的迭代器
1.4 示例1:
L= [1,3,5,7]
it = iter(L) # 让 L 提供一个能够访问自己的迭代器
next(it) # 1 从迭代器中取值,让迭代器去获取L中的第一个元素
next(it) # 3
next(it) # 5
next(it) # 7
next(it) # 触发StopOIterator异常
1.5 迭代器的用途:
用迭代器可以依次访问可迭代对象的数据
2、生成器
2.1 定义
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)
2.2 优缺点
·用现生成
·用内存少
·行时间较长
·节省空间
2.3 生成器种类
生成器函数 # 含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
生成器表达式
3、yield语句
3.1 语法:
yield 表达式
3.2 说明:
yield 用于 def 函数中,,目的是将此函数作成生成器函数使用
yield用来生成数据,供迭代器和 next(it)函数使用
3.3 示例1
# 此示例示意含有yield语句的函数为生成器函数,及用yield生成整数
def myyield():
yield 2
yield 3
yield 5
yield 7
print("生成器生成结束")
# 调用生成器函数来创建一个生成器。返回的是一个对象 即:生成器
# 生成 2 3 5 7 四个数
gen = myyield()
# 用生成器拿到对应的迭代器
it= iter(gen)
# 访问迭代器
print(next(it))
print(next(it))
print(next(it))
print(next(it))
3.4 示例2
import time
# 此示例示意含有yield语句的生成器函数的调用顺序
# 生成器只有在 next(it) 函数调用时次啊会执行,且遇到yield之后返回相应的值给next(it)函数
def myyield():
print("即将生成2")
time.sleep(1)
yield 2
print("即将生成3")
time.sleep(1)
yield 3
print("即将生成5")
time.sleep(1)
yield 5
print("即将生成7")
time.sleep(1)
yield 7
print("生成器生成结束")
gen = myyield()
it= iter(gen)
print(next(it),end = '\n\n') # 此时生成器函数才开始执行,并遇到yield停止
print(next(it),end = '\n\n')
print(next(it),end = '\n\n')
print(next(it),end = '\n\n')
# print(next(it)) # 触发StopIteration异常
3.5 示例3
# 此示例示意用生成器函数生成 0~n 的整合
def myint(n):
i = 0
while i<n:
yield i
i+=1
a = int(input("请输入一个整数:"))
for x in myint(a):
print(x)
4、生成器函数的说明
生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象,通常用来动态生成数据
生成器函数调用 return 语句会触发一个 StopIterator异常
4.1 示例4
# 写一个生成器函数, myeven(start,stop) 用来生成start开始到stop(不包含)结束的偶数
def myeven(start,stop):
for i in range(start,stop):
if i % 2 == 0:
yield i
for i in myeven(1,10):
print(i) # 2 4 6 8
L = [x ** 2 for x in myeven(1,20)]
print(L) # [4, 16, 36, 64, 100, 144, 196, 256, 324]
4.2 示例5
# 写一个生成器函数myfactorial(n): 此函数用来生成n个从1开始的阶乘
import math
def myfactorial(n):
yield math.factorial(n)
for i in range(1,5+1):
for i in myfactorial(i):
print(i,end = ' ') # 1 2 6 24 120
print()
def myfac2(n):
return math.factorial(n)
for i in range(1,10):
print(myfac2(i),end = ' ') # 1 2 6 24 120 720 5040 40320 362880
print()
5、生成器表达式
5.1 语法:
(表达式 for 变量 in 可迭代对象 [if 真值表达式])
其中if 子句可以省略
5.2 作用:
用推导式形式创建一个新的生成器
5.3 示例6:
gen = (x**2 for x in range(1,5)) # 现用现生成
it = iter(gen)
print(next(it)) # 1
print(next(it)) # 4
print(next(it)) # 9
print(next(it)) #16
print(gen) # 打印生成器对象 : <generator object <genexpr> at 0x7f467888c5c8>
6、生成器表达式和列表推导式的区别
生成器表达式是现用现生成,列表推导式是一次性生成静态数据
示例7:
·列表推倒式
L = [2,3,5,7]
L2 = [x**2+1 for x in L] # 生成即不变
it = iter(L2)
print(next(it)) # 5
L[1] = 30
print(next(it)) # 10
·生成器表达式
L = [2,3,5,7]
gen = (x**2+1 for x in L) # 现用现生成
it = iter(gen)
print(next(it)) # 5
L[1] = 30
print(next(it)) # 901
7、迭代工具函数
7.1作用
是生成一个个性化的可迭代对象
7.2 函数
7.2.1 zip(iter1 [,iter2[…]])
返回一个zip对象,此对象用于生成元组,此元组的每个数据来源于参数中的可迭代对象,当最小的可迭代对象不再提供数据时迭代结束
示例8:
def myzip(iter1,iter2):
it1 = iter(iter1)
it2 = iter(iter2)
while True:
t = (next(it1),next(it2))
yield t
nums = [10086,10000,10010,95588]
names = ['中国移动','中国联通','中国电信']
for t in zip(range(1,100),nums,names):
print(t)
输出如下
(1, 10086, '中国移动')
(2, 10000, '中国联通')
(3, 10010, '中国电信')
7.2.2 enumerate(iterable [,start])
生成待索引的枚举对象,返回的迭代类型为 索引-值对(index-value),默认所以从0开始,也可以用start指定
示例9:
names = ['中国移动','中国联通','中国电信']
for t in enumerate(names,1):
print(t)
输出如下:
(1, '中国移动')
(2, '中国联通')
(3, '中国电信')