Python的生成器函数详解

 更新时间:2024年02月19日 09:04:10   作者:LittleHuang950620  
这篇文章主要介绍了Python的生成器函数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

Python的生成器函数

生成器的概念

生成器是Python中的一个对象,对这个对象进行操作,可以依次生产出按生成器内部运算产生的数据。

但是要注意,如果不对生成器进行操作,是不会产生数据的。

称这样的方式为惰性求值,延或者迟求值。

构造生成器

  • 生成器表达式

以前学过一种方式叫生成器表达式,例如:

g1 = (x*2 for x in range(5))
next(g1)
0
next(g1)
2
...

这就不说了。

  • 生成器函数

生成器函数,就是说定义函数时,内部带yield就算生成器函数。

每次返回的值就是yield后面的值,例如:

def g2():
    for x in range(5):
        yield x*2

list(g2)
[0, 2, 4, 6, 8]

这个yield很牛逼,和return一样,遇到之后就返回后面的值,但是yield会记住当时执行到哪里了,下一次执行从这个地方开始(就是生成器的特点)。

生成器函数的语法糖

就是yield from 语法,一种看起来简洁的表达形式吧。

普通形式的生成器函数:

def inc1():
    for x in range(10000):
        yield x

相当于

def inc2():
    yield from range(10000)

也就是说,yield from iterable 相当于 yield item for item in iterable

python生成器和yield语句

生成器

  • 生成器是可以动态(循环一次计算一次返回一次)提供数据的可迭代对象(所以属于可迭代对象,即有__iter__()和__next__())
  • 不必创建容器存储完整的结果,而节省内存空间(延迟/惰性操作)
  • 含有yield语句的函数为生成器函数,返回值为生成器对象

普通可迭代对象和生成器对比

定义函数,获取列表中所有偶数

list01 = [4,54,65,6,76,87,9]

#传统方式
def get_even01():
	#做一个容器来存储数据
	result = []
	for item in list01:
		if item % 2 == 0:
			result.append(item)
	return result

re = get_even01()
for item in re:
	print(item)

#使用生成器技术
def get_even02():
	for item in list01:
		if item % 2 == 0:
			yield item	#yield是生成器的关键词

re = get_even02()	#返回一个生成器对象
for item in re:	#使用for来迭代re,因为生成器也是可迭代对象(有__iter__()方法)
	print(item)

使用生成器的最大作用是节省内存

yield语句

def f1():
	for i in range(2):
		yield i
		
g = f1()	

print(g.__next__())	#0
print(g.__next__())	#1
print(g.__next__())	#抛出异常StopIteration

#为了不抛出异常,改写上面的代码
def f1():
	for i in range(2):
		yield i
g = f1()
while True:
	try:
		print(g.__next__())
	except Exception as e:	#捕获异常,结束循环
		break		

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。

相关文章

  • nx.adjacency_matrix计算邻接矩阵与真实结果不一致的解决

    nx.adjacency_matrix计算邻接矩阵与真实结果不一致的解决

    这篇文章主要介绍了nx.adjacency_matrix计算邻接矩阵与真实结果不一致的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Python可视化分析全球火山分布

    Python可视化分析全球火山分布

    也就在前几天,南太平洋岛国汤加发生火山喷发。所以今天小编将为大家介绍如何用Python当中的folium模块以及其他的可视化库来对全球的火山情况做一个分析。需要的可以参考一下
    2022-01-01
  • pycharm sciview的图片另存为操作

    pycharm sciview的图片另存为操作

    这篇文章主要介绍了pycharm sciview的图片另存为操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • pandas删除部分数据后重新生成索引的实现

    pandas删除部分数据后重新生成索引的实现

    这篇文章主要介绍了pandas删除部分数据后重新生成索引的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • python密码错误三次锁定(实例讲解)

    python密码错误三次锁定(实例讲解)

    下面小编就为大家分享一篇python密码错误三次锁定的实例讲解。具有很好的参考价值。希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • Python hmac模块使用实例解析

    Python hmac模块使用实例解析

    这篇文章主要介绍了Python hmac模块使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器

    浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器

    这篇文章主要介绍了Python中的可迭代对象、迭代器、For循环工作机制、生成器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • python绘制雪景图

    python绘制雪景图

    这篇文章主要为大家详细介绍了python绘制雪景图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • python抓取网页时字符集转换问题处理方案分享

    python抓取网页时字符集转换问题处理方案分享

    python学习过程中发现英文不好学起来挺困难的,其中小弟就遇到一个十分蛋疼的问题,百度了半天就没找到解决办法~囧~摸索了半天自己解决了,记录下来与君共勉。
    2014-06-06
  • 如何使用Python对NetCDF数据做空间相关分析

    如何使用Python对NetCDF数据做空间相关分析

    这篇文章主要介绍了如何使用Python对NetCDF数据做空间相关分析,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04

最新评论

?


http://www.vxiaotou.com