zoukankan      html  css  js  c++  java
  • Python生成器总结

    什么是生成器?

    可以理解为一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器就是一个可迭代对象。生成器可以说是提供了一种新的模式,那就是可以计算一部分,然后返回计算结果。但是保留了当前状态,下次可在另外一个地方调用它,它会继续按以前状态继续执行下去。这对于数据量很大的程序有很大的用处。总之就是很强~~

    生成器总共有两种产生方式:一种是声生成器表达式,一种是生成器函数。

    一、生成器表达式:

    #生成器表达式和列表推导式非常相似,只要把列表推导式的【】改成()即可。
    g1=(i**2 for i in range(10))
    print(next(g1))  #0
    print(next(g1))   #1
    print(next(g1))   #4

    二、生成器函数

      从格式上来说生成器函数和普通函数很相似,只有一点的区别。那就是生成器函数不需要return,而是用一个新的关键字yield。yield语句的作用主要有两点。一是返回当前语句的技术结果,二是挂起函数的状态,当下次调用时,从当前位置继续执行。

      关于生成器函数我们先来看一个简单的例子。

    def g_func():
        print('first')
        yield 11111
        print('second')
        yield 22222
        print('third')
        yield 3333
    g=g_func()
    print(g)   #<generator object g_func at 0x0030E180>
    print(next(g))  
    #first
    11111
    print(next(g))
    #second
    22222
    print(next(g))
    #third
    3333

       接着我们来看一个高级一点的。现在有这样我们想产生一个大于某个数的的所有质数。这个一看是产生的是一个无穷的数列,所以正常方法是行不通的。就算是产生一个有穷的的序列,一旦我们的序列长度很大,直接生成这对内存占用也是巨大的,但是我们的生成器就可以完美解决这个问题。我们可以产生一个生成器,需要多少取多少即可。

    import math
    def is_prime(n):
        for i in range(2,int(math.sqrt(n))+1):
            if n <= 1: 
                  return False
            if n%i==0:
                return False
        return True
    
    
    def creat_prime(n):
        while True:
            if is_prime(n):
                yield print(n)
            n+=1
    g=creat_prime(10)
    for i in range(100):
        next(g)

     

  • 相关阅读:
    c++ STL中的vector与list为什么没有提供find操作?
    转发:CAOZ星球提问。 遇到很大瓶颈,想离职又不敢离职怎么办
    转发 :caoz:数据分析这点事
    那些绕不开的Linux
    记录 《 Bootstrap 基础教程》 学习笔记 第一天
    迈出你的第一步——天助自助者
    this指向问题
    小结
    前端小白的福利
    真实案例分享
  • 原文地址:https://www.cnblogs.com/linshuhui/p/8987842.html
Copyright © 2011-2022 走看看