﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h2&gt;&lt;font color="green"&gt;生命科学领域的专业信息解决方案！&lt;/font&gt;&lt;/h2&gt;-随笔分类-Python</title><link>http://www.blogjava.net/rain1102/category/37653.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;化学结构搜索，化学信息学，生物信息学，实验室信息学等
。&lt;/font&gt;&lt;br/&gt;&lt;font color="#3C1435"&gt;以高科技的生物、化学信息技术实现生命科学领域中专业数据的计算和管理、提高研发能力、增强在科研和成本效率方面的国际竞争力，为生物、化学、医药和学术机构提供一流的解决方案和技术咨询。&lt;/font&gt;&lt;br/&gt;
&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;&lt;br/&gt;
</description><language>zh-cn</language><lastBuildDate>Thu, 05 May 2011 01:37:48 GMT</lastBuildDate><pubDate>Thu, 05 May 2011 01:37:48 GMT</pubDate><ttl>60</ttl><item><title>Frowns-ChemoInformatics System</title><link>http://www.blogjava.net/rain1102/archive/2011/05/04/349531.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 04 May 2011 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2011/05/04/349531.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/349531.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2011/05/04/349531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/349531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/349531.html</trackback:ping><description><![CDATA[<table border="0" cellspacing="0" cellpadding="0" width="90%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td align="left">Frowns is a chemoinformatics toolkit geared toward rapid development of chemistry related algorithms.&nbsp; It is written in almost 100% Python with a small portion written in C++.<br />
            <br />
            Frowns is loosely based on the PyDaylight API that Andrew Dalke wrote to wrap the daylight C API.&nbsp; In some cases programs written using PyDaylight will also work under Frowns with a few minor changes.&nbsp; A good overview of PyDaylight is available at <a href="http://www.daylight.com/meetings/mug2000/Dalke/overview/">here.</a><br />
            <br />
            A good place to look at what Smarts and Smiles are is at the daylight web site located at <a href="http://www.daylight.com/">http://www.daylight.com/</a><br />
            <br />
            </td>
        </tr>
        <tr>
            <td>
            <div align="center">Frowns Features<br />
            </div>
            <ul>
                <li>Smiles parser</li>
                <li>Smarts substructure searching</li>
                <li>SD file parser with SD field manipulations</li>
                <li>Depiction for SD files with coordinates</li>
                <li>Molecule Fingerprint generation</li>
                <li>Several forms of Ring Detection available</li>
                <li>Simple aromaticity perception</li>
                <li>Everything's a graph (i.e. can form canonical strings from incomplete pieces of a molecule)<br />
                </li>
                <li>Full source code</li>
                <li>Really bad depiction of arbitray molecules! (requires AT&amp;T's GraphViz)</li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/349531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2011-05-04 21:46 <a href="http://www.blogjava.net/rain1102/archive/2011/05/04/349531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cinfony－Open Source cheminformatics toolkits for Python</title><link>http://www.blogjava.net/rain1102/archive/2009/11/05/301254.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 05 Nov 2009 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/11/05/301254.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/301254.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/11/05/301254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/301254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/301254.html</trackback:ping><description><![CDATA[<h4>Background</h4>
<p>Open Source cheminformatics toolkits such as OpenBabel, the CDK and the RDKit share the same core functionality but support different sets of file formats and forcefields, and calculate different fingerprints and descriptors. Despite their complementary features, using these toolkits in the same program is difficult as they are implemented in different languages (C++ versus <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>), have different underlying chemical models and have different application programming interfaces (APIs).</p>
<h4>Results</h4>
<p>We describe Cinfony, a Python module that presents a common interface to all three of these toolkits, allowing the user to easily combine methods and results from any of the toolkits. In general, the run time of the Cinfony modules is almost as fast as accessing the underlying toolkits directly from C++ or <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>, but Cinfony makes it much easier to carry out common tasks in cheminformatics such as reading file formats and calculating descriptors.</p>
<h4>Conclusion</h4>
<p>By providing a simplified interface and improving interoperability, Cinfony makes it easy to combine complementary features of OpenBabel, the CDK and the RDKit.</p>
<br />
<p><strong>Cinfony</strong> presents a common API to several cheminformatics toolkits. It uses the Python programming language, and builds on top of OpenBabel, RDKit and the CDK. </p>
<p><img style="width: 565px; height: 341px" height="341" alt="" src="http://www.redbrick.dcu.ie/~noel/cinfony/Overview.png" width="565" />&nbsp;<br />
</p>
<h2><a name="Documentation">Documentation</h2>
<ul>
    <li>The <strong><a href="http://journal.chemistrycentral.com/content/2/1/24" rel="nofollow">Cinfony paper</a></strong>
    <li>Install on <a href="http://code.google.com/p/cinfony/wiki/InstallationOnWindows">Windows</a>, <a href="http://code.google.com/p/cinfony/wiki/InstallationOnLinux">Linux</a> or <a href="http://code.google.com/p/cinfony/wiki/InstallationonMacOSX">MacOSX</a>
    <li>A <a href="http://code.google.com/p/cinfony/wiki/Documentation">complete description</a> of Cinfony
    <li><a href="http://www.redbrick.dcu.ie/~noel/cinfony" rel="nofollow">API documentation</a>. This documentation can also be accessed using the help command, e.g. <tt>help(cdk)</tt>.
    <li>Further information on Pybel and using the OpenBabel Python bindings is available on the <a href="http://openbabel.org/wiki/Python" rel="nofollow">OpenBabel wiki</a> </li>
</ul><img src ="http://www.blogjava.net/rain1102/aggbug/301254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-11-05 13:07 <a href="http://www.blogjava.net/rain1102/archive/2009/11/05/301254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wxPython小试－礼盒编号生成器</title><link>http://www.blogjava.net/rain1102/archive/2009/08/19/291870.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 19 Aug 2009 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/08/19/291870.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/291870.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/08/19/291870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/291870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/291870.html</trackback:ping><description><![CDATA[今天帮叔叔家小弟写了一个礼盒编号生成器，具体要求如下：<br />
<p><br />
编码要求：<br />
1、编码中不出现&#8220;4&#8221;、&#8220;3&#8221;等不吉利数字，缺码编号；<br />
2、卖品第一个字母&#8220;L&#8221;表示礼盒装、&#8220;B&#8221;表示标准装。第二个字母是&#8220;A&#8221;到&#8220;Z&#8221;中的任意字母，可根据编码需要任意选择。四位数字为编号；<br />
3、卖品与赠品区别在于：卖品以&#8220;L&#8221;或者&#8220;B&#8221;开头，赠品以&#8220;ZL&#8221;或者&#8220;ZB&#8221;开头。</p>
<p>例如：<br />
卖品礼盒装编码&nbsp; L-A0001&nbsp; L-D0001等<br />
卖品标准装编码&nbsp; B-A0001&nbsp; B-H0888等<br />
赠品礼盒装编码&nbsp; ZL-A0001&nbsp; ZL-D0001等<br />
赠品标准装编码&nbsp; ZB-A0001&nbsp; ZB-H0888等<br />
&nbsp;<br />
其中如果有3个3的号码也留下来，不用去掉。 本来想用js来实现，但如果那样只能把生成的结果写给页面上了，而且刷新就没了。<br />
<br />
后来考虑了一下，选择使用wxPython加上py2exe来做一个小的可执行文件，并把生成的编号放入txt文件中。 由于之前没玩过wxPython，花了1个多小时终于搞定了！代码如下：<br />
</p>
<p>#encoding=utf-8<br />
from __future__ import with_statement<br />
import wx</p>
<p>class ChoiceFrame(wx.Frame):<br />
&nbsp;&nbsp;&nbsp; def __init__(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.Frame.__init__(self, None, -1, u'编码生成器', size=(450, 150))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icon=wx.EmptyIcon()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icon.LoadFile("SetupIcon.ico",wx.BITMAP_TYPE_ICO)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.SetIcon(icon)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; panel = wx.Panel(self, -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typeList = [u'卖品礼盒装',u'卖品标准装',u'赠品礼盒装',u'赠品标准装',]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.StaticText(panel, -1, u"选择种类:", pos=(10, 20))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.type = wx.Choice(panel, -1, (85, 20), choices=typeList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.type.SetSelection(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sampleList = [chr(i) for i in range(65,91)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.StaticText(panel, -1, u"选择字母:", pos=(210, 20))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.choice = wx.Choice(panel, -1, (285, 20), choices=sampleList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.choice.SetStringSelection('A')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.StaticText(panel, -1, u"起始数字:", pos=(10, 50))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.start = wx.TextCtrl(panel, -1, "", pos=(80, 50))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.StaticText(panel, -1, u"结束数字:", pos=(210, 50))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.end = wx.TextCtrl(panel, -1, "", pos=(280, 50))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; funbtn = wx.Button(panel, -1, u"运行", pos=(280, 90))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.Bind(wx.EVT_BUTTON, self.OnFunButton, funbtn)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message = wx.StaticText(panel, -1, "", pos=(10, 90))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message.SetForegroundColour("red")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; def OnFunButton(self, evt):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message.SetLabel('')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startNum = self.start.GetValue().strip()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endNum = self.end.GetValue().strip()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not startNum.isdigit():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message.SetLabel(u'*开始数字必须输入整整数')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not endNum.isdigit():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message.SetLabel(u'*结束数字必须输入整整数')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snum = int(startNum)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enum = int(endNum)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if enum &lt;= snum:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message.SetLabel(u'*结束数字必须大于开始数字')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if enum &gt;= 10000:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message.SetLabel(u'*结束数字必须小于10000')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type = self.type.GetSelection()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; choice = self.choice.GetStringSelection()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (type == 0):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type = "L-"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif (type == 1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type = "B-"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif (type == 2):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type = "ZL-"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif (type == 3):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type = "ZB-"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startCode = self.getCode(snum, type, choice)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endCode = self.getCode(enum, type, choice)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with open(startCode + "-" + endCode + ".txt", 'w') as f:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in range(snum, enum+1):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code = self.getCode(i, type, choice)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num4 = code.count('4')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if num4 &gt; 0:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num3 = code.count('3')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if num3 &gt;0 and num3 &lt; 3:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write(code)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write('\n')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.message.SetLabel(u'编号生成成功！！！')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; def getCode(self, i, type, choice):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code = i<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if i &lt; 10:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code = '000' + str(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif i &lt; 100:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code = '00' + str(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif i &lt; 1000:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; code = '0' + str(i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type + choice+ str(code)<br />
&nbsp;&nbsp;&nbsp; <br />
if __name__ == '__main__':<br />
&nbsp;&nbsp;&nbsp; app = wx.PySimpleApp()<br />
&nbsp;&nbsp;&nbsp; ChoiceFrame().Show()<br />
&nbsp;&nbsp;&nbsp; app.MainLoop()</p>
<p>&nbsp;</p>
生成exe的代码如下：<br />
<p>#encoding=utf-8<br />
from distutils.core import setup<br />
import py2exe</p>
<p>options = {"py2exe":&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; "compressed": 1,&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bundle_files": 1 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
setup(<br />
&nbsp;&nbsp;&nbsp; options = options, <br />
&nbsp;&nbsp;&nbsp; zipfile = None,<br />
&nbsp;&nbsp;&nbsp; windows=[{"script": "GeneratorCode.py", "icon_resources": [(1, "SetupIcon.ico")]}]<br />
)<br />
</p>
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/291870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-08-19 22:30 <a href="http://www.blogjava.net/rain1102/archive/2009/08/19/291870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Beautiful Soup-Python写的一个HTML/XML的解析器</title><link>http://www.blogjava.net/rain1102/archive/2009/08/11/290679.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 11 Aug 2009 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/08/11/290679.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/290679.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/08/11/290679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/290679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/290679.html</trackback:ping><description><![CDATA[<a href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a> 是用Python写的一个HTML/XML的解析器，它可以很好的处理不规范标记并生成剖析树(parse tree)。它提供简单又常用的导航（navigating），搜索以及修改剖析树的操作。它可以大大节省你的编程时间。 对于Ruby，使用<a href="http://www.crummy.com/software/RubyfulSoup/">Rubyful Soup</a>。<br />
<br />
中文文档：http://www.crummy.com/software/BeautifulSoup/documentation.zh.html<img src ="http://www.blogjava.net/rain1102/aggbug/290679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-08-11 13:36 <a href="http://www.blogjava.net/rain1102/archive/2009/08/11/290679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Python发送Post请求</title><link>http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 28 Jul 2009 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/288723.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/288723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/288723.html</trackback:ping><description><![CDATA[<p>由于有很多数据需要逐个翻译，手工处理比较麻烦，花了十来分钟写了个python程序去跑，轻松了很多。具体代码如下：</p>
<p>#encoding=utf-8<br />
from __future__ import with_statement<br />
import MySQLdb<br />
import urllib<br />
from lister import ListerTR</p>
<p>conn = MySQLdb.connect(host="localhost", user="root", passwd="root", db="coocoo", charset="utf8")<br />
cursor = conn.cursor()<br />
cursor.execute("select id, enname from compound where enname != '' and zhname = '' order by id")<br />
row=cursor.fetchall()<br />
for r in row:<br />
&nbsp;&nbsp;&nbsp; <span style="color: #008000">params = urllib.urlencode({'eng2chi':r[1]})&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red">这里组织参数</span><br />
&nbsp;&nbsp;&nbsp; <span style="color: #008000">sock = urllib.urlopen("http://202.127.145.134/scdb/translate/translate.asp", params)&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">发送请求，并把参数传过去<br />
</span></span>&nbsp;&nbsp;&nbsp; html = sock.read()<br />
&nbsp;&nbsp;&nbsp; sock.close()<br />
&nbsp;&nbsp;&nbsp; p = ListerTR()&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">以下为解析返回的数据代码<br />
</span>&nbsp;&nbsp;&nbsp; p.feed(html)<br />
&nbsp;&nbsp;&nbsp; html = p.html<br />
&nbsp;&nbsp;&nbsp; if u"成功" in html:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = p.values[5]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = value.strip()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print r[0], r[1], data&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">取回翻译成功的内容更新数据库里面的值</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor.execute("update compound set zhname = %s where id=%s", (data, r[0])) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.commit()<br />
&nbsp;&nbsp;&nbsp; else:&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">把翻译失败的记录给文本文件中<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with open('failture.txt', 'a+') as f:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write(str(r[0])+" | "+str(r[1]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write('\n')<br />
cursor.close() <br />
conn.close() </p><img src ="http://www.blogjava.net/rain1102/aggbug/288723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-28 14:32 <a href="http://www.blogjava.net/rain1102/archive/2009/07/28/288723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python之cx_Oracle操作Oracle数据库</title><link>http://www.blogjava.net/rain1102/archive/2009/07/28/288681.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 28 Jul 2009 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/28/288681.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/288681.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/28/288681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/288681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/288681.html</trackback:ping><description><![CDATA[<p>#encoding=utf-8<br />
import MySQLdb<br />
import cx_Oracle</p>
<p>orcon = cx_Oracle.connect("username", "password", "172.29.131.25:1521/orcl")<br />
orcursor = orcon.cursor()<br />
orcursor.execute("select columnname from&nbsp;tablename ")<br />
row=orcursor.fetchall()<br />
for r in row:<br />
&nbsp;&nbsp;&nbsp; for cell in r:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print cell<br />
orcursor.close()<br />
orcon.close()</p><img src ="http://www.blogjava.net/rain1102/aggbug/288681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-28 09:43 <a href="http://www.blogjava.net/rain1102/archive/2009/07/28/288681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django中获取所有在线用户信息</title><link>http://www.blogjava.net/rain1102/archive/2009/07/08/285893.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 08 Jul 2009 00:41:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/08/285893.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/285893.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/08/285893.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/285893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/285893.html</trackback:ping><description><![CDATA[原文地址：<a href="http://groups.google.it/group/django-users/browse_thread/thread/4ba5652bcbd1f958/958c6e7733a26a9c?hl=it&amp;lnk=gst&amp;q=average+time&amp;rnum=3#958c6e7733a26a9c">http://groups.google.it/group/django-users/browse_thread/thread/4ba5652bcbd1f958/958c6e7733a26a9c?hl=it&amp;lnk=gst&amp;q=average+time&amp;rnum=3#958c6e7733a26a9c</a><br />
<br />
So, here is my version, using the cache backend: <br />
<p>from datetime import timedelta, datetime <br />
from django.core.cache import cache <br />
from django.contrib.sites.models import Site <br />
<p>ONLINE_MINUTES = 10 <br />
CACHE_KEY = '%s_online_user_ids' % Site.objects.get_current().domain <br />
<p>_last_purged = datetime.now() <br />
<p>def get_online_user_ids(): <br />
&nbsp; &nbsp; user_dict = cache.get(CACHE_KEY) <br />
&nbsp; &nbsp; return hasattr(user_dict, 'keys') and user_dict.keys() or [] <br />
<p>class OnlineUsers(object): <br />
&nbsp; &nbsp; def process_request(self, request): <br />
&nbsp; &nbsp; &nbsp; &nbsp; if request.user.is_anonymous(): <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return <br />
<p>&nbsp; &nbsp; &nbsp; &nbsp; user_dict = cache.get(CACHE_KEY) <br />
&nbsp; &nbsp; &nbsp; &nbsp; if not user_dict: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # initialization <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user_dict = {} <br />
<p>&nbsp; &nbsp; &nbsp; &nbsp; now = datetime.now() <br />
&nbsp; &nbsp; &nbsp; &nbsp; user_dict[request.user.id] = now <br />
<p>&nbsp; &nbsp; &nbsp; &nbsp; # purge <br />
&nbsp; &nbsp; &nbsp; &nbsp; global _last_purged <br />
&nbsp; &nbsp; &nbsp; &nbsp; if _last_purged + timedelta(minutes=ONLINE_MINUTES) &lt; now: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; purge_older_than = now - timedelta(minutes=ONLINE_MINUTES) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for user_id, last_seen in user_dict.items(): <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if last_seen &lt; purge_older_than: <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; del(user_dict[user_id]) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _last_purged = now <br />
<p>&nbsp; &nbsp; &nbsp; &nbsp; cache.set(CACHE_KEY, user_dict, 60*60*24) <br />
<p>This stores a dictionary in the form: {user_id: last_seen_time, ...} <br />
in the cache and updates the cache once for every request by an <br />
authenticated user. <br />
<p>An alternative would be to store a structure like Jeremy's, <br />
{minute_seen: set(user_id, ...), ...} which I think will result in <br />
nearly the same amount of cache hits on <strong style="color: black; background-color: #ffff66">average</strong>. <br />
<p>I would like to hear your comments. <br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/285893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-08 08:41 <a href="http://www.blogjava.net/rain1102/archive/2009/07/08/285893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中使用MySQLdb插入数据中文问题</title><link>http://www.blogjava.net/rain1102/archive/2009/07/07/285837.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 07 Jul 2009 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/07/07/285837.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/285837.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/07/07/285837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/285837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/285837.html</trackback:ping><description><![CDATA[今天使用MySQLdb往MySQL插入中文数据遇到一个异常：UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-3: ordinal not in range(256)<br />
解决办法：<br />
在创建连接的时候设置一下编码，如：<br />
conn = MySQLdb.connect(host="localhost", user="root", passwd="root", db="chemical",<span style="color: red">&nbsp;charset="utf8"</span>)<img src ="http://www.blogjava.net/rain1102/aggbug/285837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-07-07 16:25 <a href="http://www.blogjava.net/rain1102/archive/2009/07/07/285837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Python写windows service的安装程序</title><link>http://www.blogjava.net/rain1102/archive/2009/06/28/284462.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sun, 28 Jun 2009 04:24:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/28/284462.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/284462.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/28/284462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/284462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/284462.html</trackback:ping><description><![CDATA[<p>首先必须清楚, 在使用python来创建windows服务, 需要使用pywin32类库, 下载地址:<a href="http://sourceforge.net/projects/pywin32/" target="_blank">http://sourceforge.net/projects/pywin32/</a><br />
下面我们创建一个什么也不做的服务,代码如下:<br />
<strong style="color: #008000">win32test.py</strong></p>
<p>import win32serviceutil<br />
import win32service<br />
import win32event</p>
<p>class <span style="color: #ff0000">win32test</span>(win32serviceutil.ServiceFramework):<br />
&nbsp;&nbsp;&nbsp; _svc_name_ = "Python Win32 Service" <br />
&nbsp;&nbsp;&nbsp; _svc_display_name_ = "Python Win32 Service" <br />
&nbsp;&nbsp;&nbsp; _svc_description_ = "Just for a demo, do nothing."<br />
&nbsp;&nbsp;&nbsp; def __init__(self, args): <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; win32serviceutil.ServiceFramework.__init__(self, args) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; def <span style="color: #ff0000">SvcDoRun</span>(self): <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; def <span style="color: #ff0000">SvcStop</span>(self): <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; win32event.SetEvent(self.hWaitStop) <br />
&nbsp;&nbsp;&nbsp; <br />
if __name__=='__main__': <br />
&nbsp;&nbsp;&nbsp; win32serviceutil.HandleCommandLine(<span style="color: #ff0000">win32test</span>)</p>
如果你想使用这个服务在启动或者停用时候做点事, 那么就把你要实现的业务写给对应的方法里SvcDoRun和SvcStop.<br />
<br />
下面我们来使用py2exe来把我们上面的service创建成安装文件, py2exe下载地址:<a href="http://sourceforge.net/projects/py2exe/" target="_blank">http://sourceforge.net/projects/py2exe/<br />
</a><span style="color: #008000"><strong>setup.py</strong></span><br />
<br />
<p>from distutils.core import setup<br />
import py2exe</p>
<p>class Target:<br />
&nbsp;&nbsp;&nbsp; def __init__(self, **kw):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.__dict__.update(kw)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # for the versioninfo resources<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.version = "1.0.0"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.company_name = "Founder Software Suzhou Co. Ltd."<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.copyright = "Copyright &amp;copy; 2009 Founder Software (Suzhou) Co., Ltd. "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.name = "Jchem cartridge windows service"</p>
<p><br />
myservice = Target(<br />
&nbsp;&nbsp;&nbsp; description = 'foo',<br />
&nbsp;&nbsp;&nbsp; modules = ['win32test'],<br />
&nbsp;&nbsp;&nbsp; cmdline_style='pywin32',<br />
&nbsp;&nbsp;&nbsp;&nbsp;icon_resources=[(1, "cartrigde.ico")] <br />
)</p>
<p>options = {"py2exe":&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; "compressed": 1,&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bundle_files": 1 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
setup(<br />
&nbsp;&nbsp;&nbsp; service=[myservice],<br />
&nbsp;&nbsp;&nbsp; options = options, <br />
&nbsp;&nbsp;&nbsp; zipfile = None,<br />
&nbsp;&nbsp;&nbsp; windows=[{"script": "win32test.py"}], <br />
)</p>
<p><br />
下面就可以使用python setup.py py2exe命令来生成安装文件了.<br />
生成的安装文件可以使用一下命令来执行控制服务:<br />
<span style="color: #008000">win32test.exe install<br />
win32test.exe start<br />
win32test.exe stop<br />
win32test.exe remove</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/284462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-28 12:24 <a href="http://www.blogjava.net/rain1102/archive/2009/06/28/284462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中的marshal模块和pickle模块</title><link>http://www.blogjava.net/rain1102/archive/2009/06/18/283124.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 18 Jun 2009 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/18/283124.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/283124.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/18/283124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/283124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/283124.html</trackback:ping><description><![CDATA[marshal模块使用了简单的自描述格式(Self-Describing Formats)把不连续的数据组合起来与字符串相互转化, 这样它们就可以写入文件或者是在网络中传输, 对于每个数据项目, 格式化后的字符串都包含一种类型代码, 然后是一个或者多个类型标识区域. 整数使用小字节序(little-endian order)储存, 字符串储存时和它自身内容长度相同(可能包含空字节), 元组由组成它的对象组合表示.&nbsp;它支持大多数的内建数据类型, 包括code对象. Python自身也使用了这个格式来存储编译后代码(.pyc文件).<br />
使用 marshal 模块组合不连续数据:<br />
<span style="color: #008000">import marshal<br />
value = (<br />
"this is a string",<br />
[1, 2, 3, 4],<br />
("more tuples", 1.0, 2.3, 4.5),<br />
"this is yet another string"<br />
)<br />
data = marshal.dumps(value)<br />
# intermediate format<br />
print type(data), len(data)<br />
print "-"*50<br />
print repr(data)<br />
print "-"*50<br />
print marshal.loads(data)</span><br />
输出结果为:<br />
&lt;type 'str'&gt; 130<br />
--------------------------------------------------<br />
'(\x04\x00\x00\x00s\x10\x00\x00\x00this is a string[\x04\x00\x00\x00i\x01\x00\x00\x00i\x02\x00\x00\x00i\x03\x00\x00\x00i\x04\x00\x00\x00(\x04\x00\x00\x00s\x0b\x00\x00\x00more tuplesg\x00\x00\x00\x00\x00\x00\xf0?gffffff\x02@g\x00\x00\x00\x00\x00\x00\x12@s\x1a\x00\x00\x00this is yet another string'<br />
--------------------------------------------------<br />
('this is a string', [1, 2, 3, 4], ('more tuples', 1.0, 2.2999999999999998, 4.5), 'this is yet another string')<br />
<br />
使用 marshal 模块处理代码:<br />
<span style="color: #008000">import marshal<br />
script = """<br />
print 'hello'<br />
"""<br />
code = compile(script, "&lt;script&gt;", "exec")<br />
data = <span style="color: #ff0000">marshal.dumps(code)<br />
</span># intermediate format<br />
print type(data), len(data)<br />
print "-"*50<br />
print repr(data)<br />
print "-"*50<br />
<span style="color: #ff0000">exec marshal.loads(data)</span></span><br />
输出结果为:<br />
&lt;type 'str'&gt; 102<br />
--------------------------------------------------<br />
'c\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00s\t\x00\x00\x00d\x00\x00GHd\x01\x00S(\x02\x00\x00\x00t\x05\x00\x00\x00helloN(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\x08\x00\x00\x00&lt;script&gt;s\x08\x00\x00\x00&lt;module&gt;\x02\x00\x00\x00s\x00\x00\x00\x00'<br />
--------------------------------------------------<br />
hello<br />
<br />
pickle模块和marshal用法相同, 它比marshal要慢一些, 但它支持用户自定义类, 可以处理类实例, 共享的元素, 以及递归数据结构等. 不过pickle模块不能处理code对象.&nbsp;还有一个 cPickle 模块, 使用 C 实现了相同的功能, 速度和 marshal 不相上下.<img src ="http://www.blogjava.net/rain1102/aggbug/283124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-18 22:22 <a href="http://www.blogjava.net/rain1102/archive/2009/06/18/283124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中的traceback模块</title><link>http://www.blogjava.net/rain1102/archive/2009/06/17/282916.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 17 Jun 2009 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/17/282916.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/282916.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/17/282916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/282916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/282916.html</trackback:ping><description><![CDATA[traceback模块被用来跟踪异常返回信息. 如下例所示:<br />
<span style="color: #008000">import traceback<br />
try:<br />
&nbsp;&nbsp;&nbsp; raise SyntaxError, "traceback test"<br />
except:<br />
&nbsp;&nbsp;&nbsp; traceback.print_exc()</span><br />
将会在控制台输出类似结果:<br />
<span style="color: #ff0000">Traceback (most recent call last):<br />
&nbsp; File "H:\PythonWorkSpace\Test\src\TracebackTest.py", line 3, in &lt;module&gt;<br />
&nbsp;&nbsp;&nbsp; raise SyntaxError, "traceback test"<br />
SyntaxError: traceback test</span><br />
类似在你没有捕获异常时候, 解释器所返回的结果.<br />
你也可以传入一个文件, 把返回信息写到文件中去, 如下:<br />
<span style="color: #008000">import traceback<br />
import StringIO<br />
try:<br />
&nbsp;&nbsp;&nbsp; raise SyntaxError, "traceback test"<br />
except:<br />
&nbsp;&nbsp;&nbsp; fp = StringIO.StringIO()&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #993366">#创建内存文件对象<br />
</span>&nbsp;&nbsp;&nbsp; traceback.print_exc(file=fp)<br />
&nbsp;&nbsp;&nbsp; message = fp.getvalue()<br />
&nbsp;&nbsp;&nbsp; print message</span><br />
这样在控制台输出的结果和上面例子一样<br />
traceback模块还提供了extract_tb函数来格式化跟踪返回信息, 得到包含错误信息的列表, 如下:<br />
<p><span style="color: #008000">import traceback<br />
import sys</span></p>
<p><span style="color: #008000">def tracebacktest():<br />
&nbsp;&nbsp;&nbsp; raise SyntaxError, "traceback test"<br />
try:<br />
&nbsp;&nbsp;&nbsp; tracebacktest()<br />
except:<br />
&nbsp;&nbsp;&nbsp; info = sys.exc_info()<br />
&nbsp;&nbsp;&nbsp; for file, lineno, function, text in traceback.extract_tb(info[2]):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print file, "line:", lineno, "in", function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print text<br />
&nbsp;&nbsp;&nbsp; print "** %s: %s" % info[:2]</span></p>
控制台输出结果如下:<br />
<span style="color: #ff0000">H:\PythonWorkSpace\Test\src\TracebackTest.py line: 7 in &lt;module&gt;<br />
tracebacktest()<br />
H:\PythonWorkSpace\Test\src\TracebackTest.py line: 5 in tracebacktest<br />
raise SyntaxError, "traceback test"<br />
** &lt;type 'exceptions.SyntaxError'&gt;: traceback test</span><br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/282916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-17 21:37 <a href="http://www.blogjava.net/rain1102/archive/2009/06/17/282916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中的fileinput模块和tempfile模块</title><link>http://www.blogjava.net/rain1102/archive/2009/06/16/282710.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 16 Jun 2009 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/16/282710.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/282710.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/16/282710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/282710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/282710.html</trackback:ping><description><![CDATA[fileinput模块提供处理一个或多个文本文件的功能, 可以通过使用for..in来循环读取一个或多个文本文件内容.<br />
<span style="color: #008000">import fileinput<br />
import sys<br />
import glob<br />
import string<br />
<br />
for line in fileinput.input("test.txt"):&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000">#处理一个文本文件<br />
</span>&nbsp;&nbsp;&nbsp; print line<br />
<br />
for line in fileinput.input(glob.glob("samples/*.txt")):&nbsp; <span style="color: #ff0000">#处理多个文本文件<br />
</span>&nbsp;&nbsp;&nbsp; if fileinput.isfirstline():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "------ reading %s ------\n" % fileinput.filename()&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">#获取文件名称<br />
</span>&nbsp;&nbsp;&nbsp; print str(fileinput.lineno()) + " " + string.upper(line)&nbsp; <span style="color: #ff0000">#获取行号和内容, 注意这里的行号是继前面文件行号来处理的,而不是重新开始计算<br />
</span></span><br />
<br />
tempfile模块提供给你一个快速创建一个命名唯一的临时文件<br />
<br />
<p><span style="color: #008000">import tempfile<br />
import os</span></p>
<p><span style="color: #008000">tempf = tempfile.mktemp(dir="D:/")</span></p>
<p><span style="color: #008000">print "tempfile", "=&gt;", tempf</span></p>
<p><span style="color: #008000">file = open(tempf, "w+b")<br />
file.write("*" * 1000)<br />
file.seek(0)<br />
print len(file.read()), "bytes"<br />
file.close()</span></p>
<p><span style="color: #008000">try:<br />
&nbsp;&nbsp;&nbsp; os.remove(tempf)&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">&nbsp;#用完以后要注意删除临时文件<br />
</span>except OSError:<br />
&nbsp;&nbsp;&nbsp; pass</span></p>
<br />
当然你还可以通过file = tempfile.TemporaryFile()直接为你创建一个临时文件,并且打开.<img src ="http://www.blogjava.net/rain1102/aggbug/282710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-16 22:37 <a href="http://www.blogjava.net/rain1102/archive/2009/06/16/282710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python map/filter/reduce[转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/06/14/282218.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sun, 14 Jun 2009 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/14/282218.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/282218.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/14/282218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/282218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/282218.html</trackback:ping><description><![CDATA[<p>原文:http://www.liuzhongshu.com/code/python-map-filter-reduce.html<br />
python有几个内置的函数很有意思：map/filter/reduce，都是对一个集合进行处理，filter很容易理解用于过滤，map用于映射，reduce用于归并，这几个词还是太抽象了，下面的代码精确的说明了这几个函数的用途：</p>
<pre>def map_imp(function, sequence) :<br />
&nbsp;&nbsp;&nbsp; if function is None: return list(sequence)<br />
&nbsp;&nbsp;&nbsp; retvals = []<br />
&nbsp;&nbsp;&nbsp; for element in sequence:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (function(element)):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retvals.append(element)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return retvals<br />
def reduce_imp(function, sequence) :<br />
&nbsp;&nbsp;&nbsp; arg1 = function(sequence[0])<br />
&nbsp;&nbsp;&nbsp; for arg2 in sequence[1:] :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg1 = function(arg1, arg2)<br />
&nbsp;&nbsp;&nbsp; return arg1<br />
def filter_imp(function, sequence) :<br />
&nbsp;&nbsp;&nbsp; retvals = []<br />
&nbsp;&nbsp;&nbsp; for element in sequence:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (function is None and element) or function(element) :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retvals.append(element)<br />
&nbsp;&nbsp;&nbsp; return retvals<br />
</pre>
<p>对于这种逻辑性强的东西，用语言来描述是无助的，代码则要清晰的多。<br />
<br />
具体使用方法可以参考另外一篇:http://www.blogjava.net/rain1102/archive/2009/06/01/279478.html</p><img src ="http://www.blogjava.net/rain1102/aggbug/282218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-14 22:08 <a href="http://www.blogjava.net/rain1102/archive/2009/06/14/282218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中的decorator的使用(java中的annotation)[转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/06/13/282093.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sat, 13 Jun 2009 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/13/282093.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/282093.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/13/282093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/282093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/282093.html</trackback:ping><description><![CDATA[<p>原文地址:http://www.donews.net/limodou/archive/2004/12/19/207521.aspx<br />
<br />
在我以前介绍 <a title="" href="http://www.python.org/" target="_blank">Python</a> 2.4 特性的Blog中已经介绍过了decorator了，不过，那时是照猫画虎，现在再仔细描述一下它的使用。</p>
<p>关于decorator的详细介绍在 <a title="" href="http://www.python.org/" target="_blank">Python</a> 2.4中的What's new中已经有介绍，大家可以看一下。</p>
<h2>如何调用decorator</h2>
<p>基本上调用decorator有两种形式</p>
<h3>第一种：</h3>
<blockquote dir="ltr" style="margin-right: 0px">
<p>@A<br />
def f ():<br />
&nbsp;&nbsp;&nbsp;&nbsp;...<br />
</p>
</blockquote>
<p>这种形式是decorator不带参数的写法。最终 <a title="" href="http://www.python.org/" target="_blank">Python</a> 会处理为：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>f = A(f)</p>
</blockquote>
<p>还可以扩展成：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>@A<br />
@B<br />
@C<br />
def f ():<br />
&nbsp;&nbsp;&nbsp;&nbsp;...<br />
</p>
</blockquote>
<p>最终 Python 会处理为：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>f = A(B(C(f)))</p>
</blockquote>
<p>注：文档上写的是@A @B @C的形式，但实际上是不行的，要写成多行。<strike>而且执行顺序是按函数调用顺序来的，先最下面的C，然后是B，然后是A。因此，如果decorator有顺序话，一定要注意：先要执行的放在最下面，最后执行的放在最上面。</strike>(应该不存在这种倒序的关系)</p>
<h3>第二种：</h3>
<blockquote dir="ltr" style="margin-right: 0px">
<p>@A(args)<br />
def f ():<br />
&nbsp;&nbsp;&nbsp;&nbsp;...</p>
</blockquote>
<p>这种形式是decorator带参数的写法。那么 Python 会处理为：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>def f(): ...<br />
_deco = A(args)<br />
f = _deco(f)</p>
</blockquote>
<p>可以看出， Python 会先执行A(args)得到一个decorator函数，然后再按与第一种一样的方式进行处理。</p>
<h2>decorator函数的定义</h2>
<p>每一个decorator都对应有相应的函数，它要对后面的函数进行处理，要么返回原来的函数对象，要么返回一个新的函数对象。请注意，decorator只用来处理函数和类方法。</p>
<h3>第一种：</h3>
<p>针对于第一种调用形式</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>def A(func):<br />
&nbsp;&nbsp;&nbsp;&nbsp;#处理func<br />
&nbsp;&nbsp;&nbsp;&nbsp;#如func.attr='decorated'<br />
&nbsp;&nbsp;&nbsp;&nbsp;return func<br />
@A<br />
def f(args):pass</p>
</blockquote>
<p>上面是对func处理后，仍返回原函数对象。这个decorator函数的参数为要处理的函数。如果要返回一个新的函数，可以为：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>def A(func):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def new_func(args):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#做一些额外的工作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return func(args) #调用原函数继续进行处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;return new_func<br />
@A<br />
def f(args):pass</p>
</blockquote>
<p>要注意 new_func的定义形式要与待处理的函数相同，因此还可以写得通用一些，如：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>def A(func):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def new_func(*args, **argkw):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#做一些额外的工作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return func(*args, **argkw) #调用原函数继续进行处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;return new_func<br />
@A<br />
def f(args):pass</p>
</blockquote>
<p>可以看出，在A中定义了新的函数，然后A返回这个新的函数。在新函数中，先处理一些事情，比如对参数进行检查，或做一些其它的工作，然后再调原始的函数进行处理。这种模式可以看成，在调用函数前，通过使用decorator技术，可以在调用函数之前进行了一些处理。如果你想在调用函数之后进行一些处理，或者再进一步，在调用函数之后，根据函数的返回值进行一些处理可以写成这样：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>def A(func):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def new_func(*args, **argkw):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = func(*args, **argkw) #调用原函数继续进行处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if result:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#做一些额外的工作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new_result<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result<br />
&nbsp;&nbsp;&nbsp;&nbsp;return new_func<br />
@A<br />
def f(args):pass</p>
</blockquote>
<h3>第二种：</h3>
<p>针对第二种调用形式</p>
<p>在文档上说，如果你的decorator在调用时使用了参数，那么你的decorator函数只会使用这些参数进行调用，因此你需要返回一个新的decorator函数，这样就与第一种形式一致了。</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>def A(arg):<br />
&nbsp;&nbsp;&nbsp;&nbsp;def _A(func):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def new_func(args):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#做一些额外的工作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return func(args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new_func<br />
&nbsp;&nbsp;&nbsp;&nbsp;return _A<br />
@A(arg)<br />
def f(args):pass</p>
</blockquote>
<p>可以看出A(arg)返回了一个新的 decorator _A。</p>
<h2>decorator的应用场景</h2>
<p>不过我也一直在想，到底decorator的魔力是什么？适合在哪些场合呢？是否我需要使用它呢？</p>
<p>decorator的魔力就是它可以对所修饰的函数进行加工。那么这种加工是在不改变原来函数代码的情况下进行的。有点象我知道那么一点点的AOP(面向方面编程)的想法。</p>
<p>它适合的场合我能想到的列举出下：</p>
<ol>
    <li>象文档中所说，最初是为了使调用staticmethod和classmethod这样的方法更方便
    <li>在某些函数执行前做一些工作，如web开发中，许多函数在调用前需要先检查一下用户是否已经登录，然后才能调用
    <li>在某此函数执行后做一些工作，如调用完毕后，根据返回状态写日志
    <li>做参数检查</li>
</ol>
<p>可能还有许多，你可以自由发挥想象</p>
<p>那么我需要用它吗？</p>
<p>我想那要看你了。不过，我想在某些情况下，使用decorator可以增加程序的灵活性，减少耦合度。比如前面所说的用户登录检查。的确可以写一个通用的登录检查函数，然后在每个函数中进行调用。但这样会造成函数不够灵活，而且增加了与其它函数之间的结合程度。如果用户登录检查功能有所修改，比如返回值的判断发生了变化，有可能每个用到它的函数都要修改。而使用decorator不会造成这一问题。同时使用decorator的语法也使得代码简单，清晰(一但你熟悉它的语法的话)。当然你不使用它是可以的。不过，这种函数之间相互结合的方式，更符合搭积木的要求，它可以把函数功能进一步分解，使得功能足够简单和单一。然后再通过decorator的机制灵活的把相关的函数串成一个串，这么一想，还真是不错。比如下面：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>@A<br />
@B<br />
def account(args):pass</p>
</blockquote>
<p>假设这是一个记帐处理函数，account只管记帐。但一个真正的记帐还有一些判断和处理，比如：B检查帐户状态，A记日志。这样的效果其实是先检查B、通过在A中的处理可以先执行account，然后再进行记日志的处理。象搭积木一样很方便，改起来也容易。甚至可以把account也写成decorator，而下面执行的函数是一个空函数。然后再通过配置文件等方法，将decorator的组合保存起来，就基本实现功能的组装化。是不是非常理想。</p>
<p>Python 带给人的创造力真是无穷啊！</p>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.donews.net/TrackBack.aspx?PostId=207521</p><img src ="http://www.blogjava.net/rain1102/aggbug/282093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-13 23:46 <a href="http://www.blogjava.net/rain1102/archive/2009/06/13/282093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python中自定义annotation</title><link>http://www.blogjava.net/rain1102/archive/2009/06/13/282091.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sat, 13 Jun 2009 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/13/282091.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/282091.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/13/282091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/282091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/282091.html</trackback:ping><description><![CDATA[<p><span style="color: #008000">def audit(fn):<br />
&nbsp;&nbsp;&nbsp; def new(*args):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print args&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">#这里可以修改参数, 做一些处理,&nbsp;如果不像让方法继续执行下去,&nbsp; 可以直接return None<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fn(*args)<br />
&nbsp;&nbsp;&nbsp; return new</span></p>
<p><span style="color: #008000">@audit<br />
def test(a):<br />
&nbsp;&nbsp;&nbsp; print a</span></p>
<p><span style="color: #008000">test("abc")</span><br />
<br />
运行结果:<br />
('abc',)<br />
abc</p><img src ="http://www.blogjava.net/rain1102/aggbug/282091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-13 23:17 <a href="http://www.blogjava.net/rain1102/archive/2009/06/13/282091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用PIL截图</title><link>http://www.blogjava.net/rain1102/archive/2009/06/13/281963.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sat, 13 Jun 2009 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/13/281963.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/281963.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/13/281963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/281963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/281963.html</trackback:ping><description><![CDATA[from PIL import ImageGrab<br />
import os<br />
im = ImageGrab.grab()&nbsp; <br />
im.save("c:/screenprint.png")&nbsp; # 或者直接使用im.show()去显示截屏<br />
os.execvp( "mspaint",('mspaint','c:\screenprint.png'))&nbsp; #使用paint打开截图<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/281963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-13 09:19 <a href="http://www.blogjava.net/rain1102/archive/2009/06/13/281963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python程序删除svn文件</title><link>http://www.blogjava.net/rain1102/archive/2009/06/12/281931.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 12 Jun 2009 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/12/281931.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/281931.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/12/281931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/281931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/281931.html</trackback:ping><description><![CDATA[D:/ DeleteSVN.py&nbsp; 文件<br />
<p><span style="color: #008000">#coding=utf-8<br />
import os<br />
import shutil<br />
import sys<br />
import stat</span></p>
<p><span style="color: #008000">def deleteSubFile(svnpath):<br />
&nbsp;&nbsp;&nbsp; names = os.listdir(svnpath)<br />
&nbsp;&nbsp;&nbsp; for name in names:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp = os.path.join( svnpath, name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (os.path.isfile(fp)):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.chmod( fp, stat.S_IWRITE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.remove(fp)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteSubFile(fp)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="color: #008000">def deleteSVN(parentPath = None, dir = None):<br />
&nbsp;&nbsp;&nbsp; if (dir != None and dir == '.svn'):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteSubFile(os.path.join( parentPath, dir))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shutil.rmtree(os.path.join( parentPath, dir), True, False)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'deleted ', os.path.join( parentPath, dir)<br />
&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dir != None):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = os.path.join( parentPath, dir)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filePath = parentPath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; names = os.listdir(filePath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for name in names:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp = os.path.join( filePath, name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (os.path.isdir(fp)):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteSVN(filePath, name)</span></p>
<p><br />
<span style="color: #008000">if len(sys.argv) &lt; 2:<br />
&nbsp;&nbsp;&nbsp; print 'Usage: python % &lt;file path&gt;' % os.path.basename(sys.argv[0])<br />
&nbsp;&nbsp;&nbsp; sys.exit(-1)</span></p>
<p><span style="color: #008000">if os.path.isfile(sys.argv[1]):<br />
&nbsp;&nbsp;&nbsp; print '请选择文件夹, 而不是文件'<br />
else:<br />
&nbsp;&nbsp;&nbsp; deleteSVN(parentPath = sys.argv[1])</span></p>
<br />
<br />
bat文件代码如下:<br />
<span style="color: #008000">python D:/DeleteSVN.py "%1"<br />
@pause<br />
<br />
<span style="color: #ff0000">这样把包含svn文件的文件夹直接拉到bat文件中, 就会删除掉里面所有svn文件</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/281931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-12 23:19 <a href="http://www.blogjava.net/rain1102/archive/2009/06/12/281931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中修改只读文件为可读文件</title><link>http://www.blogjava.net/rain1102/archive/2009/06/12/281928.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Fri, 12 Jun 2009 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/12/281928.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/281928.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/12/281928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/281928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/281928.html</trackback:ping><description><![CDATA[<span style="color: #0000ff">import</span><span style="color: #000000"> os<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000"> stat<br />
os.chmod( filename, stat.S_IWRITE )<br />
</span><img src ="http://www.blogjava.net/rain1102/aggbug/281928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-12 23:00 <a href="http://www.blogjava.net/rain1102/archive/2009/06/12/281928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中获取随机字符串</title><link>http://www.blogjava.net/rain1102/archive/2009/06/08/280764.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 08 Jun 2009 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/08/280764.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/280764.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/08/280764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/280764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/280764.html</trackback:ping><description><![CDATA[在用户找回密码功能里面, 需要生成随机字符串, 在python中其实很简单, 先定义一个字符串变量, 包含密码中你想生成随机字符串使用的所有字符.<br />
<span style="color: #008000">list = 'abcdefghijklmnopqrstuvwxyz$&amp;()#@'</span><br />
<span style="color: #008000">import string, random</span><br />
<span style="color: #008000"><span style="color: #000000"><span style="color: #008000">password = string.join(random.sample(list, 6), sep='')<br />
user.set_password(password)</span><br />
<br />
注意需要使用random和string模块, 前者是用来获取随机字符, 后者是把list转化为字符串形式.<br />
</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/280764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-08 22:28 <a href="http://www.blogjava.net/rain1102/archive/2009/06/08/280764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解yield [转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/06/06/280355.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Sat, 06 Jun 2009 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/06/280355.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/280355.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/06/280355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/280355.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/280355.html</trackback:ping><description><![CDATA[原文地址:http://www.cnblogs.com/coderzh/archive/2008/05/18/1202040.html<br />
yield的英文单词意思是生产，刚接触Python的时候感到非常困惑，一直没弄明白yield的用法。只是粗略的知道yield可以用来为一个函数返回值塞数据，比如下面的例子：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;addlist(alist):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;alist:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span></div>
取出alist的每一项，然后把i + 1塞进去。然后通过调用取出每一项：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">alist&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">]<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;addlist(alist):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;x,</span></div>
这的确是yield应用的一个例子，但是，看过limodou的文章《<a href="http://blog.donews.com/limodou/archive/2006/09/04/1028747.aspx">2.5版yield之学习心得</a>》，并自己反复体验后，对yield有了一个全新的理解。<br />
<h3>1. 包含yield的函数</h3>
假如你看到某个函数包含了yield，这意味着这个函数已经是一个Generator，它的执行会和其他普通的函数有很多不同。比如下面的简单的函数：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;h():<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">To&nbsp;be&nbsp;brave</span><span style="color: #800000">'</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000"><br />
<br />
h()</span></div>
可以看到，调用h()之后，print 语句并没有执行！这就是yield，那么，如何让print 语句执行呢？这就是后面要讨论的问题，通过后面的讨论和学习，就会明白yield的工作原理了。<br />
<h3>2. yield是一个表达式</h3>
Python2.5以前，yield是一个语句，但现在2.5中，yield是一个表达式(Expression)，比如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span></div>
表达式(yield 5)的返回值将赋值给m，所以，认为 m = 5 是错误的。那么如何获取(yield 5)的返回值呢？需要用到后面要介绍的send(msg)方法。<br />
<h3>3. 透过next()语句看原理</h3>
现在，我们来揭晓yield的工作原理。我们知道，我们上面的h()被调用后并没有执行，因为它有yield表达式，因此，我们通过next()语句让它执行。next()语句将恢复Generator执行，并直到下一个yield表达式处。比如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;h():<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">Wen&nbsp;Chuan</span><span style="color: #800000">'</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">Fighting!</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<br />
c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h()<br />
c.next()</span></div>
c.next()调用后，h()开始执行，直到遇到yield 5，因此输出结果：<br />
Wen Chuan<br />
当我们再次调用c.next()时，会继续执行，直到找到下一个yield表达式。由于后面没有yield了，因此会拋出异常：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">Wen&nbsp;Chuan<br />
Fighting!<br />
Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last):<br />
&nbsp;&nbsp;File&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">/home/evergreen/Codes/yidld.py</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;line&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">module</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;c.next()<br />
StopIteration</span></div>
<h3>4. send(msg) 与 next()</h3>
了解了next()如何让包含yield的函数执行后，我们再来看另外一个非常重要的函数send(msg)。其实next()和send()在一定意义上作用是相似的，区别是send()可以传递yield表达式的值进去，而next()不能传递特定的值，只能传递None进去。因此，我们可以看做<br />
c.next() 和 c.send(None) 作用是一样的。<br />
来看这个例子：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;h():<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">Wen&nbsp;Chuan</span><span style="color: #800000">'</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">&nbsp;Fighting!</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;m<br />
&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">We&nbsp;are&nbsp;together!</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<br />
c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h()<br />
c.next()&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">相当于c.send(None)</span><span style="color: #008000"><br />
</span><span style="color: #000000">c.send(</span><span style="color: #800000">'</span><span style="color: #800000">Fighting!</span><span style="color: #800000">'</span><span style="color: #000000">)&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">(yield&nbsp;5)表达式被赋予了'Fighting!'</span></div>
输出的结果为：<br />
Wen Chuan Fighting!<br />
需要提醒的是，第一次调用时，请使用next()语句或是send(None)，不能使用send发送一个非None的值，否则会出错的，因为没有yield语句来接收这个值。<br />
<h3>5. send(msg) 与 next()的返回值</h3>
send(msg) 和 next()是有返回值的，它们的返回值很特殊，返回的是下一个yield表达式的参数。比如yield 5，则返回 5 。到这里，是不是明白了一些什么东西？本文第一个例子中，通过for i in alist 遍历 Generator，其实是每次都调用了alist.Next()，而每次alist.Next()的返回值正是yield的参数，即我们开始认为被压进去的东东。我们再延续上面的例子：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;h():<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">Wen&nbsp;Chuan</span><span style="color: #800000">'</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">&nbsp;Fighting!</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;m<br />
&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">yield</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">We&nbsp;are&nbsp;together!</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<br />
c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h()<br />
m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c.next()&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">m&nbsp;获取了yield&nbsp;5&nbsp;的参数值&nbsp;5</span><span style="color: #008000"><br />
</span><span style="color: #000000">d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c.send(</span><span style="color: #800000">'</span><span style="color: #800000">Fighting!</span><span style="color: #800000">'</span><span style="color: #000000">)&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">d&nbsp;获取了yield&nbsp;12&nbsp;的参数值12</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">We&nbsp;will&nbsp;never&nbsp;forget&nbsp;the&nbsp;date</span><span style="color: #800000">'</span><span style="color: #000000">,&nbsp;m,&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">.</span><span style="color: #800000">'</span><span style="color: #000000">,&nbsp;d</span></div>
输出结果：<br />
Wen Chuan Fighting!<br />
We will never forget the date 5 . 12<br />
<h3>6. throw() 与 close()中断 Generator</h3>
中断Generator是一个非常灵活的技巧，可以通过throw抛出一个GeneratorExit异常来终止Generator。Close()方法作用是一样的，其实内部它是调用了throw(GeneratorExit)的。我们看：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;close(self):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.throw(GeneratorExit)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">except</span><span style="color: #000000">&nbsp;(GeneratorExit,&nbsp;StopIteration):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">pass</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">raise</span><span style="color: #000000">&nbsp;RuntimeError(</span><span style="color: #800000">"</span><span style="color: #800000">generator&nbsp;ignored&nbsp;GeneratorExit</span><span style="color: #800000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008000">#</span><span style="color: #008000">&nbsp;Other&nbsp;exceptions&nbsp;are&nbsp;not&nbsp;caught</span></div>
因此，当我们调用了close()方法后，再调用next()或是send(msg)的话会抛出一个异常：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">Traceback&nbsp;(most&nbsp;recent&nbsp;call&nbsp;last):<br />
&nbsp;&nbsp;File&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">/home/evergreen/Codes/yidld.py</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;line&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">module</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c.send(</span><span style="color: #800000">'</span><span style="color: #800000">Fighting!</span><span style="color: #800000">'</span><span style="color: #000000">)&nbsp;&nbsp;</span><span style="color: #008000">#</span><span style="color: #008000">d&nbsp;获取了yield&nbsp;12&nbsp;的参数值12</span><span style="color: #008000"><br />
</span><span style="color: #000000">StopIteration</span></div>
<br />
注：以上观点属于本人的个人理解，如有偏差请批评指正。谢谢！<br />
<div id="MySignature">
<div id="MySignature">
<p id="LyjSignature" style="border-right: #e0e0e0 1px dashed; padding-right: 10px; border-top: #e0e0e0 1px dashed; padding-left: 60px; background: url(http://www.cnblogs.com/images/cnblogs_com/lyj/o_info.png) #fffeee no-repeat 1% 50%; padding-bottom: 10px; border-left: #e0e0e0 1px dashed; padding-top: 10px; border-bottom: #e0e0e0 1px dashed; font-family: 微软雅黑; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">作者：<a href="http://coderzh.cnblogs.com/" target="_blank">CoderZh</a>（<a href="http://coderzh.cnblogs.com/" target="_blank">CoderZh的技术博客 - 博客园</a>）<br />
出处：<a href="http://coderzh.cnblogs.com/" target="_blank">http://coderzh.cnblogs.com/</a><br />
文章版权归本人所有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 </p>
</div>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/280355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-06 19:53 <a href="http://www.blogjava.net/rain1102/archive/2009/06/06/280355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python中eval, exec, execfile,和compile [转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/06/04/280085.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 04 Jun 2009 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/04/280085.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/280085.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/04/280085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/280085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/280085.html</trackback:ping><description><![CDATA[<p><font face="Verdana">eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值，并返回计算结果。</font></p>
<p><font face="Verdana">同样地, exec语句将字符串str当成有效Python代码来执行.提供给exec的代码的名称空间和exec语句的名称空间相同.</font></p>
<p><font face="Verdana">最后，execfile(filename [,globals [,locals ]])函数可以用来执行一个文件,看下面的例子:</font></p>
<p><font face="Verdana">&gt;&gt;&gt; eval('3+4')<br />
7<br />
&gt;&gt;&gt; exec 'a=100'<br />
&gt;&gt;&gt; a<br />
100<br />
&gt;&gt;&gt; execfile(r'c:\test.py')<br />
hello,world!<br />
&gt;&gt;&gt;<br />
默认的，eval(),exec,execfile()所运行的代码都位于当前的名字空间中. eval(), exec,和 execfile()函数也可以接受一个或两个可选字典参数作为代码执行的全局名字空间和局部名字空间. 例如:</font></p>
<p><font face="Verdana">1 globals = {'x': 7,<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'y': 10,<br />
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'birds': ['Parrot', 'Swallow', 'Albatross']<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
5 locals = { }<br />
6 <br />
7 # 将上边的字典作为全局和局部名称空间<br />
8 a = eval("3*x + 4*y", globals, locals)<br />
9 exec "for b in birds: print b" in globals, locals&nbsp;&nbsp; # 注意这里的语法<br />
10 execfile("foo.py", globals, locals)</font></p>
<p><font face="Verdana">如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用.如果一个函数体内嵌嵌套函数或lambda匿名函数时,同时又在函数主体中使用exec或execfile()函数时， 由于牵到嵌套作用域，会引发一个SyntaxError异常.（此段原文:If you omit one or both namespaces, the current values of the global and local namespaces are used. Also,due to issues related to nested scopes, the use of exec or execfile() inside a function body may result in a SyntaxError exception if that function also contains nested function definitions or uses the lambda operator.）</font></p>
<p><font face="Verdana">在Python2.4中俺未发现可以引起异常<br />
注意例子中exec语句的用法和eval(), execfile()是不一样的. exec是一个语句(就象print或while), 而eval()和execfile()则是内建函数.<br />
exec(str) 这种形式也被接受，但是它没有返回值。<br />
当一个字符串被exec,eval(),或execfile()执行时,解释器会先将它们编译为字节代码，然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码，可以有效提高程序的执行效率。<br />
compile(str ,filename ,kind )函数将一个字符串编译为字节代码, str是将要被编译的字符串, filename是定义该字符串变量的文件，kind参数指定了代码被编译的类型-- 'single'指单个语句, 'exec'指多个语句, 'eval'指一个表达式. cmpile()函数返回一个代码对象，该对象当然也可以被传递给eval()函数和exec语句来执行,例如:</font></p>
<p><font face="Verdana">1 str = "for i in range(0,10): print i"<br />
2 c = compile(str,'','exec')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 编译为字节代码对象<br />
3 exec c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 执行<br />
4 <br />
5 str2 = "3*x + 4*y"<br />
6 c2 = compile(str2, '', 'eval')&nbsp; # 编译为表达<br />
</font></p><img src ="http://www.blogjava.net/rain1102/aggbug/280085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-04 22:07 <a href="http://www.blogjava.net/rain1102/archive/2009/06/04/280085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中的 strip, lstrip和rstrip使用方法</title><link>http://www.blogjava.net/rain1102/archive/2009/06/04/280067.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Thu, 04 Jun 2009 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/04/280067.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/280067.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/04/280067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/280067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/280067.html</trackback:ping><description><![CDATA[在平时我们可能会经常使用strip()方法, 注意这里没有传入任何参数, 该方法会取出字符串两端的空格. 而实际上strip方法也可以传入参数来进行对字符串首尾进行过滤操作. 与它一起的还有lstrip和rstrip方法. <br />
<p>theString = 'saaaay yes no yaaaass' <br />
print theString.strip('say') </p>
<p>&nbsp;yes no <br />
<br />
这样theString首尾字符在['s', 'a', 'y']中的字符将会被过滤掉. lstrip和rstrip原理以及用法和strip一样.</p><img src ="http://www.blogjava.net/rain1102/aggbug/280067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-04 20:22 <a href="http://www.blogjava.net/rain1102/archive/2009/06/04/280067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ljust, rjust, center, zfill和%</title><link>http://www.blogjava.net/rain1102/archive/2009/06/03/279897.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 03 Jun 2009 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/03/279897.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/279897.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/03/279897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/279897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/279897.html</trackback:ping><description><![CDATA[&nbsp;在Python中打印字符串时可以调用ljust（左对齐），rjust（右对齐），center（中间对齐）来输出整齐美观的字符串，<br />
&gt;&gt;&gt; for x in range(1, 11):<br />
... print repr(x).rjust(2), repr(x*x).rjust(3),<br />
... # Note trailing comma on previous line<br />
... print repr(x*x*x).rjust(4)<br />
...<br />
&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; 27<br />
&nbsp;4&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp; 64<br />
&nbsp;5&nbsp;&nbsp;&nbsp;25&nbsp;&nbsp; 125<br />
&nbsp;6&nbsp;&nbsp;&nbsp;36&nbsp;&nbsp; 216<br />
&nbsp;7&nbsp;&nbsp;&nbsp;49&nbsp;&nbsp; 343<br />
&nbsp;8&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp; 512<br />
&nbsp;9&nbsp;&nbsp;&nbsp;81&nbsp;&nbsp; 729<br />
10 100 1000<br />
<br />
当然你也可以使用%来处理输出结果<br />
&gt;&gt;&gt; for x in range(1,11):<br />
... print &#8217;%2d %3d %4d&#8217; % (x, x*x, x*x*x)<br />
...<br />
&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; 27<br />
&nbsp;4&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp; 64<br />
&nbsp;5&nbsp;&nbsp;&nbsp;25&nbsp;&nbsp; 125<br />
&nbsp;6&nbsp;&nbsp;&nbsp;36&nbsp;&nbsp; 216<br />
&nbsp;7&nbsp;&nbsp;&nbsp;49&nbsp;&nbsp; 343<br />
&nbsp;8&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp; 512<br />
&nbsp;9&nbsp;&nbsp;&nbsp;81&nbsp;&nbsp; 729<br />
10 100 1000<br />
zfill()则用于向数值的字符串表达式左侧填充0, 该函数可以正确理解正负号:<br />
&gt;&gt;&gt; '12'.zfill(5)<br />
'00012&#8217;<br />
&gt;&gt;&gt; '-3.14'.zfill(7)<br />
'-003.14'<br />
&gt;&gt;&gt; '3.14159265359'.zfill(5)<br />
'3.14159265359'<br />
<br />
如果有超过一个的字符串需要格式化为一体, 就需要将它们传入一个元组作为右值, 如:<br />
&gt;&gt;&gt; table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}<br />
&gt;&gt;&gt; for name, phone in table.items():<br />
... print '%-10s ==&gt; %10d'&nbsp; %&nbsp; (name, phone)<br />
...<br />
Jack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;==&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4098<br />
Dcab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7678<br />
Sjoerd&nbsp;&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4127<br />
<br />
当然还有一个更好用的就是格式化时候使用变量名:<br />
&gt;&gt;&gt;table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}<br />
&gt;&gt;&gt;print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table<br />
Jack: 4098; Sjoerd: 4127; Dcab: 8637678<br />
该技巧在与内置函数vars()组合使用非常有用, 该函数返回一个包含所有局部变量的字典.<img src ="http://www.blogjava.net/rain1102/aggbug/279897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-03 21:08 <a href="http://www.blogjava.net/rain1102/archive/2009/06/03/279897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中的集合操作</title><link>http://www.blogjava.net/rain1102/archive/2009/06/02/279691.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 02 Jun 2009 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/02/279691.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/279691.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/02/279691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/279691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/279691.html</trackback:ping><description><![CDATA[python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.<br />
<br />
&gt;&gt;&gt; basket = [&#8217;apple&#8217;, &#8217;orange&#8217;, &#8217;apple&#8217;, &#8217;pear&#8217;, &#8217;orange&#8217;, &#8217;banana&#8217;]<br />
&gt;&gt;&gt; fruit = set(basket) # create a set without duplicates<br />
&gt;&gt;&gt; fruit<br />
set([&#8217;orange&#8217;, &#8217;pear&#8217;, &#8217;apple&#8217;, &#8217;banana&#8217;])<br />
&gt;&gt;&gt; &#8217;orange&#8217; in fruit # fast membership testing<br />
True<br />
&gt;&gt;&gt; &#8217;crabgrass&#8217; in fruit<br />
False<br />
&gt;&gt;&gt; # Demonstrate set operations on unique letters from two words<br />
...<br />
&gt;&gt;&gt; a = set(&#8217;abracadabra&#8217;)<br />
&gt;&gt;&gt; b = set(&#8217;alacazam&#8217;)<br />
&gt;&gt;&gt; a # unique letters in a<br />
set([&#8217;a&#8217;, &#8217;r&#8217;, &#8217;b&#8217;, &#8217;c&#8217;, &#8217;d&#8217;])<br />
&gt;&gt;&gt; a - b # letters in a but not in b<br />
set([&#8217;r&#8217;, &#8217;d&#8217;, &#8217;b&#8217;])<br />
&gt;&gt;&gt; a | b # letters in either a or b<br />
set([&#8217;a&#8217;, &#8217;c&#8217;, &#8217;r&#8217;, &#8217;d&#8217;, &#8217;b&#8217;, &#8217;m&#8217;, &#8217;z&#8217;, &#8217;l&#8217;])<br />
&gt;&gt;&gt; a &amp; b # letters in both a and b<br />
set([&#8217;a&#8217;, &#8217;c&#8217;])<br />
&gt;&gt;&gt; a ^ b # letters in a or b but not both<br />
set([&#8217;r&#8217;, &#8217;d&#8217;, &#8217;b&#8217;, &#8217;m&#8217;, &#8217;z&#8217;, &#8217;l&#8217;])<img src ="http://www.blogjava.net/rain1102/aggbug/279691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-02 21:24 <a href="http://www.blogjava.net/rain1102/archive/2009/06/02/279691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python链表类型对象所含有的方法</title><link>http://www.blogjava.net/rain1102/archive/2009/06/01/279478.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 01 Jun 2009 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/01/279478.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/279478.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/01/279478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/279478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/279478.html</trackback:ping><description><![CDATA[append(x)<br />
把一个元素添加到链表的结尾, 相当于a[len(a):] = [x] 或者a[len(a):] = x<br />
extend(L)<br />
通过添加指定链表的所有元素来扩充链表, 相当于a[len(a):] = L<br />
insert(i, x)<br />
在指定位置插入一个元素.<br />
remove(x)<br />
删除链表中值为x的第一个元素, 如果没有这样的元素, 则会返回一个错误.<br />
pop([i])<br />
从链表的指定位置删除元素,并将其返回. 如果没有指定索引, a.pop()返回最后一个元素.<br />
index(x)<br />
返回链表中第一个值为x的元素的索引. 如果没有匹配的元素就会返回一个错误.<br />
count(x)<br />
返回x在链表中出现的次数<br />
sort()<br />
对链表中的元素进行排序.<br />
reverse()<br />
链表顺序翻转 <br />
<br />
另外链表对象还有几个内置函数非常有用:<br />
filter(function, sequence)<br />
返回一个序列, 包含了给定序列中所有调用function(item)后返回值为true的元素.<br />
map(function, sequence)<br />
为每个元素一次调用function(item)并将返回值组成一个链表返回.<br />
可以传入多个序列, 但函数的参数个数必须和序列个数一致, 执行时会一次用各个序列上对应的元素来调用函数(如果某些序列比其他短,则用None代替).<br />
reduce(function, sequence)<br />
返回一个单值, 首先以序列的前两个元素调用函数, 再以返回的值和第三个参数调用, 一次执行下去.<br />
可以传入第三个参数作为初始值. <br />
sum(sequence)<br />
计算序列总和<br />
<br />
<p><span style="color: #ff0000">def f(x):<br />
&nbsp;&nbsp;&nbsp; return x % 2 != 0 and x % 3 != 0 <br />
print filter(f, range(2, 25))<br />
<br />
<span style="color: #ff0000">[5, 7, 11, 13, 17, 19, 23]</span></span></p>
<p><span style="color: #008000">def cube(x):<br />
&nbsp;&nbsp;&nbsp; return x * x * x<br />
print map(cube, range(1, 11))<br />
<br />
<span style="color: #008000">[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]</span></span></p>
<p><span style="color: #333399">def add(x, y):<br />
&nbsp;&nbsp;&nbsp; return x + y<br />
print map(add, range(1, 5), range(3, 7))<br />
<br />
<span style="color: #666699">[4, 6, 8, 10]</span></span></p>
<p><span style="color: #993366">print reduce(add, range(1, 11))<br />
<br />
<span style="color: #993366">55</span></span></p>
<p><span style="color: #99cc00">print sum(range(1, 11))</span><br />
<br />
<span style="color: #99cc00">55</span></p><img src ="http://www.blogjava.net/rain1102/aggbug/279478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-01 22:38 <a href="http://www.blogjava.net/rain1102/archive/2009/06/01/279478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中启动执行文件</title><link>http://www.blogjava.net/rain1102/archive/2009/06/01/279460.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Mon, 01 Jun 2009 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/06/01/279460.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/279460.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/06/01/279460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/279460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/279460.html</trackback:ping><description><![CDATA[<span style="color: #008000">import os<br />
filename = os.environ.get('PYTHONSTARTUP')<br />
if filename and os.path.isfile(filename):<br />
&nbsp;&nbsp;&nbsp; execfile(filename)</span><br /><img src ="http://www.blogjava.net/rain1102/aggbug/279460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-06-01 20:55 <a href="http://www.blogjava.net/rain1102/archive/2009/06/01/279460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python中__future__ 模块以及with语句</title><link>http://www.blogjava.net/rain1102/archive/2009/05/27/278185.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 27 May 2009 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/05/27/278185.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/278185.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/05/27/278185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/278185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/278185.html</trackback:ping><description><![CDATA[从python2.1开始以后, 当一个新的语言特性首次出现在发行版中时候, 如果该新特性与以前旧版本python不兼容, 则该特性将会被默认禁用. 如果想启用这个新特性, 则必须使用 "from __future__import *" 语句进行导入. 比如在2.5下使用with特性.<br />
<br />
<p><span style="color: #008000">from __future__ import with_statement</span></p>
<p><span style="color: #008000">with open('test.txt', 'r') as f:<br />
&nbsp;&nbsp;&nbsp; for line in f:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print line</span></p>
with方式语句可以替换以前try..catch语句, 如果使用try..catch语句则为:<br />
<span style="color: #008000">try:<br />
&nbsp;&nbsp;&nbsp; f = open('test.txt', 'r')<br />
&nbsp;&nbsp;&nbsp; for line in f:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print line<br />
finally:<br />
&nbsp;&nbsp;&nbsp; f.close()</span><br />
而with代码块如果内部出现任何错误, 都将会自动调用close方法<br />
<br />
如果上面的with代码块没有使用from __future__ import with_statement, 代码将会报错, 提示你这个功能在2.6中实现.<br />
<span style="color: red">Warning: 'with' will become a reserved keyword in Python 2.6</span><img src ="http://www.blogjava.net/rain1102/aggbug/278185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-05-27 13:33 <a href="http://www.blogjava.net/rain1102/archive/2009/05/27/278185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python非贪婪、多行匹配正则表达式例子[转载]</title><link>http://www.blogjava.net/rain1102/archive/2009/05/26/278107.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 26 May 2009 14:42:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/05/26/278107.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/278107.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/05/26/278107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/278107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/278107.html</trackback:ping><description><![CDATA[<p>一些<strong>re</strong>gular的tips：</p>
<p>1 <strong>非贪婪flag</strong></p>
<div class="hl-surround">
<div class="hl-main"><span style="color: gray">&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">a(</span><span style="color: navy">\d</span><span style="color: red">+?)</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[</span><span style="color: #8b0000">'</span><span style="color: red">2</span><span style="color: #8b0000">'</span><span style="color: olive">]</span><span style="color: gray"><br />
&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">a(</span><span style="color: navy">\d</span><span style="color: red">+)</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[</span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: olive">]</span></div>
</div>
<p>注意比较这种情况：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: gray">&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">a(</span><span style="color: navy">\d</span><span style="color: red">+)b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[</span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: olive">]</span><span style="color: gray"><br />
&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">a(</span><span style="color: navy">\d</span><span style="color: red">+?)b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[</span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: olive">]</span></div>
</div>
<p>2 <strong>如果你要多行匹配，那么加上<strong>re</strong>.S和<strong>re</strong>.M标志</strong><br />
<strong>re</strong>.S：.将会匹配换行符，默认.不会匹配换行符</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: gray">&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">a(</span><span style="color: navy">\d</span><span style="color: red">+)b.+a(</span><span style="color: navy">\d</span><span style="color: red">+)b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: navy">\n</span><span style="color: red">a34b</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[]</span><span style="color: gray"><br />
&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">a(</span><span style="color: navy">\d</span><span style="color: red">+)b.+a(</span><span style="color: navy">\d</span><span style="color: red">+)b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: navy">\n</span><span style="color: red">a34b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">S</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[(</span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: gray">, </span><span style="color: #8b0000">'</span><span style="color: red">34</span><span style="color: #8b0000">'</span><span style="color: olive">)]</span><span style="color: gray"><br />
&gt;&gt;&gt;</span></div>
</div>
<p><strong>re</strong>.M：^$标志将会匹配每一行，默认^和$只会匹配第一行</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: gray">&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">^a(</span><span style="color: navy">\d</span><span style="color: red">+)b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: navy">\n</span><span style="color: red">a34b</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[</span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: olive">]</span><span style="color: gray"><br />
&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">^a(</span><span style="color: navy">\d</span><span style="color: red">+)b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: navy">\n</span><span style="color: red">a34b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">M</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[</span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: gray">, </span><span style="color: #8b0000">'</span><span style="color: red">34</span><span style="color: #8b0000">'</span><span style="color: olive">]</span></div>
</div>
<p>但是，如果没有^标志，</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: gray">&gt;&gt;&gt; </span><span style="color: blue">re</span><span style="color: gray">.</span><span style="color: blue">findall</span><span style="color: olive">(</span><span style="color: blue">r</span><span style="color: #8b0000">"</span><span style="color: red">a(</span><span style="color: navy">\d</span><span style="color: red">+)b</span><span style="color: #8b0000">"</span><span style="color: gray">, </span><span style="color: #8b0000">"</span><span style="color: red">a23b</span><span style="color: navy">\n</span><span style="color: red">a23b</span><span style="color: #8b0000">"</span><span style="color: olive">)</span><span style="color: gray"><br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: olive">[</span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: gray">, </span><span style="color: #8b0000">'</span><span style="color: red">23</span><span style="color: #8b0000">'</span><span style="color: olive">]</span></div>
</div>
<p>可见，是无需<strong>re</strong>.M<br />
<br />
原文地址:http://www.juyimeng.com/python-multi-line-non-greedy-regular-expression-sample.html</p><img src ="http://www.blogjava.net/rain1102/aggbug/278107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-05-26 22:42 <a href="http://www.blogjava.net/rain1102/archive/2009/05/26/278107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Python正则表达式从文章中取出所有图片路径</title><link>http://www.blogjava.net/rain1102/archive/2009/05/26/278090.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Tue, 26 May 2009 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/05/26/278090.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/278090.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/05/26/278090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/278090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/278090.html</trackback:ping><description><![CDATA[<p>import re</p>
<p>name = '''you test this is for mae &lt;img src="/upload/images/123455.jpg"/&gt;, test for you just liook &lt;img src="/upload/images/1test455.jpg"/&gt;'''<br />
<span style="color: #008000">result = re.findall('&lt;img src="(.*?)"/&gt;', name, re.S)</span><br />
print result</p>
<br />
<br />
结果为:<br />
['/upload/images/123455.jpg', '/upload/images/1test455.jpg'] <br />
<span style="color: gray"><span style="color: #8b0000"><span style="color: olive"><br />
当然如何你的img标签和src属性之间还有其他属性, 则你也可以直接取src, 如:<br />
<span style="color: #008000">result = re.findall('src="(.*?)"/&gt;', name, re.S)</span><br />
</span></span></span><img src ="http://www.blogjava.net/rain1102/aggbug/278090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-05-26 21:15 <a href="http://www.blogjava.net/rain1102/archive/2009/05/26/278090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pygments, markdown和textile</title><link>http://www.blogjava.net/rain1102/archive/2009/04/29/268235.html</link><dc:creator>周锐</dc:creator><author>周锐</author><pubDate>Wed, 29 Apr 2009 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2009/04/29/268235.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/268235.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2009/04/29/268235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/268235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/268235.html</trackback:ping><description><![CDATA[<p>这三个东西在很多python web程序需要的模块，都是对文本进行格式化。<br />
pygments</p>
<p>用作格式化高亮代码的</p>
<p><br />
python-markdown<br />
</p>
<p><br />
提供类似wiki格式的格式化功能（mark text转html）<br />
http://www.freewisdom.org/projects/python-markdown/<br />
<br />
markdown的帮助文档：<br />
http://www.unix-center.net/moodle/help.php?file=markdown.html <br />
http://daringfireball.net/projects/markdown/basics</p>
<p>python-textile</p>
<p><br />
Textile is an XHTML generator that uses a simple markup, similar to the one you can find on most wikis. </p>
<p>This is a Python module that implements a parser and generator that supports the Textile markup syntax. </p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/rain1102/aggbug/268235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">周锐</a> 2009-04-29 21:18 <a href="http://www.blogjava.net/rain1102/archive/2009/04/29/268235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>