一、列表生成式:

  列表生成式即python内置的非常简单且强大的生成list的生成式。

  range(1,10)方法可以生成一个简单的list,

 1 l = []
 2
 3 for i in range(1,10):
 4     l.append(i)
 5
 6 print(l)
 7 >>>[1, 2, 3, 4, 5, 6, 7, 8, 9]
 8
 9
10 l = []
11
12 for i in range(1,10):
13     l.append(i*i)
14
15 print(l)
16 >>>[1, 4, 9, 16, 25, 36, 49, 64, 81]

    这样生成一个list有些许累赘,列表生成式就是为了简化这一过程:

l = [i for i in range(1,10)]
print(l)>>>[1, 2, 3, 4, 5, 6, 7, 8, 9]L = [i * i for i in range(1,10)]
print(L)>>>[1, 4, 9, 16, 25, 36, 49, 64, 81]

  for后边还可以加if判断,过滤出列表中所有的奇数:

1 L = [i * i for i in range(1,10) if i % 2 != 0]
2 print(L)
3
4 >>>[1, 9, 25, 49, 81]

  还可以两个for循环一起使用:

l = [ x * y for x in range(1,5) for y in range(6,10)]
print(l)>>>[6, 7, 8, 9, 12, 14, 16, 18, 18, 21, 24, 27, 24, 28, 32, 36]

二、生成器(generator):

  生成器是一种只有在调用时才会开始计算生成相应的数据,没调用时内存中只存储相关数据的计算方式和当前数据的相关位置。

  生成器可以大大节省我的内存空间。

  创建生成器的方法有很多种,方法一:只需要把列表生成式的“[ ]”改成“( )”即可

1 l = [i for i in range(10)]
2 print(l)
3
4 >>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5
6 g = (i for i in range(10))
7 print(g)
8
9 >>><generator object <genexpr> at 0x000001DBE98C9888>

  生成器输出的是可迭代的内存对象,可以理解为计算数据的方法。那么如何输出生成器中的数据呢 ?

  使用 next() 方法可以一个个的输出数据:

g = (i for i in range(10))
print(g)print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))>>><generator object <genexpr> at 0x000001C1102D9888>01234

  next()方法会把生成器中的数据一个个输出,若是next()的次数大于range()值的次数,则报StopIteration的错误。

  显然,用next()方法有点太low了,既然生成器是可迭代对象,那正确的取值方法是for循环:

 1 g = (i for i in range(5))
 2
 3 for i in g:
 4     print(i)
 5
 6 >>>0
 7     1
 8     2
 9     3
10     4

  像这样的如此潇洒与直接。

  方法二:yield

 1 def yrd():
 2     print("this is 1")
 3     yield 1
 4     print("this is 2")
 5     yield 5
 6     print("this is 3")
 7     yield 9
 8
 9 print(yrd())
10 >>><generator object yrd at 0x00000204F9609888>
11
12 y=yrd()
13 next(y)
14 >>>this is 1
15
16 next(y)
17 >>>this is 2
18
19 next(y)
20 >>>this is 3

   如果一个函数里有yield关键字,那个这个函数就不在是普通的函数了,而是摇身一变成为了生成器函数。

      生成器函数与普通的函数执行顺序是不一样的,普通的函数遇到return,或是执行到结尾就返回,而迭代器函数是每次调用next()方法时遇到yield就返回,再次执行next()方法时从上次yield的位置继续执行。

   同样,迭代器函数也可以使用for循环来取数据, for函数中其实也是封装的next()方法。当循环穷尽时for函数会自动获取报错退出。

 1 def yrd():
 2     print("this is 1")
 3     yield 1
 4     print("this is 2")
 5     yield 5
 6     print("this is 3")
 7     yield 9
 8
 9 for y in yrd():
10     print(y)
11
12 >>> this is 1
13     1
14     this is 2
15     5
16     this is 3
17     9

转载于:https://www.cnblogs.com/Adairye/p/9028880.html

