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)

     

  • 相关阅读:
    系统维护相关问题
    Python环境维护
    哈希表解决字符串问题
    论文笔记二:《A Tutoral on Spectral Clustering》
    论文笔记之哈希学习比较--《Supervised Hashing with Kernels》《Towards Optimal Binary Code Learning via Ordinal Embedding》《Top Rank Supervised Binary Coding for Visual Search》
    Java中String、StringBuffer、StringBuilder的比较与源 代码分析
    浙大pat1040 Longest Symmetric String(25 分)
    浙大pat1039 Course List for Student(25 分)
    浙大pat---1036 Boys vs Girls (25)
    百炼oj-4151:电影节
  • 原文地址:https://www.cnblogs.com/linshuhui/p/8987842.html
Copyright © 2011-2022 走看看