• python关于type()与生成器generator的用法


    如果按这种形式写  type(a)(b)
    那此处的b是个可迭代对象,这个对象迭代完成后,再放到type里 
     
    from pymysql._compat import range_type, text_type, PY2
    
    def _ensure_bytes(x, encoding=None):
        if isinstance(x, text_type):
            x = x.encode()   #将str转化成byte
    
        elif isinstance(x, (tuple, list)):
            # x = (_ensure_bytes(v, encoding=encoding) for v in x)   #不加type,返回的是一个生成器< generator object <genexpr> at 0x104feab40>,所以遇到return不会终止,会继续运行;
            x = type(x)(_ensure_bytes(v, encoding=encoding) for v in x) #加type,将返回的是生成器generator,因为没有yield,所以就算遇到return也会继续运行完成,完成后把生成器再转换成列表,打印结果[1,'2',9]
            # x = type(b)(_ensure_bytes(v, encoding=encoding) for v in x)  #除了可以转换成列表还可以转换成字典,打印结果(1, b'2', 9)
        return x
    
    
    a = [1,'2',9]
    # b = ()
    print(_ensure_bytes(a))
    print(type(a))

     参考文章链接:https://blog.csdn.net/qi1840439776/article/details/78417656

    生成器与函数的区别:

    这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

    简单生成器:

    要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

    带yield 语句的生成器:

    仔细观察,可以看出,fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。

    也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print b改为yield b就可以了:

    加强的生成器:

    在 python2.5 中,一些加强特性加入到生成器中,所以除了 next()来获得下个生成的值,用户可以将值回送给生成器[send()],在生成器中抛出异常,以及要求生成器退出[close()]

    再举例:

    a1 = [1,'2',9]
    
    c = (i for i in a1)  #括号里面是生成器,存储的是算法
    print(c)   #打印结果:<generator object <genexpr> at 0x0301A7B0>
    
    d = list(i for i in a1)
    print(list)  #打印结果<class 'list'>
    print(d)   #打印结果:[1, '2', 9]
    
    e = type(a1)(i for i in a1)  #将生成器转化为list
    print(type(a1))  #打印结果<class 'list'>
    print(e)   #打印结果:[1, '2', 9]
  • 相关阅读:
    Uva 11806 拉拉队 二进制+容斥原理 经典!
    CSU CHESS
    hdu 4049 Tourism Planning 状态压缩dp
    HDOJ 4661: Message Passing(找递推公式+逆元)
    HDU
    hdu4647(思路啊!)
    spoj 370. Ones and zeros(搜索+同余剪枝+链表存数(可能越界LL))
    URAL
    URAL
    hdu4614 (二分线段树)
  • 原文地址:https://www.cnblogs.com/lelexiong/p/10103760.html
Copyright © 2020-2023  润新知