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. Java Persistence with MyBatis 小结1

    数据持久层做的工作是1)将从数据库中查询到的数据生成需要的java对象:2)将 Java 对象中的数据通过 SQL 持久化到数据库中. MyBatis 通过抽象底层的 JDBC 代码,自动化 SQL ...

  2. unity, editorWindow update计时

    对于editorWindow,Time.deltaTime不起作用,所以需用下面方法对update进行计时: public class myEditorWindow : EditorWindow{ p ...

  3. How To run OAI eNB (No S1) with USRP X310(1)

    How To run OAI eNB (No S1) with USRP X310 1.Things need to be done 1.1 Install Ubuntu 14.04 1.1.1 In ...

  4. 从零开始学习OpenCL开发(一)架构

    1 异构计算.GPGPU与OpenCL OpenCL是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算(heterogeneous)的标准,它是跨平台的.旨在充分利用GPU ...

  5. Python黑魔法,一行实现并行化

    Python 在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题.常见的经典 Python 多线程.多进程教程多显得偏“重”.而且往往隔靴搔 ...

  6. CXSprite.cpp文件

    #include "XSprite.h" CXSprite::CXSprite(void) { m_strPic.clear(); } CXSprite::~CXSprite() ...

  7. 【手把手教你全文检索】Apache Lucene初探 (zhuan)

    http://www.cnblogs.com/xing901022/p/3933675.html *************************************************** ...

  8. C语言 · 大数乘法

    #include<stdio.h> #include<string.h> ]; void mult(char a[],char b[]) { ,alen,blen,sum=,r ...

  9. JavaScript 框架 jQuery 的下载和安装

    jQuery 简介: jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 很容易学习. jQuery 下载: // 官网: htt ...

  10. Android——Android Studio的一些小技巧(转)

    ndroid课程---Android Studio的一些小技巧   APK瘦身 在Android Studio中我们可以开启混淆,和自动删除没有Resources文件,来达到给APP瘦身的目的,这对于 ...