由python高级编程处学习
http://blog.sina.com.cn/s/blog_a89e19440101fb28.html
Python列表解析语法[]和生成 器()语法类似
[expr for iter_var in iterable] 或 [expr for iter_var in iterable if cond_expr]
例子:[i for i in range(10)if i %2==0]
Enumerate
>>> i=0
>>> s=['a','b','c']
>>> s
['a', 'b', 'c']
>>> for t in s:
... s[i]='%d:%s'%(i,s[i])
... i+=1
...
>>> s
['0:a', '1:b', '2:c']
for i,s1 in enumerate(s):
s[i]='%d:%s'%(i,s[i])
enumerate(iterable[, start]) -> iterator for index, value of iterable
>>> def _s(a,b):
... return '%d:%s'%(a,b)
>>> s=['a','b','c']
>>> s
['a', 'b', 'c']
>>> [_s(i,t)for i ,t in enumerate(s)]
['0:a', '1:b', '2:c']
>>>
如果要对序列进行循环的时候,尝试使用列表解析来解决问题
迭代器
Next下一个项
__iter__迭代器本身
>>> i=iter('abc')
>>> dir(i)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__has
h__', '__init__', '__iter__', '__length_hint__', '__new__', '__reduce__', '__red
uce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__
', 'next']
>>> i.__iter__
<method-wrapper '__iter__' of iterator object at 0x000000000271F8D0>
>>> i.next()
'a'
>>> i.next()
'b'
>>> i.next()
'c'
>>> i.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
例子:>>> class M(object):
... def __init__(self,s):
... self.s=s
... def next(self):
... if self.s<=0:
... raise Exception
... self.s-=1
... return self.s
... def __iter__(self):return self
...
>>> for s1 in M(10):
... print 'self.s是:%s'%(s1)
生成器
Next进行生成 的
send是除next外另一个恢复生成器的方法
例子:
>>> def f():
... a,b=0,1
... while 1:
... yield b
... a,b=b,b+a
...
>>> x=f()
>>> dir(x)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__has
h__', '__init__', '__iter__', '__name__', '__new__', '__reduce__', '__reduce_ex_
_', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'clo
se', 'gi_code', 'gi_frame', 'gi_running', 'next', 'send', 'throw']
>>> x.next()
1
>>> x.next()
1
>>> x.next()
2
>>> x.next()
3
>>> x.next()
5
>>> x.next()
8
>>> x.next()
13
>>> x.next()
21
>>> x.next()
34
>>>
当要返回一个序列或者循环中执行的函数就要考虑生成器.
s=open(r'C:\Users\Administrator\Desktop\l1.py').next()
s1=tokenize.generate_tokens(s)
s1.next()
例子:
>>> def p(s):
... for v in s:
... print '%s'%v
... yield v
...
>>> def adds(v):
... for s in v:
... print s
... if s%2==0:
... yield s+3
... else:
... yield s+2.7-0.7
...
>>> sq=[1,4,7,9,12,19,0]
>>> r=adds(p(sq))
>>> r.next()
1
1
3.0
>>>
S.endswith(suffix[, start[, end]]) -> bool
Str.endswith(‘!s’)
Yield可以变成表达式
比如
S=(yiled)
send(...)
send(arg) -> send 'arg' into generator,
return next yielded value or raise StopIteration.
Send(object)
Throw允许客户端代码传入要抛出的任何类型异常
Close工作方式相同,它抛出的异常是:GeneratorExit
如果是close的异常,生成器函数必须再次抛出GeneratorExit
或者StopIteration异常
Multitask协同程序,可以用于挂起,恢复,有多个进入点函数
在python里面协同程序就是用来代替线程
import contextlib
import greenlet(需要安装)下载地址:https://pypi.python.org/pypi/greenlet#downloads
Multitask下载地址:http://code.google.com/p/python-multitask/
直接把Multitask复制到python安装即可,然后可以使用
例子:
在协同程序之间的协作,经典是例子是接受多个客户查询,并将每个查询委托给对此做出响应新纯种服务器应用程序。
from __future__ import with_statement
from contextlib import closing
import multitask,socket
def clicket(sock):
with closing(sock):
while 1:
data=(yield multitask.recv(sock,1024))
if not data:
break
yield multitask.send(sock,data)
def echo_(host,poc):
addri=socket.getaddrinfo(host,poc,socket.AF_UNSPEC,socket.SOCK_STREAM)
(fa,so,pr,ca,so1)=addri[0]
with close(socket.socket(fa,so,pr))as s1:
s1.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s1.bind(so1)
s1.listen(5)
while 1:
multitask.add(clicket((yield multitask.accept(s1))[0]))
import sys
if __name__=='__main__':
host=None
pors=1111
if len(sys.argv)>1:
host=sys.argv[1]
if len(sys.argv)>2:
pors=sys.argv[2]
multitask.add(echo_(host,pors))
try:
multitask.run()
except Exception:
Pass
#注:yield必须使用在函数内
但可以使用生成器()来代替yield语句
例如:
A=[b for b in range(b)if b%2==0]
For s in A:print s
迭代器模块(高级:itertools)文档地址:http://docs.python.org/2.7/library/itertools.html?highlight=itertools#itertools
def staritertools():
value=raw_input().strip()
while value!='':
for s in itertools.islice(value.split(),4,None):
#islice(iterable, [start,] stop [, step]) --> islice object
seq, [start,] stop [, step] |
elements from seq[start:stop:step] |
islice('ABCDEFG', 2, None) --> C D E F G |
itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
yield s
value=raw_input().strip()
当需要抽取位于流中特定位置数据时,可以使用itertools.islice
例如:可能需要使用记录特殊格式文件或者表现元数据(SOAP封套)封装数据流,islice可以看作在每行数据之上一个滑动窗口
这个方法可以提供在一个序列之上运行多个迭代器模型,如果提供第一次运行信息,就可以帮助我们再次基于这些数据运行
比如读取文件表头可以在运行一个处理之前提供特性信息
itertools.tee(iterable[, n=2])
def s(s,m=1):
a,b=itertools.tee(s)
return list(itertools.islice(a,m)),b
>>> s('sdfsdsdfsdfsdfsdsdfsdf',1)
(['s'], <itertools.tee object at 0x00000000027BDB88>)
>>> s('sdfsdsdfsdfsdfsdsdfsdf',10)
(['s', 'd', 'f', 's', 'd', 's', 'd', 'f', 's', 'd'], <itertools.tee object at 0x
0000000002979C48>)
>>>
对来自一个迭代器的重复元素进行分组,只要它们是相信的,还可以提供劬一个函数来执行元素比较,否则将采用标识符比较
Groupby一个应用实例是可以使用行程编码(RLE)来压缩数据,字符串中每组相信重复字符将替换成这个字符本身和重复数次,如果字符无重复,则使用1
def c(d):
return ((len(list(g)),n)for n,g in itertools.groupby(d))
def d(d):
return (size*car for size,car in d)
>>> list(c('get uuuuuuuuuuuuuuuuuuuuuuuup'))
[(1, 'g'), (1, 'e'), (1, 't'), (1, ' '), (24, 'u'), (1, 'p')]
>>> lista=(c('get uuuuuuuuuuuuuuuuuuuuuuuup'))
>>> ''.join(d(lista))
'get uuuuuuuuuuuuuuuuuuuuuuuup'
装饰器@
论坛地址:http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
特点:使函数或者方法封装(接收一个函数并返回增强版本一个函数)
使用场景可以将方法在定义首部将其定义为类方法或者静态方法
基本语法:
旧式装饰器语法
class WhatFor(object):
def it(cls):
print'hello'
it=classmethod(it)
def uncommon():
print 'xx'
uncommon=staticmethod(uncommon)
新式装饰器语法如下:
class W(object):
@classmethod
def it(cls):
print 'helklo:%s'%cls
@staticmethod
def u():
print'i int float decimal str class if......'
>>> a=W()
>>> a
<__main__.W object at 0x00000000025E92B0>
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribut
e__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_e
x__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_
_weakref__', 'it', 'u']
>>> a.it()
helklo:<class '__main__.W'>
>>> a.u()
i int float decimal str class if......
>>>
如何自己编写装饰器
def my(f):
def _m(*a,**k):
#在调用实际函数之前做些填充工作
res=f(*a,**k)
#做完某些填充工作之后
return res
#返回子函数
return _m
结构
如果装饰器需要参数是,就必须使用第二级封装格式如下:
def m(a1,a2):
def _m(f):
def __m(*a,**k):
#在调用实际函数之前做些填充工作
res=f(*a,**k)
#做完某些填充工作之后
return res
#返回子函数
return __m
return _m
当@在模块第一次被读取时由解释器程序装入,所以它们使用必须受限于总体上可以应用@,如果@与方法的类或所增强的函数签名绑定,它应该被重构为常规可调用对象,在任何情况下,当@处理API时,一个好的方法是将它们聚集在一个易于维护模块中
@应该关注于所封闭的函数或者方法接收和返回参数,如果需要,应该尽可能限制其内省(introspection)工作,@包括参数检查,缓存,代理,上下文提供者!
参数检查:XML-RPC协议量种轻量级远程过程调用协议,通过HTTP上的XML来对调用进行编码,通常用于在简单客户-服务器代替SOAP
与SOAP不同(SOAP能够列出所有可调用函数页面,即wsdl)
Xml-rpc没有可用函数目录
# -*- coding: utf-8 -*-
__author__ = 'Administrator'
from itertools import izip
rpc_info = {}
def xmlrpc(in_=(), out=(type(None),)):
def _xmlrpc(function):
#register signature
func_name = function.func_name
rpc_info[func_name] = (in_, out)
def _check_types(elements, types):
"""Subfunction that checks the types."""
if len(elements) != len(types):
raise TypeError('argument count is wrong')
typed = enumerate(izip(elements, types))
for index, couple in typed:
arg, of_the_right_type = couple
if isinstance(arg, of_the_right_type):
continue
raise TypeError('arg #%d should be %s' % (index, of_the_right_type))
# encapsulate function
def __xmlrpc(*args):
# check input content
checkable_args = args[1:]
_check_types(checkable_args, in_)
# execute the function
res = function(*args)
# check output content
if not type(res) in (tuple, list):
checkable_res = (res,)
else:
checkable_res = res
_check_types(checkable_res, out)
return res
return __xmlrpc
return _xmlrpc
# example
class RPCView(object):
@xmlrpc((int, int))
def meth1(self, int1, int2):
print 'received %d and %d' % (int1, int2)
@xmlrpc((str,), (int,))
def meth2(self, phrase):
print 'received %s' % phrase
return 12
print rpc_info
my = RPCView()
my.meth1(1,2)
my.meth2(2)
python高级编程技巧的更多相关文章
-
Python高级编程技巧(转)
译文:http://blog.jobbole.com/61171/ 本文展示一些高级的Python设计结构和它们的使用方法.在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求.对数 ...
-
Python的几个高级编程技巧
Python有一些技巧对你来说是新知识,但是还有一些技巧会让你的代码效率大幅提升. 本文总结了一下自己用到的一些Python高级编程技巧,希望对大家有帮助. 列表生成器 a=[1,2,3] [x*x ...
-
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 ...
随机推荐
-
Ant: Class not found: javac1.8
今天用ant,在选择build.xml,run as ant build后出错Ant: Class not found: javac1.8 分析问题:是否是eclipse中的ant版本和java的版本 ...
-
Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator
Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...
-
windows OBJECT查找
PspCidTable表里.索引值总之4的倍数.也就是说 PID/4 才是PspCidTable索引.*8 才是PsPCidTable+偏移.获取进程对应的 _HANDLE_TABLE_ENTRY 结 ...
-
(原创)openvswitch实验连载1-fedora 17下安装openvswitch
1 软件安装 1.1测试环境和网络拓朴 大部分朋友估计也没有一个真实环境来完全整个的测试,所以我也是使用了在一台PC机上使用Vmware Workstation的方式来进行实验.总体结构是在PC机上安 ...
-
【待解决】编译V8引擎出错-snapshot.cc
这几天学习nodejs,翻阅官网的API文档.看到nodejs插件时,想了解一下v8的实现机制,于是我便从GitHub社区克隆了一份v8源码库.哪知道,编译安装的时候就出了问题,这问题已经折磨我两天了 ...
-
用curl访问HTTPS站点并登录
开发网站,少不了测试.现在的网站为了加强安全性,都启用了HTTPS协议.所谓HTTPS,也就是HTTP文本在SSL协议中传输.用curl命令行来测试HTTPS站点是个很有用的功能,写点脚本,就可以做功 ...
-
react-native简单demo:实现加载豆瓣电影列表
https://github.com/axel10/react-native-douban' 相关随笔: react-native 开发环境搭建 http://www.cnblogs.com/axel ...
-
C++中char类型的溢出问题
C++中什么经常会运用到char类型,也会将char类型作为循环语句的循环条件,但往往这里最容易出现错误,容易出现溢出,进入死循环.这里我们就来简单介绍下为什么会出现这种情况. 首先,了解下char类 ...
-
【Python实战】使用Python连接Teradata数据库???未完成
1.安装Python 方法详见:[Python 05]Python开发环境搭建 2.安装Teradata客户端ODBC驱动 安装包地址:TTU下载地址 (1)安装TeraGSS和tdicu(ODBC依 ...
-
CSAPP lab2 二进制拆弹 binary bombs phase_1
这个实验从开始到完成大概花了三天的时间,由于我们还没有学习编译原理.汇编语言等课程,为了完成这个实验我投机取巧了太多,看了网上很多的解题方法,为了更加深入学习编译反编译,觉得需要从头开始好好梳理一下. ...