python_生成器相关推荐

  1. Python_生成器Generator

    简介 生成器是用来创建Python序列的一个对象,可以用它迭代庞大的序列而不需在内存中创建和存储整个序列,因为它仅仅保存了这个序列的推算算法.Python3中range()是标准的一个生成器 主要作用 ...

  2. python_生成器简介

    # Author : XueFeng # 直接全部准备好,效率低 # 列表生成器 a = [i*2 for i in range(10000)] a[10]# 生成器 # 只有在调用时才会生成相应的数 ...

  3. 材料模拟python_用Python模拟无限生成器

    我正在尝试使用模拟库模拟无限生成器函数. (如果您使用Python 3.3,则为unittest.mock) 这是无限生成器的最小工作示例.如果我可以成功地模拟它,那么我希望能够模拟我正在使用的实际功 ...

  4. python_魔法方法(六):迭代器和生成器

    迭代器 自始至终,都有一个概念一直在用,但是我们却没来都没有人在的深入剖析它.这个概念就是迭代. 迭代的意思有点类似循环,每一次的重复的过程被称为迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭 ...

  5. Python_迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  6. Python_迭代器和生成器的复习_38

    迭代器和生成器 迭代器: 双下方法:很少直接调用的方法,一般情况下,是通过其他方法触发的 可迭代的协议--可迭代协议 含有__iter__ 的方法 ('__iter__' in dir(数据)) 可迭 ...

  7. 9 9简单的数独游戏python_如何使用tkinter GUI python创建9*9数独生成器?

    如何使用python和tkinter创建9*9数独生成器?,如何将其生成到gui?在 我试过这些:import random numbers = [1,2,3,4,5,6,7,8,9] def reg ...

  8. 9 9简单的数独游戏python_如何使用tkinter gui python创建一个9*9的数独生成器?

    如何使用python和tkinter创建9*9数独生成器?,如何将其生成到gui? 我试过这些: import random numbers = [1,2,3,4,5,6,7,8,9] def reg ...

  9. 文案生成 python_用 Python 开发一个【视频营销号】生成器

    原标题:用 Python 开发一个[视频营销号]生成器 之前小帅b在网上看到一个营销号文案生成器,把我给乐的: 其实这个用 Python 实现非常简单,根据用户输入的内容,简单替换一下关键字就可以了, ...

  10. c4d python_【C4D开发】C4D中的python生成器

    python生成器是预制的python 插件的objectData的封装(就和脚本是插件commandData的封装一样).这样创建生成器对象就不用写全脚本了,注意这物体仅仅是生成器,想创建变形器,还 ...

最新文章

  1. Android学习笔记18-自定义Seekbar拖动条式样
  2. iOS开发基础-九宫格坐标(4)
  3. 肿瘤细胞信号转导: 肿瘤治疗的靶向信号通路 PDF
  4. boost::mp11::mp_any相关用法的测试程序
  5. g11 android 4.4,HTC G11 Incredible S 稳定流畅Android4.0.4华丽体验Sense4.1 省电耐用
  6. php ajax json post请求参数传递,javascript - ajax post 有个请求参数要用json 但请问js怎么转json的?...
  7. Linux中screen的用法
  8. Web笔记-移动前端开发笔记
  9. java web windows_WinSW让你的JavaWEB程序作为Windows服务启动!
  10. 手机学linux软件下载,Linux标准教科书下载
  11. 无法下载php怎办,php无法下载大文件怎么办
  12. 漫谈 MinIO 集群扩容方法
  13. Android studio for mac
  14. LeetCode算法题-House Robber(Java实现)
  15. Python2.x(3.x)安装及Ulipad的安装和使用
  16. chrome扩展设置代理
  17. windows主机加固(2)
  18. 物联网之MQTT3.1.1和MQTT5协议 (4) PUBLISH报文
  19. MySQL进阶:触发器
  20. 数仓工具—Hive实战之拉链表(3)

热门文章

  1. 数据结构--图 记事本
  2. 下载了linux版redis怎么用,Linux下redis的安装与使用图文教程
  3. Hive查看执行计划
  4. Linux开发_多线程编程
  5. 如果伦敦地铁图是数据科学家画的……
  6. 关于SpringMVC中model的attribute无法指定别名的解决方案
  7. sql 执行query过程
  8. Graphviz 绘制流程图
  9. Redisbook学习笔记(1)字典(2)
  10. CSS3渐变——gradient