【1】 列表推导

问题 我们需要一个[2,4,6,8] 这样的列表

传统写法

  1. res = []
  2. for i in range(10):
  3. if i %2 == 0res.append(i)
  4. print res

  当然这种写法也可以,但是效率不高 我们可以这么写

  1. [i for i in range(10) if i%2 == 0 ]

 这个就是列表推导

通常由三个部分组成  [方法  循环 条件]

就是循环 将循环的元素放到条件里比较 然后在执行方法

例子 如果我们要把

['tom,'jack','rose'] 这个列表改成  ['0:tom','1:jack','2:rose]

通常的写法是:

  1. inter = 0
  2. res = ["tom","jack","rose"]
  3. for i in res:
  4. res[inter] = '%d:%s'%(inter,i)
  5. inter += 1
  6. print res

 我们可以通过 enumerate 更方便的获取列表下标 从而简化代码

  1. res = ["tom","jack","rose"]
  2.  
  3. for i ,ele in enumerate(res):
  4. res[i] = "%d:%s" %(i,res[i])
  5. print res

 当然我们也可以通过列表推导搞定它

  1. def _change_val(i,val):
  2. return "%d:%s" % (i,val)
  3.  
  4. res = ["tom","jack","rose"]
  5.  
  6. print [_change_val(i,ele) for i,ele in enumerate(res)]

通过列表推导的话 使得逻辑代码更加整洁 而且共享了其所需方法

我们只要是需要循环列表的时候,都要考虑是否能使用列表推导式

【2】生成器和迭代器

1》 ---迭代器

我们通过

iner 关键词可以获得一个 迭代器的对象

我们通过next 可以获取 迭代器的元素

当序列遍历完了 就会抛出异常

迭代器是通过 next() 方法和__inter__方法实现的 __inter__ 这里返回迭代器本身 我们自己也可以写一个自己的迭代器

  1. class myinter(object):
  2. def __init__(self,step):
  3. self.step = step
  4.  
  5. def next(self):
  6. if self.step == 0 :
  7. raise StopIteration
  8.  
  9. self.step -= 1
  10. return self.step
  11. def __iter__(self):
  12. return self
  13.  
  14. res = myinter(5)
  15. print res.next()
  16. print res.step

1 》 生成器:

  我应该这样理解 通过在函数里面加一个 yeild关键字 使之生成一个生成器

一般我们写杨辉三角是这样写的

  1. a = [1]
  2. b = []
  3. for i in range(5):
  4. b = []
  5. print a
  6. a.append(0)
  7. a.insert(0, 0)
  8. for i in range(len(a) - 1):
  9. b.append(0)
  10. for i in range(len(a) - 1):
  11. b[i] = a[i] + a[i + 1]
  12. a = b

  当然这是最不简洁的写法,也就是怎么像就怎么写的 如果我们用生成器的话

  1. def fn():
  2. a = [1]
  3. while 1:
  4. yield a
  5. a = [a[i] + a[i + 1] for i in range(len(a)-1)]
  6. a.append(1)
  7. a.insert(0,1)
  8.  
  9. fn1 = fn()
  10. for i in range(10):
  11. print fn1.next()

那么生成一个 fn1 的生成器 执行到yield的时候 会阻塞直到执行next()的执行

还有其他常用的结合列表推导的方法

  1. def fib():
  2. a,b = 0,1
  3. while True:
  4. yield b
  5. a,b = b,a+b
  6. fib_obl = fib()
  7. print [fib_obl.next() for i in range(10)]

这个是通过列表推导来输出我们想要生成的列表 其实yield 和return 是很近似的 都是返回值 但是yeild会阻塞在程序 这样形成了更丰富的效果 这带来的好处显而易见 我们如果需要一个非常大的列表 或者数据 那么yeild 可以避免一次性将数据放到内存

  1. def power(values):
  2. for val in values:
  3. print 'powering %s' % val
  4. yield val
  5.  
  6. def adder(values):
  7. for val in values:
  8. print 'adding to %s' % val
  9. if val % 2 == 0:
  10. yield val +1
  11. else:
  12. yield val +2
  13.  
  14. elements = [1,4,6,7,12]
  15.  
  16. res = adder(power(elements))
  17. print res.next()
  18. print res.next()

 上面程序的执行结果是

  1. powering 1
  2. adding to 1
  3. 3
  4. powering 4
  5. adding to 4
  6. 5

