如果按这种形式写  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,'',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,'',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]

最新文章

  1. MSSQL的表锁
  2. lua的三目运算符
  3. MySQL数据导出导入【转】
  4. MyEclipse使用自己的JDK和Tomcat
  5. java对象Integer不能引用传递
  6. 【转载】Google Analytics 使用图文全攻略
  7. 【Linux探索之旅】第一部分第五课:Unity桌面,人生若只如初见
  8. Swift # 柯里化函数
  9. linux学习(八)chmod、chown、umask、lsattr、chattr
  10. Yii2自带的验证码背景颜色怎么调?
  11. 从二进制数据流中构造GDAL可以读取的图像数据
  12. 洛谷P1983车站分级题解
  13. 用NFS挂载root出现:NFS: failed to create MNT RPC client, status=-101(-110)
  14. nodejs的express框架
  15. cnn公式推导
  16. 萤石A1互联网报警盒子破解细节分析
  17. C# 分页方法
  18. 【转】nginx中proxy_set_header Host $host的作用
  19. 纯css3加载动画
  20. bzoj 4627 值域线段树

热门文章

  1. [LeetCode] 884. Uncommon Words from Two Sentences 两个句子中不相同的单词
  2. wpf “{DependencyProperty.UnsetValue}”不是属性“Background”的有效值。异常
  3. Elasticsearch由浅入深(三)document的核心元数据、Id、_source元数据、全量替换、强制创建以及删除机制
  4. STM32开发/烧录/调试环境搭建 基于:Win10+STM32Cube+openocd+cmsis-dap(dap-link)
  5. [转帖]tcpdump详细教程
  6. Spring Boot + Vue 前后端分离开发,权限管理的一点思路
  7. Java程序使用Alpine Linux报错java.lang.NoClassDefFoundError: Could not initialize class org.xerial.snappy.Snappy解决
  8. grafana的用户及权限的配置
  9. golang学习笔记---命令源码文件接收参数(flag包)
  10. &#39;while&#39; statement cannot complete without throwing an exception