author:headsen chen

date:2018-03-22 10:59:46

notice:This article created by headsen chen himself and not allowed to copy.or you will count law questions.

1,列表生产式:
a = [1,3,2]
--->
[ i*2 for i in range(10) ]
先用i循环产生的值 *2 ,生成的值就是列表的新元素

以前的实现方法(python软件里实现):
a = [ ]
for i in range(10):
     a.append(i*2)

print(a)

作用:简化代码

扩展:传递变量i,也可以传递一个函数进去

[ func(i) for i in range(10)]

2,生成器generator:仅生成需要使用的元素,列表里用不到的元素就不生成,节省内存空间

实例:

( i*2  for  i  in  range(10))

b = ( i*2 for i in range(10))
    for i in b:
print(i)

作用:快速生成

[ i*2 for i in range(100000000) ] ----》 1分钟的时间生成,生成式写好后立即生成。
(补充:a = xxx \n len(a) 查看a生成到哪里了,取值a[10])

b = ( i*2 for i in range(1000000)) -----》瞬间完成,压根就不生成任何元素。调用的时候再生成

生成具体的元素:
for i in b:
print(i)
...
...
...

取值方法:
b._ _next_ _()

和列表的区别:调用的时候才生成
生成器取值的方法:

(1),只有用这一个next方法取值,取下一个值: b._ _next_ _(),实际中用next取值应用得比较少。
(2),只记住当前的位置,只记住当前位置的这个元素。从而达到节省内存的目的

3,利用函数来做生成器

3.1肺波拉起数列:除第一个第二个数外,任意一个数都可以由前两个数相加得到
此时用列表无法实现。可以用函数定义出:
def f(max):
     n,a,b =0,0,1
     while n<max:
     print(b) ------------》改成 yield b 就成立生成器
     a,b = b,a+b
     n =n+1
f(10) -----》生成10个该数列:1,1,2,3,5,8,13,21,34,55

def f(max):
  n,a,b =0,0,1
  while n<max:
  yield b
  a,b = b,a+b
  n =n+1
print(f(100))     ------------>调用方法     <generator object fib at 0x0000000000006CJSIF5645>

使用方法:
def f(max):
   n,a,b =0,0,1
   while n<max:
   yield b
   a,b = b,a+b
   n =n+1
g = f(100)
print(g.__next__())
print(g.__next__())
...

--->
1
1
...

作用:上面的f函数是可以在程序外来随时中断的,又可以随时的恢复启用,中间可以夹杂别的程序。
当f程序是个很大的很慢的程序时,就可以在这中间夹杂别的程序了

如:
def f(max):
   n,a,b =0,0,1
   while n<max:
   yield b
   a,b = b,a+b
   n =n+1
g = f(100)
print(g.__next__()) ---->1
print(g.__next__()) ---->1
print("do some other things")

print(g.__next__()) ----->2
print("do some other things")
print("do some other things")
print(g.__next__()) ----->3
print(g.__next__()) ----->5

例2:

def  f(max):
      n,a,b =0,0,1
      while n<max:
      yield b
      a,b = b,a+b
      n =n+1
      return "done"
g = f(10)
print("========== start loop ==========")
for i in g:
      print(i)

def f(max):
   n,a,b =0,0,1
   while n<max:
   yield b
   a,b = b,a+b
   n =n+1
   return "done"
g = f(10)
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

运行:
报错一个"done"的异常错误。因为取值超过了定义的10次,已经取不到值了

改进方法:引进try:

def f(max):
  n,a,b =0,0,1
while n<max:
  yield b
  a,b = b,a+b
  n =n+1
  return "done" -----------就是超值范围后的报错信息,异常的时候打印的消息。
g = f(10)

while True: ----------> 死循环
   try: ---------------> s是一种不断的抓的方法
      x = next(g)
      print("g:",x)
   except StopIteration as e:
      print("Generator return value:",e.value)
      break

