一、列表生成式

  列表生成式就是python设置的可以用来可以生成列表的

  如要生成一个0-9的列表我们可以通过以下代码实现:

  1. >>> list(range(10))
  2. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  但是如果生成的列表较为复杂呢?例如生成包含0²、1²、2²。。。9²这样一个列表;

  1. >>> L = []
  2. >>> for i in range(10):
  3. ... L.append(i*i)
  4. ...
  5. >>> L
  6. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  在上述代码中,我们通过for循环将数值append到列表L中,虽然可以实现,但是也是low爆了~~~,以下通过一行代码搞定!!!

  1. >>> [i*i for i in range(10)]
  2. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  除此之外,列表生成式还可以生成更为复杂的列表。通过列表生成式可以快速生成格式化的列表、字典

  1. >>> d ={"name":"nadech","age":"","address":"NANJING"}
  2. >>> [key+"="+value for key,value in d.items()]
  3. ['name=nadech', 'age=22', 'address=NANJING']
  4.  

>>> from numpy.random import randn
>>> data ={i:randn() for i in range(7)}
>>> data
{0: 0.05824826050892203, 1: 0.08046687699730207, 2: 1.860740808203487, 3: 1.577136929714018, 4: -0.5473223742129686, 5: 0.13849329354272613, 6: 1.4133333866268165}

  1.  

二、生成器

  通过列表生成式,我们可以直接创建一个列表的所有元素。

  但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

  如果列表可以按照需求,一边循环一边计算,就可以解决上述问题。这种机制就叫做生成器(generator)。

  生成器共有两种形式,第一种就是把列表生成式中的[ ]改为( );第二种就是含有yield

  1. >>> g = (i*i for i in range(1,3))
  2. >>> next(g)
  3. 1
  4. >>> next(g)
  5. 4
  6. >>> next(g)
  7. Traceback (most recent call last):
  8. File "<stdin>", line 1, in <module>
  9. StopIteration

 >>> (i*i for i in range(10))
 <generator object <genexpr> at 0x0000029EA41490F8>

 >>> for i in g:
 ... print(i)
 ...
 1
 4

  1.  

  上述代码加粗部分可以看出,创建生成器返回的是一个生成器对象的地址,并不是直接包含所有的元素的列表。

  通过调用next,可以生成下个元素的值,不过在实际使用中我们并不会通过多次调用next,而是通过for循环来获取生成器的元素。

  第二种我们要介绍的就是包含yield的,首先我们先实现打印输出这样一串数字,除了第一个数,后一个数都等于前两个数字的和 1,1,2,3,5,8....这就是著名的斐波那契数列,不要被这名字吓到,总之就是实现输出上边的一串数字。

  1. >>> def fib(max):
  2. ... n, a, b = 0, 0, 1
  3. ... while n < max:
  4. ... print(b)
  5. ... a, b = b, a + b
  6. ... n = n + 1
  7. ... return 'done'
  8. ...
  9. >>> fib(5)
  10. 1
  11. 1
  12. 2
  13. 3
  14. 5
  15. 'done'

  接下来,我们对上述代码进行一处修改,把print改为yield

  1. >>> def fib(max):
  2. ... n,a,b = 0,0,1
  3. ... while n<max:
  4. ... yield(b)
  5. ... a,b = b,a+b
  6. ... n=n+1
  7. ... return "done"
  8. ...
  9. >>> fib(5)
  10. <generator object fib at 0x000001F8B9C2AF68>

 >>> o = fib(6)
 >>> for i in o:
 ... print (i)
 ...
 1
 1
 2
 3
 5
 8

  可见,命令窗口返回一个generator对象的内存地址。通过迭代输出生成器 o中的数字。

  但是,细心的朋友可能发现,我们通过for循环来输出生成器的内容的时候,并没有输出return的“done”,这样我们就需要通过next来依次输出,同时就伴随另外一个问题的产生,当next输出到最后的时候,会抛出一个StopIteration的异常,我们需要将次异常捕获。(异常的捕获后边会详细介绍)

  1. >>> while True:
  2. ... try:
  3. ... x = next(o)
  4. ... print("o:",x)
  5. ... except StopIteration as e:
  6. ... print("RETURN VALUE:", e.value)
  7. ... break
  8. ...
  9. o: 1
  10. o: 1
  11. o: 2
  12. o: 3
  13. o: 5
  14. o: 8
  15. RETURN VALUE: done

  

