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

也可以是函数,比如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. spring3: AOP 之 通知参数

    前边章节已经介绍了声明通知,但如果想获取被被通知方法参数并传递给通知方法,该如何实现呢?接下来我们将介绍两种获取通知参数的方式. 使用JoinPoint获取:Spring AOP提供使用org.asp ...

  2. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  3. Python之virtualenv沙盒环境

    在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这 ...

  4. MySQL 5.6 二进制包安装配置多实例方法

    MySQL支持一台机器上启动多个实例,如果你的机器性能很好的话,启动多个实例将最大化利用你的服务器硬件资源. MySQL多实例一般有两种配置方法: 1.官方推荐的mysqld_multi方式,多个实例 ...

  5. [Mvel]Mvel2.0使用指南一 基础

    MVEL在很大程度上受到Java语法的启发,作为一个表达式语言,也有一些根本的区别,旨在更高的效率,例如:直接支持集合.数组和字符串匹配等操作以及正则表达式. MVEL用于执行使用Java语法编写的表 ...

  6. React Native探索(四)Flexbox布局详解

    相关文章 React Native探索系列 前言 在Android开发中我们有很多种布局,比如LinearLayout和RelativeLayout,同样在React Native也有它的布局,这个布 ...

  7. js 获取元素宽

    第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. 第 ...

  8. DNS域名解析负载均衡

  9. intellij idea 如何更改比编辑器文本字体和大小

    换上了intellij idea之后,第一件事就是想要改变下文字字体,因为在我这个27寸的2k分辨率的屏幕上,文字显然太小了. intellij idea字体设值分成两部分,一部分是UI部分字体字号设 ...

  10. python笔记-5(内置函数)

    一.内置函数 1.abs()--取绝对值函数 print(abs(-0.11)) x=-0.01 y=0.11 print(abs(x),abs(y)) ----------------------- ...