意思是try下面的代码一旦出这个错:StopIteration (出来别的任何错都不处理)
就执行:print("Generator return value:",e.value) 和break 跳出循环

总结:代码带有yield的就不叫函数了。就是一个生成器了。

python里的生成器的更多相关文章

  1. Python中的生成器与yield

    对于python中的yield有些疑惑,然后在StackOverflow上看到了一篇回答,所以搬运过来了,英文好的直接看原文吧. 可迭代对象 当你创建一个列表的时候,你可以一个接一个地读取其中的项.一 ...

  2. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  3. 【python】迭代器&生成器

    源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...

  4. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  5. python中的生成器函数是如何工作的?

    以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...

  6. python记录_day12 生成器

    什么是生成器? 生成器的实质就是迭代器,我们能够从生成器中一个一的拿值 python中获取生成器的方式有三种: 1.通过生成器函数 2.通过生成器表达式 3.通过数据转换也可以获取生成器(某些对象执行 ...

  7. Python学习-39.Python中的生成器

    先回顾列表解释 lista = range(10) listb = [elem * elem for elem in lista] 那么listb就将会是0至9的二次方. 现在有这么一个需求,需要存储 ...

  8. python迭代器、生成器、装饰器

    1 迭代器 这里我们先来回顾一下什么是可迭代对象(Iterable)? 可以直接作用于for循环的对象统称为可迭代对象,即Iterable. # 一是集合数据类型,如list.tuple.dict.s ...

  9. python中的生成器(二)

    一. 剖析一下生成器对象 先看一个简单的例子,我们创建一个生成器函数,然后生成一个生成器对象 def gen(): print('start ..') for i in range(3): yield ...

随机推荐

  1. android 屏幕上面画线

    作业如下:在android屏幕上面任意画线 package feng.f121.drawline;//本人创建的包名,每人有每人的不同的包 import java.security.PublicKey ...

  2. C++ pair 类型

    Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的 ...

  3. Guid.NewGuid().ToString()得几种格式显示

    1.Guid.NewGuid().ToString("N") 结果为:        38bddf48f43c48588e0d78761eaa1ce6 2.Guid.NewGuid ...

  4. linode使用apt更新时停止的错误

    使用ubuntu在更新系统时候,有时候会出现这样的问题: 0% [Connecting to security.ubuntu.com (2001:67c:1560:8001::14)] 问了下客户,他 ...

  5. Atitit.软件gui按钮and面板---通讯子系统(区)-- github 的使用....

    Atitit.软件gui按钮and面板---通讯子系统(区)-- github 的使用.... 1. 1.注册账户以及创建仓库 1 2. 二.在GitHub中创建项目(create a new rep ...

  6. PCIe调试心得_DMA part1

    作者 :East  FPGA那点事儿 1.PCIe的DMA介绍在PCIe中需要使用DMA的项目,一定要先看XAPP1052,里面包含一个DMA的参考设计,对初学者有极大的帮助. XAPP1052中包含 ...

  7. 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 网上有好几种单页应用转seo的方案,有服务端渲染ssr.有预渲染prerender.google抓AJAX.静态化...这些方案都各有优劣,开发者可以根据不同的 ...

  8. CGameConfig类

    #ifndef __GAMECONFIG_H__ #define __GAMECONFIG_H__ #include "GameFrameHead.h" #include &quo ...

  9. 喵神 onevcat 的直播首秀

    喵神 onevcat 的直播首秀   王巍在圈内人称喵神,我和他在网上很早就认识,平时多有交流.在我眼中,他是一个幽默风趣高手.虽然他的博客中主要内容是 iOS 开发,但是他实际上涉及的技术领域还包括 ...

  10. 0077 web.xml中配置Spring MVC时,Servlet-name上报Servlet should have a mapping的错误

    这次是手工建立的web工程目录,在配置webapp/WEB-INF/web.xml的Spring MVC的DispatcherServlet时,在servlet-name上报错:Servlet sho ...