python中的生成器与解析语法

本文探讨了Python中生成器和解析语法的使用,如何通过yield创建高效数据流,以及它们在处理大量有序数据时的优势和局限。理解如何用生成器求因数和生成复杂序列,同时揭示了解析语法在简化操作中的作用,以及如何结合两者克服生成器的访问限制。
摘要由CSDN通过智能技术生成

生成器

在编程的过程中,我们常常需要一组有一定长度的有规律的数据,例如列举所有字母,等差等比数列,斐波那契数列等,这时候如果使用人工输入肯定很不现实,虽然可以通过编写一个函数来实现,但数据量一大,在所占空间上就大了,这时候就可以用到python中的yield语句,写一个生成器。生成器的语法类似于普通的函数,只不过将想要返回的值要通过yield语句来返回,并且在调用时一个通过for循环来配合。

def facotrs(n):
	for k in range(1,n+1):
		if n % k == 0:
			yield k

if __name__ == '__main__':
	for i in facotrs(100):
		print(i)

这是一个求一个数的所有因数的生成器,其中并没通过return 来返回值,而是通过yield ,每次执行到这个语句时,函数就会暂时中断,将k返回给for循环的循环变量,然后继续执行,直到函数结束运行,会自动抛出一个StopIteration异常,告诉for循环结束。

在面对需要一些复杂且大量的有规律的数据里,可以采用这种办法来实现,优点是生成器不是直接将所需的所有数据都写到内存上,而是按规律一个一个的生成,占用的内存空间小,但缺点也很明显,我们不能直接得到我们想要的数据,需要等待数据的生成,我们才能得到想要的数据。

解析语法

解析语法的作用类似于上述的生成器,更像是生成器的简化版本,同时也弥补了生成器的缺点。例如我们想要生成1~n的n2序列。

# 使用生成器可以这样写
def n2(n):
	for i in range(1, n+1):
		yield i ** 2

if __name__ == '__main__':
	for i in n2(10):
		print i

# 利用解析语法可以这样写
	n = [ i ** 2 for i in range(1, 11) ]
# 还可以这样
	n = [ i for i in n2(10) ]
	

利用解析语法来生成一些简单的序列相对简单一些,但面对一个规则难以描述的序列,还是生成器或是函数来的方便,但我们也看到了,解析语法结合生成器,就可以解决这个问题,而且也解决了生成器无法随意访问我们想要的数据的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值