python_迭代器与生成器

一、迭代器

  • 什么是迭代器
    迭代器是指用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)对,默认索引从零开始,也可以使用start绑定

    示例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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值