这个是通过 将每个序列当做迭代器,然后将其合并到一个高级函数里面 书上说 这是一种避免函数变得庞大丑陋 不可理解 但是我是有限赞同 ,也就是赞同,但是不完全赞同。

诚然这样的确会把原本复杂的功能拆分 很多非常简单的代码块 但是对初学者不够友好。

send 和close

了解了n数send(msg)。其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做
c.next() 和 c.send(None) 作用是一样的。

  1. def psychologist():
  2. print 'Please tell me your problems'
  3. while 1:
  4. res=(yield)
  5. print type(res)
  6. print(res,'*******')
  7. if res is not None:
  8. if res.endswith('?'):
  9. print ("Don't ask you self too much questions")
  10. elif 'good' in res:
  11. print "A that's good .go on "
  12. elif 'bad' in res:
  13. print "Don't be so negative"
  14.  
  15. free = psychologist()
  16. free.next()
  17. free.send("I feel bad")
  18. free.send("Are you OK?")
  19. free.send("I'm a good boy")

这本书上面的例子 实在太难懂了

我修改了下 使之更好理解

  1. # -*- coding:utf-8 -*-
  2. def psychologist():
  3. print 'start'
  4. while 1:
  5. res = yield 5
  6. print res
  7.  
  8. free = psychologist()
  9. print free.next()
  10. free.send('new value')#给表达式res赋予一个新值

res = yield 5 的意思是 表达式(yield 5)的返回值将赋值给res

这段代码的输出是

  1. start
  2. 5
  3. new value

python-高级编程-01的更多相关文章

  1. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  2. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  3. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  4. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  5. python高级编程之选择好名称:完

    由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...

  6. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  7. python高级编程之列表推导式

    1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...

  8. Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

    原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...

  9. Python高级编程-Python一切皆对象

    Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...

  10. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

随机推荐

  1. ABAP数据类型

    数据类型表: 类型缩写 类型 默认长度 允许长度 初始值 描述 C 文本型 1   Space 字符串数据,如'Program' D 日期型 8 8 '00000000' 日期数据,格式为YYYYMM ...

  2. div嵌套时,子元素设置margin-top失效问题

    这是因为父元素的padding设置为0时所产生的bug,它自动将margin-top提升到了父元素上,所以此时我们所设置的margin-top自动就到父元素上了,解决方案: 1.给父元素添加一个pad ...

  3. Yii2 的快速配置 api 服务 yii2-fast-api

    yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发. 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用 ...

  4. db2数据库备份

    一.离线备份 db2  list  database  directory -----查看有哪些数据库,确定需要备份哪个数据库 db2  disconnect  current -----断开以数据库 ...

  5. SQL Server 查询性能优化——创建索引原则

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...

  6. HDU 2639 Bone Collector II (01背包,第k解)

    题意: 数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解. 思路: 有两种解法: 1)网上普遍用的O(V*K*N). 2)先用常规01背包的方法求出背包容量限制下能装的最大价值m ...

  7. 洛谷 P1903 【模板】分块/带修改莫队(数颜色)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  8. 课外作业1:将一个double类型的小数,按照四舍五入保留两位小数

    package come.one01; public class One02 { public static void main(String[] args) { double numa = 3.14 ...

  9. IDEA搭建Springboot项目时报错jdk的问题

    装了jdk并且配置了JAVA_HOME 与path还报错 No Java SDK of appropriate version found. In addition to the IntelliJ P ...

  10. abaqus中的约束

    1.tie -绑定约束:作用是将模型的两部分区域绑定在一起,二者之间不发生相对运动,相当于焊在一起. 2.rigid body--刚体约束--使一个模型区域刚体化,这个区域可以是一系列节点,单元等,刚 ...