python-高级编程-01
【1】 列表推导
问题 我们需要一个[2,4,6,8] 这样的列表
传统写法
- res = []
- for i in range(10):
- if i %2 == 0:res.append(i)
- print res
当然这种写法也可以,但是效率不高 我们可以这么写
- [i for i in range(10) if i%2 == 0 ]
这个就是列表推导
通常由三个部分组成 [方法 循环 条件]
就是循环 将循环的元素放到条件里比较 然后在执行方法
例子 如果我们要把
['tom,'jack','rose'] 这个列表改成 ['0:tom','1:jack','2:rose]
通常的写法是:
- inter = 0
- res = ["tom","jack","rose"]
- for i in res:
- res[inter] = '%d:%s'%(inter,i)
- inter += 1
- print res
我们可以通过 enumerate 更方便的获取列表下标 从而简化代码
- res = ["tom","jack","rose"]
- for i ,ele in enumerate(res):
- res[i] = "%d:%s" %(i,res[i])
- print res
当然我们也可以通过列表推导搞定它
- def _change_val(i,val):
- return "%d:%s" % (i,val)
- res = ["tom","jack","rose"]
- print [_change_val(i,ele) for i,ele in enumerate(res)]
通过列表推导的话 使得逻辑代码更加整洁 而且共享了其所需方法
我们只要是需要循环列表的时候,都要考虑是否能使用列表推导式
【2】生成器和迭代器
1》 ---迭代器
我们通过
iner 关键词可以获得一个 迭代器的对象
我们通过next 可以获取 迭代器的元素
当序列遍历完了 就会抛出异常
迭代器是通过 next() 方法和__inter__方法实现的 __inter__ 这里返回迭代器本身 我们自己也可以写一个自己的迭代器
- class myinter(object):
- def __init__(self,step):
- self.step = step
- def next(self):
- if self.step == 0 :
- raise StopIteration
- self.step -= 1
- return self.step
- def __iter__(self):
- return self
- res = myinter(5)
- print res.next()
- print res.step
1 》 生成器:
我应该这样理解 通过在函数里面加一个 yeild关键字 使之生成一个生成器
一般我们写杨辉三角是这样写的
- a = [1]
- b = []
- for i in range(5):
- b = []
- print a
- a.append(0)
- a.insert(0, 0)
- for i in range(len(a) - 1):
- b.append(0)
- for i in range(len(a) - 1):
- b[i] = a[i] + a[i + 1]
- a = b
当然这是最不简洁的写法,也就是怎么像就怎么写的 如果我们用生成器的话
- def fn():
- a = [1]
- while 1:
- yield a
- a = [a[i] + a[i + 1] for i in range(len(a)-1)]
- a.append(1)
- a.insert(0,1)
- fn1 = fn()
- for i in range(10):
- print fn1.next()
那么生成一个 fn1 的生成器 执行到yield的时候 会阻塞直到执行next()的执行
还有其他常用的结合列表推导的方法
- def fib():
- a,b = 0,1
- while True:
- yield b
- a,b = b,a+b
- fib_obl = fib()
- print [fib_obl.next() for i in range(10)]
这个是通过列表推导来输出我们想要生成的列表 其实yield 和return 是很近似的 都是返回值 但是yeild会阻塞在程序 这样形成了更丰富的效果 这带来的好处显而易见 我们如果需要一个非常大的列表 或者数据 那么yeild 可以避免一次性将数据放到内存
- def power(values):
- for val in values:
- print 'powering %s' % val
- yield val
- def adder(values):
- for val in values:
- print 'adding to %s' % val
- if val % 2 == 0:
- yield val +1
- else:
- yield val +2
- elements = [1,4,6,7,12]
- res = adder(power(elements))
- print res.next()
- print res.next()
上面程序的执行结果是
- powering 1
- adding to 1
- 3
- powering 4
- adding to 4
- 5
这个是通过 将每个序列当做迭代器,然后将其合并到一个高级函数里面 书上说 这是一种避免函数变得庞大丑陋 不可理解 但是我是有限赞同 ,也就是赞同,但是不完全赞同。
诚然这样的确会把原本复杂的功能拆分 很多非常简单的代码块 但是对初学者不够友好。
send 和close
了解了n数send(msg)。其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做
c.next() 和 c.send(None) 作用是一样的。
- def psychologist():
- print 'Please tell me your problems'
- while 1:
- res=(yield)
- print type(res)
- print(res,'*******')
- if res is not None:
- if res.endswith('?'):
- print ("Don't ask you self too much questions")
- elif 'good' in res:
- print "A that's good .go on "
- elif 'bad' in res:
- print "Don't be so negative"
- free = psychologist()
- free.next()
- free.send("I feel bad")
- free.send("Are you OK?")
- free.send("I'm a good boy")
这本书上面的例子 实在太难懂了
我修改了下 使之更好理解
- # -*- coding:utf-8 -*-
- def psychologist():
- print 'start'
- while 1:
- res = yield 5
- print res
- free = psychologist()
- print free.next()
- free.send('new value')#给表达式res赋予一个新值
res = yield 5 的意思是 表达式(yield 5)的返回值将赋值给res
这段代码的输出是
- start
- 5
- new value
python-高级编程-01的更多相关文章
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程之选择好名称:完
由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- python高级编程之列表推导式
1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...
- Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍
原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...
- Python高级编程-Python一切皆对象
Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
随机推荐
- ABAP数据类型
数据类型表: 类型缩写 类型 默认长度 允许长度 初始值 描述 C 文本型 1 Space 字符串数据,如'Program' D 日期型 8 8 '00000000' 日期数据,格式为YYYYMM ...
- div嵌套时,子元素设置margin-top失效问题
这是因为父元素的padding设置为0时所产生的bug,它自动将margin-top提升到了父元素上,所以此时我们所设置的margin-top自动就到父元素上了,解决方案: 1.给父元素添加一个pad ...
- Yii2 的快速配置 api 服务 yii2-fast-api
yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发. 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用 ...
- db2数据库备份
一.离线备份 db2 list database directory -----查看有哪些数据库,确定需要备份哪个数据库 db2 disconnect current -----断开以数据库 ...
- SQL Server 查询性能优化——创建索引原则
索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...
- HDU 2639 Bone Collector II (01背包,第k解)
题意: 数据是常规的01背包,但是求的不是最大容量限制下的最佳解,而是第k佳解. 思路: 有两种解法: 1)网上普遍用的O(V*K*N). 2)先用常规01背包的方法求出背包容量限制下能装的最大价值m ...
- 洛谷 P1903 【模板】分块/带修改莫队(数颜色)
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- 课外作业1:将一个double类型的小数,按照四舍五入保留两位小数
package come.one01; public class One02 { public static void main(String[] args) { double numa = 3.14 ...
- IDEA搭建Springboot项目时报错jdk的问题
装了jdk并且配置了JAVA_HOME 与path还报错 No Java SDK of appropriate version found. In addition to the IntelliJ P ...
- abaqus中的约束
1.tie -绑定约束:作用是将模型的两部分区域绑定在一起,二者之间不发生相对运动,相当于焊在一起. 2.rigid body--刚体约束--使一个模型区域刚体化,这个区域可以是一系列节点,单元等,刚 ...