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]

 

posted @ 2018-12-11 17:47  乐乐熊小妹  阅读(1462)  评论(0编辑  收藏  举报