【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的更多相关文章

  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. [ros]编译ORBSLAM2时候,ros路径问题

    CMake Error at CMakeLists.txt:2 (include): include could not find load file: /core/rosbuild/rosbuild ...

  2. 洛谷 P2002 消息扩散

    题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n ...

  3. UVA 11997 K Smallest Sums (多路归并)

    从包含k个整数的k个数组中各选一个求和,在所有的和中选最小的k个值. 思路是多路归并,对于两个长度为k的有序表按一定顺序选两个数字组成和,(B表已经有序)会形成n个有序表 A1+B1<=A1+B ...

  4. js判断是否为app

    var ua = navigator.userAgent; var isapp = ua.match("lenovomallapp") == null ? 0 : 1;

  5. 从Docker到Kubernetes进阶

    分享个网站,k8s技术圈阳明大佬的网站 现在基本都用有道云笔记了,比较方便,所以准备弃用博客园了...

  6. Java多线程 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

    package com.swift; import java.util.ArrayList; import java.util.HashMap; import java.util.List; impo ...

  7. UNIX 是啥?!和Linux什么关系?

    操作系统有两大阵营,一边是基于微软 Windows NT 的操作系统,一边是由UNIX衍生下来的操作系统. Linux, Mac OS X, Android, iOS, Chrome OS甚至路由器上 ...

  8. 【线段树 泰勒展开】Codechef April Challenge 2018 Chef at the Food Fair

    第一次写泰勒展开:本地和CC差距好大 题目大意 大厨住的城市里办了一场美食节.一条街上开设了$N$个摊位,编号为$1∼N$.这天开始时,第$i$个摊位的食物会导致食物中毒的概率是$P_i$.在这一天中 ...

  9. Bootstrap 模态框 禁止点击空白关闭模态框事件

    在模态框的div中加上 aria-hidden="true" data-backdrop="static" <div class="modal ...

  10. PHP计算今天、昨天、本周、本月、上月开始时间和结束时间

    PHP计算今天.昨天.本周.本月.上月开始时间和结束时间 $today = date('Y-m-d H:i:s',mktime(0,0,0,date('m'),date('d'),date('Y')) ...