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 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
随机推荐
- jquery显示隐藏效果
通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素toggle() 方法来切换 hide() 和 show() 方法. 1.hide()隐藏元素 $(se ...
- Selenium3+webdriver学习笔记2(常用元素定位方式,定位单个元素共8种,总共有23种)
#!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriver import time,os # about:ad ...
- 如何检查SQL Server索引填充因子
假如您有一个盛满水的玻璃杯,您要尝试再向这个玻璃杯中加水.结果会怎样呢?水会溢出来. SQL Server 的情况也是如此.当索引页填充满时,如果尝试添加新行,则 SQL Server 会将大约一半的 ...
- LINQ新添知识
linquser.ExecuteCommand("TRUNCATE TABLE Board"); linquser.ExecuteCommand("DELET ...
- windows7桌面小工具打不开的解决方案
将任务管理器中的sidebar.exe结束任务: 将C:\Users\用户名\AppData\Local\Microsoft\Windows Sidebar下的settings.ini的文件名修改为任 ...
- 如何真正解决“ UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该...”的问题
http://www.cnblogs.com/hupo376787/p/8267796.html 谈到了解决该问题的临时方案,那如何真正的解决该问题 目测可以开启设备门户来删除包
- 如果不需要,建议移除net standard类库中的Microsoft.NETCore.Portable.Compatibility
使用Microsoft.NETCore.Portable.Compatibility会破坏该类库在Mono和Xamarin平台的兼容性 可能导致的问题 provides a compile-time ...
- Oracle 11g 新特性 – HM(Hang Manager)简介
在这篇文章中我们会对oracle 11g 新特性—hang 管理器(Hang Manager) 进行介绍.我们需要说明,HM 只在RAC 数据库中存在. 在我们诊断数据库问题的时候,经常会遇到一些数据 ...
- codeforce Gym 100342H Hard Test (思考题)
题意:构造让Dijkstra单源最短路算法有效松弛次数最多的数据... 题解:构造,题意换种说法就是更新晚的路径要比更新早的路径短.因为所有点都会更新一次,那么按照更新时间形成一条链,即到最后一个点的 ...
- WINDOWS-基础:Thread.Sleep(0)
我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...