【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. python3操作mysql数据库表01(基本操作)

    #!/usr/bin/env python# -*- coding:UTF-8 -*- import requestsfrom bs4 import BeautifulSoupfrom bs4 imp ...

  2. Python+Selenium之摘取网页上全部邮箱

    本文转载:http://blog.csdn.net/u011541946/article/details/68485981 练习场景:在某一个网页上有些字段是我们感兴趣的,我们希望摘取出来,进行其他操 ...

  3. 2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02) A Amusing Numbers (数学)

    其实挺简单的.先直接算出之前已经排在k这个数前面的数字.比如543是三位的,那么100~543都是可以的,两位的10~54. 如果还需要往前面补的话,那么依次考虑1000~5430,5430是上界不能 ...

  4. python+opencv模拟生成运动模糊核

    Mark:https://www.cnblogs.com/wyh1993/p/7118559.html 效果非常的好

  5. spring-data-JPA源码解读

    spring-data-JPA源码部分有两个很重要的部分:1.识别repositories接口 2.将接口添加代理实现类并托管spring管理 JpaRepositoriesRegistrar 目的是 ...

  6. kubernetes-平台日志收集(ELK)

    使用ELK Stack收集Kubernetes平台中日志与可视化 K8S系统的组件日志 K8S Cluster里面部署的应用程序日志 日志系统: ELK安装 安装jdk [root@localhost ...

  7. C++调用C语言编译的so文件

    参考链接:https://blog.csdn.net/chenjinlong126/article/details/78990350 一.制作so文件:libadd_c.so或libadd_cpp.s ...

  8. GIT在团队中的最佳实践

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  9. mysql 从陌生到熟练之----数据库备份恢复的实现方法

    mysql 从陌生到熟练之----数据库备份恢复的实现方法 MySQL数据库使用命令行备份|MySQL数据库备份命令 例如: 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:roo ...

  10. iOS 证书、真机调试、发布 App Store

    之前对iOS的证书弄的很不清楚,Xcode里面也有各种证书,作为一只有强迫症的巨蟹座,这是不能忍的 趁着准备发布自己的第一个app,梳理一下这块内容 主要参考了这几篇文章: iOS开发:创建真机调试证 ...