生成器

写在前面的话:
这是我看视频教程抄的笔记,原本是设置为私密的,没想到在APP里不能看。为了能够在APP里看,我只能公开,如有冒失或是侵权,请告知,也深表歉意!

通过列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限制的,而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面的几个元素,
那后面绝大多数占用的空间都白白浪费了,所以,如果列表元素可以按照某种算法推算出来,那么是否可以在循环的过程中不断推算出后续的元素呢,这样就不必创建完整的list,从而节省大量空间。
在python中,这种一边循环一边计算的机制,称为生成器:genetator

把创建列表中的中括号改为括号,就变成了生成式。
	列表:a = [x*2 for x in range(10)]
	列表变成生成器:a = (x*2 for x in range(10))

只要加了yield的函数,就变成了生成器,不叫函数了。
只要执行到了yield,程序就会暂停,并把后边那个的值返回
如下程序:
	def test():
		print("---start---")
		a,b = 0,1
		for i in range(5):
			print("---1---")
			yield b     	# 遇到了yield,这里会暂停,并把这个b的值返回!
			print("---2---")
			a,b = b,a+b
			print("---3---")
		print("---stop---")

	该程序执行如下:
		用一个变量进行保存:
			a = test()
		执行这个生成器test:
			next(a)	
				打印出:---start---
					1
	如果生成器一直用next()来执行,到最后没有值的时候出现异常报错,我们可以用for 循环遍历出来,这样就不会保存了:
		a = test()
		for i in a:
			print(i)
		print("---stop---")

	next(a)与a.__next__()这两种方式是一样的。
	a.send("你好")与__next__区别:
		send()可以传一个值,这个值是给yield这个表达式用的

迭代器:
可以使用isinstance()判断一个对象是否可以迭代;
isinstance(“abcdefg” , Iterable)
也可以用for 循环,如果可以循环,则可迭代,反之!

生成器一定是迭代器,但迭代器不一定是生成器!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值