python迭代器的目的:使用next函数获取下一个元素,只能将值向前取,不能向后取。 python生成器的用途:动态提供数据,调用return生成StopIteration异常,通知next(it)函数不再提供数据。
一、迭代器
什么是迭代器
迭代器是iter(可迭代对象)函数返回的对象(实例)
迭代器可以用next(it)函数获取可迭代对象的数据
迭代器函数:
iter(iterable) 从可迭代对象返回一个迭代器,iterable 必须是可以提供迭代器的可迭代对象
next(iterator) 从iterator迭代器中获取下一条记录,如果获取不到下一条记录,则触发StopIteration异常
说明:
迭代器是访问可迭代对象的一种方式
迭代器只能向前取值,不会后退
用iter函数可以返回一个可迭代对象的迭代器
示例:
L = [2,3,4]或者 L = range(2,5)
it = iter(L)#使用iter函数使it绑定一个迭代器对象
next(it)#返回2
next(it)#返回3
next(it)#返回4
next(it)#触发StopIteration异常
迭代器的用途:
迭代器对象能用next函数获取下一个元素
示例:
#此示例示意用迭代器来访问可迭代对象
#用for语句访问可迭代对象L
L = [2,3,5,7]
for x in L:
print(x)
#用while语句访问可迭代对象L
it = iter(L)
while True:
try:
x = next(L)
print(x)
except StopIteration:
print('终止迭代,迭代器不能提供任何数据')
break
二、生成器Generator(python2.5之后)
什么是生成器:
生成器是可以动态提供数据的对象(不是一次生成,因此不占用内存空间),生成器对象也是可迭代对象(实例)
生成器有两种:
生成器函数
生成器表达式
生成器函数定义:
带有 yield 语句的函数是一个生成器函数,它在调用时返回一个生成器对象
yield语句
语法:yield 表达式
说明:yield用在def函数中,目的是把这个函数当作生成器函数使用
yield用来生成数据,供迭代器next(it)函数使用
实例:
#此示例示意生成器函数的定义及示意
def myyield():
'''此函数为生成器函数'''
yield 2#生成2
yield 3#生成3
yield 5#生成5
#用for语句访问myyield函数
for x in myyield():
print(x)
#用迭代器访问
gen = myyield()
it = iter(gen)
next(it)
生成器函数说明:
(1)生成器函数的调用会返回一个生成器对象,它是一个可迭代对象
(2)生成器函数调用return时,会产生StopIteration异常,通知next(it)函数不能再提供数据
示例:
#写一个myinteger(n)函数
def myinteger(n):
for x in range(n):
yield x
#for循环访问生成器
for x in myinteger(int(input('请输入整数:')))
print(x)
#用迭代器访问
it = iter(myinteger(10))
while True:
print(next(it))#到10时发生StopIteration错误
生成器表达式:
语法:(表达式 for 变量 in 可迭代对象 [if 真值表达式])
作用:用推导式的形式生成一个新的生成器
示例:
gen = (x**2 for x in range(1,4))#并没有生成数据
#gen = [x**2 for x in range(1,4)]#先在内存中生成数据
it = iter(gen)
next(it)#1
next(it)#4
next(it)#9
next(it)#StopIteration
列表推导式和生成表达式的区别:
生成器是动态生成的,即用即用,列表表达式是静态的。
示例:
L = [1,2,3,4]
gen = (x for x in L)#gen绑定生成器
lst = [x for x in L]#lst绑定列表
L[1] = 222#改变原列表的第二个元素
for x in lst:
print(x)#1 2 3 4不变
for x in gen:
print(x)#1 222 3 4 ,第二个数是222
迭代工具函数:
迭代工具函数的作用是生成个性化的可迭代对象
函数:
zip(iter1 [,iter2,iter3,…]) 返回一个zip对象,用于生成一个元组,元组的个数由最小的可迭代对象决定
enumerate(iterable[,start]) 生成带索引的枚举类型,返回的迭代类型为索引值对(index, value)。默认索引从零开始。你也可以使用开始绑定。
示例1:
numbers = [10086,10000,10010,95588]
names = ['中国移动','中国电信','中国联通']
for x in zip(numbers,names):
print(x)
#生成元组:
#(10086,'中国移动')
#(10000,'中国电信')
#(10010,'中国移动')
#for n,a in zip(numbers,names):
#print(n,a)
#d = dict(zip(names,number))生成字典
#for x in zip(range(10),numbers,names):
# print(x)x为三个对象组成的一个元组
示例2:
#实现机制
def myzip(iter1,iter2):
it1 = iter(iter1)
it2 = iter(iter2)
while True:
x = next(it1)
y = next(it2)
yield (x,y)
for x in myzip(range(100),range(50))
#示例3:
names = list('string')
for x in enumerate(names,start = 100):
print(x)#指定start会使索引从start开始
#(1000,'s') (101,'t')..返回元组的索引-值对,默认索引从0开始
#index = element = x
#print('索引是',index,'对应的元素是',element)
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python PyQt 添加菜单选项12/25
- ♥ python中的re是什么10/14
- ♥ python3.7如何清屏10/17
- ♥ 如何理解python模块的搜索路径?11/07
- ♥ 我可以在手机上编写 python 代码吗?如何实现?10/17
- ♥ python3时间中时间函数如何输出?12/15
内容反馈