列表生成式:是代码更简洁.

也可以是函数,比如func(i)

生成器:generator

列表生成式,是中括号,改成小括号,就是生成器:

如果你用列表生成式,生成一亿个数据:这里会卡好久,会生成一亿个数据到内存里去。

而用生成器,立马会得到生成器的内存地址,不需要等待:

但是要注意,生成器c不允许使用下标的方式,进行取值。因为循环还没计算到这个值。

  • 生成器只有在调用时才会生成相应的数据;
  • 生成器有一种方法c.__next__(),来取下一个值,只有下一个next,没办法返回上一个值。它每次只保留一个值;
  • 只记录当前位置;
  • 只有一个方法__next__()方法。在py2里,生成器的下一个方法的写法是next()

现在我们用另外一种方法来创建一个生成器:

fib(10)代表max生成10个数列,a代表第一个值,b代表第二个值,n表示循环10次

这里很容易混淆,大家一定要注意!!!

结果如下:

这个时候,我们把print(b)替换为yield b,yield是产量的意思,这个时候,这个fib()就是生成器了

yield的作用,就是中断状态,就是返回当前状态的值,并且函数停在这个位置。yield在第一次next的时候,函数执行到yield就返回,(yield之前的程序执行完,yield后面的就不执行了!),紧接着第二次next的时候,首先,函数会继续执行yield后面的程序,然后继续执行循环,直至执行到yield之前的函数!!!如此反复。

而且。这个fib(100)这个生成器非常牛逼,可以用f.__netxt__()的方式,随时调用函数fib(),随时执行,调用一次以后可以去干别的时候,回头再来执行一次。这个就是生成器的牛逼之处!!!

如果你不用for循环,一直用__next__()方法,就会超过数值,这个时候会报错,出一个异常代码StopIteration:done

注意函数里的return '---done---',那么在报错的打印中就也会返回这个return这个字符串:

return在这里的作用就是异常的时候打印的东西。

我们现在要对异常做处理:我们要抓住异常状态用try...except StopIteration来处理

只要出的错误是StopIteration,那么下面的代码就可以抓住,然后做相应的处理:

在 try里用next(生成器)的写法跟__next__()方法是一样的效果。

生成器还有一个牛逼的用法,实现多线程的并行效果:

这个是一个典型的生产者消费者模型,一个人生产包子,一个吃包子:

首先我们牢记,yield的作用,就是中断状态,就是返回当前状态的值,并且函数停在这个位置。yield在第一次next的时候,函数执行到yield就返回,(yield之前的程序执行完,yield后面的就不执行了!),紧接着第二次next的时候,首先,函数会继续执行yield后面的程序,然后继续执行循环,直至执行到yield之前的函数!!!如此反复。

我们这里发现用__next__()不会给yield传值,但是send(变量)可以相当于是__next__(),而且给yield传值了!

我们再看生产者的代码:

上面的这个方法也叫异步,也叫协程,nginx用的也是这个方法

生成器+列表生成式,生成器可以节省内存,随时调取函数运行,以及实现多线程运行函数,__next__()和.send(参数)的区别,a,b=b,a+b其实是元祖的用法,出现异常状态用try...except StopIteration来处理的更多相关文章

  1. python协程函数应用 列表生成式 生成器表达式

    协程函数应用 列表生成式 生成器表达式   一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...

  2. Python之旅Day5 列表生成式 生成器 迭代器 装饰器

    装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...

  3. python 基础 列表生成式 生成器

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  4. Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式

    一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...

  5. 列表生成式 生成器 迭代器 yield

    列表生成式 格式:通过一个或者若干个在List里边的for构建List而非List外部的for循环 举个例子:计算从1到10整数的平方构成一个List L=[ x*x for x in range(1 ...

  6. s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

    python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...

  7. Python学习 Day 4 函数 切片 迭代 列表生成式 生成器

    定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...

  8. 列表生成式&生成器表达式

    一.列表生成式 def func(): return [lambda x:i*x for i in range(4)] print([j(2) for j in func()]) 结果:[6,6,6, ...

  9. Python 列表生成式 生成器

    [x for x in os.listdir("F:\XXX")] 生成器(x * x for x in range(10)) 如果列表元素按照某种算法推算出来,那我们就可以在循环 ...

随机推荐

  1. ceph存储 ceph Bluestore的架构

    ceph 目前是开源社区比较流行的分布式块存储系统,其以良好的架构,稳定性和完善的数据服务功能,获得的了广泛的部署和应用. 目前ceph 最大的问题是其性能相对较差,特别是无法发挥SSD等高速设备的硬 ...

  2. mysql应该看的blog

    一个比较系统的学习mysql的网站:http://www.runoob.com/mysql/mysql-data-types.html

  3. [JavaScript]对象创建方法

    1.使用Object或对象字面量创建对象 (1)使用Object创建对象 var cat= new Object(); cat.name = "Tom"; cat.color= & ...

  4. Python主流框架

    15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架Django 应该是最出名的Pyth ...

  5. HTTP metadata数据

    信息元位置 信息元名称 信息元ID 信息元描述 1 MetadataVersion 5000 Metadata版本号 当前版本号为1.0 2 MetadataID 1019 MetadataID 3 ...

  6. cylance做的机器学习相关材料汇总

    https://www.cylance.com/en_us/products/our-products/protect----threatzero.html 产品介绍 关键!!!! https://w ...

  7. 【zzulioj-1676】与同学比身高(综合)

    题目链接: http://acm.zzuli.edu.cn/problem.php?id=1676 题目描述 新学年开学了,学校又迎来了一批新同学,已知部分同学之间的身高关系,请列出可推断出的同学之间 ...

  8. hibernate 延迟加载和抓取策略

    一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...

  9. 一步一步写jQuery插件

    转载自:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquer ...

  10. canvas 绘制图像

    结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ...