python高级编程技巧
由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 ...
随机推荐
- 【自学iOS攻略】了解有什么新技术的途径
1.了解有什么新技术1> 苹果API文档 - General - Guides - iOSx API Diffs2> 观看WWDC会议视频 2.如何使用新技术1> 自己根据API文档 ...
- J2EE基础总结(4)——JSP
什么是JSP JSP全名为Java Server Pages,中文名叫javaserver页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.很多 ...
- (转)webservice 测试窗体只能用于来自本地计算机的请求
Question: WebService部署成站点之后,如果在本地测试webservice可以运行,在远程却显示“测试窗体只能用于来自本地计算机的请求”或者"The test form is ...
- 10个最实用的Linux命令
收集了一些对于Linux新手最基本但最有用的Linux命令.你完全可以键入这些命令来管理你的服务器.这些命令对于学习vps或服务器管理的新手最为简便.1.List命令 ls -a //列出所有文件 l ...
- OC基础 文件管理
OC基础 文件管理 1.文件管理类NSFileManager对象的创建: NSFileManager *fm = [NSFileManager defaultManager]; 2.文件操作: (1 ...
- 解决iOS中tabBarItem图片默认颜色的问题(指定代码渲染模式为以原样模式的方式显示出来)
解决iOS中tabBarItem图片默认颜色的问题(指定代码渲染模式为以原样模式的方式显示出来) 解决办法:指定图片的渲染模式(imageWithRenderingMode为:UIImageRende ...
- Xcode itunes完美打包api方法
转:http://bbs.csdn.net/topics/390948190 Xcode6 itunes完美打包api 方法! 特点轻盈小巧,方便快捷!
- Ajax--WebService返回List
WebService: using System.Web.Script.Services; [GenerateScriptType(typeof(people))] [WebMethod] publi ...
- angularjs某些指令在外部作用域继承并创建新的子作用域引申出的“值复制”与“引用复制”的问题
<!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...
- PM2.5空气质量指数(AQI)是如何计算的
AQI如何计算 具体要计算PM2.5空气质量指数(AQI),SENBE申贝技术人员向您介绍如何计算的公式. 比如当实测浓度小于等于0.035时,根据实测浓度×50/0.035计算.例如 ...