三、生成器的并行

  搞清楚了生成器的特点,那么我们简单的利用生成器来实现一个并行的效果,实际上这是一个假的并行。

  这个生成器并行的例子,叫做大猪和小猪吃包子。

  1. import time
  2. def consumer(name):
  3. print("%s 准备好吃包子了" % name)
  4. while True:
  5. type = yield #此处的yield,可以接受producer中send的传值
  6. print("%s包子被%s 吃了" % (type, name))
  7.  
  8. def producer(name):
  9. print("%s 已经准备好做包子了~~~~"%name)
  10. c = consumer("大猪") #这时候不是正常的函数调用了,只是生成一个生成器队形,不执行函数体内容,调用next会执行
  11. c1 = consumer("小猪")
  12.  
  13. next(c)
  14. next(c1)
  15.  
  16. items = ["白菜","菠菜","生菜"]
  17. for item in items :
  18. time.sleep(1)
  19. print("%s已经做好了两个包子"%name)
  20. c.send(item)
  21. c1.send(item)
  22.  
  23. producer("nadech")

  以上代码中,我们先定义了消费者函数,这个函数就用来描述大猪和小猪吃包子,我们可以看到该函数包含有yield,实际上它是一个生成器。与上个例子中的斐波那契函数不同的是这里的yield,可以接受该生成器send过来的一个值。

  

python笔记十(列表生成式、字典生成式、生成器、生成器的并行)的更多相关文章

  1. Python 列表生成式 & 字典生成式

    Python 列表生成式 & 字典生成式 通过生成式可以更加简洁地生成列表和字典 列表生成式 对比 直接生成数据后加入列表示例: user_list = list() for i in ran ...

  2. Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数

    上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...

  3. python字符串、列表和字典的说明

    python字符串.列表和字典的说明 字符串.列表.字典 字符串的作用存储一段数据信息.例如 info = '我爱北京天安门' ,在调取的时候可以直接调取,灵活方便,print(info) 就可以把刚 ...

  4. python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04

    递归 递归: # 函数在调用阶段直接或间接地又调用了自身 应用场景: # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)   -->  l = [1, [2, [3, [4, [5, ...

  5. Python 1.2 列表和字典基础

    一. List创建.索引.遍历和内置增删函数 1.列表是Python的内置可变对象,由Array实现,支持任意类型的添加.组合和嵌套. L = [] # list declare L = [1, 1. ...

  6. [转载]Python 元组、列表、字典、文件

    python的元组.列表.字典数据类型是很python(there python is a adjective)的数据结构.这些结构都是经过足够优化后的,所以如果使用好的话,在某些area会有很大的益 ...

  7. python学习之列表和字典

    列表 基本操作>>>len([1,3,4])3 >>>[1,2,3]+[4,5,6]    +号两边必须是相同类型[1,2,3,4,5,6] >>> ...

  8. python 1:列表和字典

    初学Python, 对列表和字典的嵌套使用. phoneBook = [] #列表 list peopleInfo = {} #字典 dict i=0 while i<3: peopleInfo ...

  9. Python笔记(十四)_永久存储pickle

    pickle模块:将所有的Python对象转换成二进制文件存放 应用场景:编程时最好将大对象(列表.字典.集合等)用pickle写成永久数据包供程序调用,而不是直接写入程序 写入过程:将list转换为 ...

随机推荐

  1. web框架之Flask

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  2. 【VB超简单入门】四、编译工程及传播程序文件

    四.编译工程及传播程序文件 为什么在这一章中讲到编译这部分内容呢?因为当我们学会怎样用VB开发程序之后,内心肯定喜悦无比.这时候就要和朋友分享一下快乐,所以要先学习编译EXE程序文件. 首先新建工程. ...

  3. POJ-1251 Jungle Roads---MST裸题(需要编号)

    题目链接: https://vjudge.net/problem/POJ-1251 题目大意: 首先给你一个图,需要你求出最小生成树,输入N个节点,用大写字母表示了节点,然后节点与节点之间有权值. 思 ...

  4. 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

    本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...

  5. if else if,switch case二者的联系与区别

    前段时间在学习中听到了一个关于条件判断语句的问题,分析if else if语句和switch case语句这两者之间的联系和区别,从而使用其中最有效率的一种方法. 一.if...else if if. ...

  6. [LeetCode] Find K Closest Elements 寻找K个最近元素

    Given a sorted array, two integers k and x, find the k closest elements to x in the array. The resul ...

  7. swoole_proces实现多进程

    简介 swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展. 首先,确保安装的swoole版本大于1.7.2: $ php --ri swoole swool ...

  8. 微信的自动回复&接入聊天机器人

    今天偶尔发现了一个有趣的python库--itchat,可以实现微信的自动回复.防撤回,结合图灵机器人还能实现聊天机器人的作用 简单介绍一下配置与工具 win7旗舰版  pycharm  python ...

  9. [ Java学习基础 ] Java的封装性与访问控制

    Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有.默认.保护和公有,具体规则如下表: 1.私有级别 私有级别的关键字是private,私有级别的成员变量和方 ...

  10. [HNOI 2015]亚瑟王

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...