﻿<?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-Snowdream-随笔分类-Scripting</title><link>http://www.blogjava.net/zellux/category/21872.html</link><description>迷茫的大二：读书 思考 等待</description><language>zh-cn</language><lastBuildDate>Tue, 13 May 2008 00:38:47 GMT</lastBuildDate><pubDate>Tue, 13 May 2008 00:38:47 GMT</pubDate><ttl>60</ttl><item><title>将VIM Calender中的日记发布到blogger.com的脚本</title><link>http://www.blogjava.net/zellux/archive/2008/05/12/200093.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 12 May 2008 14:04:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/05/12/200093.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/200093.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/05/12/200093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/200093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/200093.html</trackback:ping><description><![CDATA[VIM Calender是个很好用的写日记的插件(<a href="http://www.vim.org/scripts/script.php?script_id=52">http://www.vim.org/scripts/script.php?script_id=52</a>)<br /><br />水木上的rmrf写了一个同步VIM Calender和Google Calender的脚本(<a href="http://code.google.com/p/diaryvgc/downloads/list">http://code.google.com/p/diaryvgc/downloads/list</a>)<br /><br />想到blogger.com支持通过发送邮件发布日志，于是我也写了个把VIM Calender中的日记发布到blogger.com的脚本。<br /><br />这个脚本把发布情况记录在diary/poster.log中，以后每次执行只会发布最新的日志，同时考虑到当天的日记可能会被修改（blogger.com似乎不支持通过email修改日志），所以当天的日记不会被发布。<br /><br />使用的时候修改开头几行的配置信息即可<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%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">#</span><span style="COLOR: #008000">!/usr/bin/python</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000"> A script for posting diaries created by VIM Calender to blogger.com</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span><span style="COLOR: #008000"> Author: Wang Yuanxuan &lt;zellux@gmail.com&gt;</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> smtplib, os, re, datetime<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> email.mime.text </span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> MIMEText<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />fromaddr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000"><a href="mailto:xxxxx@fudan.edu.cn'">xxxxx</a></span><span style="COLOR: #800000">@fudan.edu.cn</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />toaddr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000"><a href="mailto:xxxx.xxxx@blogger.com'">xxxx</a></span><span style="COLOR: #800000">.xxxx@blogger.com</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />smtpserver </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">mail.fudan.edu.cn</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />diarydir </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">/home/user_name/diary</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />username </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'xxxxxx'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />password </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'xxxxxx'</span><span style="COLOR: #800000"></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />logpath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> diarydir </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">/poster.log</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000"> PostMail(title, content):<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    msg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> MIMEText(content </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">\r\n#end\r\n</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    msg[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">Subject</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> title<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    msg[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">From</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> fromaddr<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    msg[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">To</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> toaddr<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    server </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> smtplib.SMTP(smtpserver)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    server.login(username, password)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">#</span><span style="COLOR: #008000"> server.set_debuglevel(1)</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    server.sendmail(fromaddr, [toaddr], msg.as_string())<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    server.quit()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">#</span><span style="COLOR: #008000"> Load log file. Create a new one if not exist.</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">posted </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> []<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> os.path.isfile(logpath):<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    temp </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> open(logpath, </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">r</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    posted </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> [line[:</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">] </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> line </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> temp.readlines()]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    log </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> open(logpath, </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">a</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">A new poster log has been created at </span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> logpath<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    log </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> open(logpath, </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">w</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />pattern </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> r</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">(\d{4})/(\d{1,2})/(\d{1,2}).cal$</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />scanner </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> re.compile(pattern)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (top, dirname, filenames) </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> os.walk(diarydir):<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> filename </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> filenames:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        fullpath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> os.path.join(top, filename)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> scanner.search(fullpath):<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            (year, month, day) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> scanner.search(fullpath).groups()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            filedate </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> datetime.date(int(year), int(month), int(day))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            title </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> filedate.isoformat()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> filedate </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> datetime.date.today():<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> fullpath </span><span style="COLOR: #0000ff">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> posted:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                log.write(fullpath </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">\n</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                text </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> open(fullpath).read()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                PostMail(title, text)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">print</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">The diary </span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> title </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000"> has been posted</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log.close()<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.blogjava.net/zellux/aggbug/200093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-05-12 22:04 <a href="http://www.blogjava.net/zellux/archive/2008/05/12/200093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]True closure in Python</title><link>http://www.blogjava.net/zellux/archive/2008/02/11/179611.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 11 Feb 2008 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/11/179611.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/179611.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/11/179611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/179611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/179611.html</trackback:ping><description><![CDATA[发现自己对Python的语法的兴趣远比对使用Python本身的兴趣浓厚得多<br />
为什么水木上的帖子每行末尾都是用空格填充的，每次转载还要先放到vim里面处理一下。。。<br />
<br />
by ilovecpp<br />
<br />
<p>让Python支持true closure有多难？<br />
只需修改11行代码。</p>
<p>如果你不知道什么是true closure，这里简单解释一下。Python支持lexicalscope：</p>
<p>&gt;&gt;&gt; def add_n(n):<br />
...&nbsp;&nbsp;&nbsp;&nbsp; def f(m):<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n+m<br />
...&nbsp;&nbsp;&nbsp;&nbsp; return f<br />
&gt;&gt;&gt; add_2 = add_n(2)<br />
&gt;&gt;&gt; add_2(0)<br />
2<br />
&gt;&gt;&gt; add_2(2)<br />
4</p>
<p>f引用了外层函数add_n的局部变量n。有趣的是，f引用n的时候，add_n已经结束，n似乎不存在了。f所以能正常工作，是因为创建它的时候就把n作为f的上下文(closure)保存了下来，并不随add_n结束而消失。<br />
但是，Python的lexical scope和Scheme/Smalltalk/Ruby还有一点区别：不能在内层函数中rebind外层函数的局部变量。<br />
&gt;&gt;&gt; def f():<br />
...&nbsp;&nbsp;&nbsp;&nbsp; def g():<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n=1<br />
...&nbsp;&nbsp;&nbsp;&nbsp; n=0<br />
...&nbsp;&nbsp;&nbsp;&nbsp; g()<br />
...&nbsp;&nbsp;&nbsp;&nbsp; return n<br />
...<br />
&gt;&gt;&gt; f()<br />
0</p>
<p>这是因为Python没有变量声明， n=1 自动使n成为g的局部变量，也就无法rebind f中的n了。可以说Python的closure是只读的。如果你听到有人说"Python不支持true closure"，就是指这个。其实，Python VM能够支持true closure。因为，Python支持内层函数看见外层函数的name rebinding:</p>
<p>&gt;&gt;&gt; def f():<br />
...&nbsp;&nbsp;&nbsp;&nbsp; def g():<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield n<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yield n<br />
...&nbsp;&nbsp;&nbsp;&nbsp; x = g()<br />
...&nbsp;&nbsp;&nbsp;&nbsp; n = 0<br />
...&nbsp;&nbsp;&nbsp;&nbsp; print x.next()<br />
...&nbsp;&nbsp;&nbsp;&nbsp; n = 1<br />
...&nbsp;&nbsp;&nbsp;&nbsp; print x.next()<br />
...<br />
&gt;&gt;&gt; f()<br />
0<br />
1</p>
<p>对于Python的closure实现(flat closure)，"外层函数rebind name"和"内层函数rebind name"其实没有区别。我们知道用global关键字可以rebind module scopename。如果增加一个类似的outer关键字，就可以支持rebind outer scope name。真正的限制是Guido不愿意为支持true closure增加关键字。</p>
<p>也可以不增加关键字，而是把global n的语义改为"如果outer scope定义了n，rebind outer scope n；否则rebind module scope n"。简单起见，我没有修改Python的built-in compiler，而是修改了compiler module(用Python实现的Python compiler)。你只需把下面这个patch打到compiler/symbols.py(Python 2.5.1)就可以体验true closure了：</p>
<p>C:\Python\Lib&gt;diff -u compiler/symbols.py.orig compiler/symbols.py<br />
--- compiler/symbols.py.orig&nbsp;&nbsp;&nbsp; Thu Aug 17 10:28:56 2006<br />
+++ compiler/symbols.py Mon Feb 11 12:03:01 2008<br />
@@ -21,6 +21,7 @@<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.params = {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.frees = {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.cells = {}<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.outers = {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.children = []<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # nested is true if the class could contain free variables,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # i.e. if it is nested within another function.<br />
@@ -54,8 +55,10 @@<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.params.has_key(name):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise SyntaxError, "%s in %s is global and parameter" % \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (name, self.name)<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.globals[name] = 1<br />
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.module.add_def(name)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.nested:<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.outers[name] = 1<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.globals[name] = 1</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; def add_param(self, name):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = self.mangle(name)<br />
@@ -90,6 +93,8 @@<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.globals.has_key(name):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SC_GLOBAL<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.outers.has_key(name):<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SC_FREE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.cells.has_key(name):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SC_CELL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.defs.has_key(name):<br />
@@ -107,6 +112,7 @@<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free = {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free.update(self.frees)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free.update(self.outers)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for name in self.uses.keys():<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not (self.defs.has_key(name) or<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.globals.has_key(name)):<br />
@@ -134,6 +140,9 @@<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.globals[name] = 1<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.outers.has_key(name):<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.module.add_def(name)<br />
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del self.outers[name]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.frees.has_key(name):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del self.frees[name]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for child in self.children:</p>
<p>因为我们没有修改built-in compiler，所以程序要写在字符串里，用compiler.compile编译，用exec执行：<br />
&gt;&gt;&gt; from compiler import compile<br />
&gt;&gt;&gt; s = '''<br />
... def counter():<br />
...&nbsp;&nbsp;&nbsp;&nbsp; n = 0<br />
...&nbsp;&nbsp;&nbsp;&nbsp; def inc():<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global n<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n += 1<br />
...&nbsp;&nbsp;&nbsp;&nbsp; def dec():<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; global n<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n -= 1<br />
...&nbsp;&nbsp;&nbsp;&nbsp; def get():<br />
...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n<br />
...&nbsp;&nbsp;&nbsp;&nbsp; return inc, dec, get<br />
... '''<br />
&gt;&gt;&gt; exec compile(s, '', 'exec')<br />
&gt;&gt;&gt; inc, dec, get = counter()<br />
&gt;&gt;&gt; get()<br />
0<br />
&gt;&gt;&gt; inc()<br />
&gt;&gt;&gt; get()<br />
1<br />
&gt;&gt;&gt; dec()<br />
&gt;&gt;&gt; get()<br />
0</p>
<p>后记</p>
<p>1 搞这个东西的缘起是Selfless Python(http://www.voidspace.org.uk/python/weblog/arch_d7_2006_12_16.shtml#e583)。很有趣的bytecode hack，给一个类中的所有函数补上self参数。既然PythonVM支持true closure，能不能用类似的手法让Python支持true closure呢？不过很快就明白这个在bytecode层面不好弄，还是得修改编译器。不过改起来还真是出乎意料地简单。</p>
<p>2 Guido早已明确表示不能改变global的语义（因为会影响现有代码），所以这个只是玩玩而已，不用指望成为现实。当然你可以只发布bytecode，大概还能把反编译器搞挂掉。:-)<br />
3 我可以理解Guido的决定。除非你之前一直在用Scheme，否则我觉得像上面counter例子那种一组共享状态的函数还是写成class为好，至少共享状态是什么一目了然。Lexical scope太implicit，用在开头add_n那种地方挺方便，再复杂就不好了。</p>
<p>又：很抱歉"幕后的故事"拖了这么久。写起来才发现自己还是不懂descriptor。<br />
不过我肯定不会让它烂尾的。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zellux/aggbug/179611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-11 16:18 <a href="http://www.blogjava.net/zellux/archive/2008/02/11/179611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Python的for循环中计数</title><link>http://www.blogjava.net/zellux/archive/2007/12/25/170396.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 25 Dec 2007 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/12/25/170396.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/170396.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/12/25/170396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/170396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/170396.html</trackback:ping><description><![CDATA[<p>利用enumerate<br />
<br />
for i, obj in enumerate(list):<br />
&nbsp;&nbsp;&nbsp;&nbsp;print i, obj</p>
<p>Help on class enumerate in module __builtin__:</p>
<p>class enumerate(object)<br />
&nbsp;|&nbsp; enumerate(iterable) -&gt; iterator for index, value of iterable<br />
&nbsp;|<br />
&nbsp;|&nbsp; Return an enumerate object.&nbsp; iterable must be an other object that supports<br />
&nbsp;|&nbsp; iteration.&nbsp; The enumerate object yields pairs containing a count (from<br />
&nbsp;|&nbsp; zero) and a value yielded by the iterable argument.&nbsp; enumerate is useful<br />
&nbsp;|&nbsp; for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ...<br />
&nbsp;|<br />
&nbsp;|&nbsp; Methods defined here:<br />
&nbsp;|<br />
&nbsp;|&nbsp; __getattribute__(...)<br />
&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x.__getattribute__('name') &lt;==&gt; x.name<br />
&nbsp;|<br />
&nbsp;|&nbsp; __iter__(...)<br />
&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x.__iter__() &lt;==&gt; iter(x)<br />
&nbsp;|<br />
&nbsp;|&nbsp; next(...)<br />
&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x.next() -&gt; the next value, or raise StopIteration<br />
&nbsp;|<br />
&nbsp;|&nbsp; ----------------------------------------------------------------------<br />
&nbsp;|&nbsp; Data and other attributes defined here:<br />
&nbsp;|<br />
&nbsp;|&nbsp; __new__ = &lt;built-in method __new__ of type object at 0xb7f35d20&gt;<br />
&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T.__new__(S, ...) -&gt; a new object with type S, a subtype of T<br />
</p>
<img src ="http://www.blogjava.net/zellux/aggbug/170396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-12-25 21:29 <a href="http://www.blogjava.net/zellux/archive/2007/12/25/170396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python中Dictionary类型的排序</title><link>http://www.blogjava.net/zellux/archive/2007/12/04/165260.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 04 Dec 2007 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/12/04/165260.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/165260.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/12/04/165260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/165260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/165260.html</trackback:ping><description><![CDATA[lambda真是王道啊<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">#</span><span style="color: #008000">!/usr/bin/env&nbsp;python</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">d</span><span style="color: #000000">=</span><span style="color: #000000">{</span><span style="color: #800000">'</span><span style="color: #800000">a</span><span style="color: #800000">'</span><span style="color: #000000">:</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #800000">'</span><span style="color: #800000">b</span><span style="color: #800000">'</span><span style="color: #000000">:</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #800000">'</span><span style="color: #800000">c</span><span style="color: #800000">'</span><span style="color: #000000">:</span><span style="color: #000000">4</span><span style="color: #000000">}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">print</span><span style="color: #000000">&nbsp;sorted(d.items(),&nbsp;key</span><span style="color: #000000">=</span><span style="color: #0000ff">lambda</span><span style="color: #000000">&nbsp;(k,v):&nbsp;(v,k))</span></div>
<br />
<p>Help on built-in function sorted in module __builtin__:</p>
<p>sorted(...)<br />
&nbsp;&nbsp;&nbsp; sorted(iterable, cmp=None, key=None, reverse=False) --&gt; new sorted list</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zellux/aggbug/165260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-12-04 18:48 <a href="http://www.blogjava.net/zellux/archive/2007/12/04/165260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转载】Python 中的函数式编程 (1)</title><link>http://www.blogjava.net/zellux/archive/2007/11/23/162699.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Fri, 23 Nov 2007 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/23/162699.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/162699.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/23/162699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/162699.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/162699.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;from IBM developerWorks&nbsp; 原文的代码部分很乱，整理了一下Although users usually think of Python as a procedural and object-oriented language, it actually contains everything you need for a completely func...&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/11/23/162699.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/162699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-23 21:15 <a href="http://www.blogjava.net/zellux/archive/2007/11/23/162699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>texttable - module for creating simple ASCII tables</title><link>http://www.blogjava.net/zellux/archive/2007/09/10/144122.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 10 Sep 2007 15:40:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/10/144122.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/144122.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/10/144122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/144122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/144122.html</trackback:ping><description><![CDATA[<span style="font-family: Courier;">
<a href="http://jefke.free.fr/soft/texttable/" target="_blank">http://jefke.free.fr/soft/texttable/</a><br />
dl: &nbsp;<a href="http://jefke.free.fr/soft/texttable/texttable.py" target="_blank">http://jefke.free.fr/soft/texttable/texttable.py</a><br />
NAME<br />
&nbsp;&nbsp; &nbsp;texttable - module for creating simple ASCII tables<br />
FILE<br />
&nbsp;&nbsp; &nbsp;/usr/lib/python2.3/site-packages/texttable.py<br />
DESCRIPTION<br />
&nbsp;&nbsp; &nbsp;Example:<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;table = Texttable()<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;table.header(["Name", "Age"])<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;table.set_cols_align(["l", "r"])<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;table.add_row(["Xavier\nHuon", 32])<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;table.add_row(["Baptiste\nClement", 1])<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;table.draw()<br />
&nbsp;&nbsp; &nbsp;Result:<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;+----------+-----+<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; Name &nbsp; | Age |<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;+==========+=====+<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;| Xavier &nbsp; | &nbsp;32 |<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;| Huon &nbsp; &nbsp; | &nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;+----------+-----+<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;| Baptiste | &nbsp; 1 |<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;| Clement &nbsp;| &nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;+----------+-----+<br />
CLASSES<br />
&nbsp;&nbsp; &nbsp;exceptions.Exception<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ArraySizeError<br />
&nbsp;&nbsp; &nbsp;Texttable<br />
&nbsp;&nbsp; &nbsp;class ArraySizeError(exceptions.Exception)<br />
&nbsp;&nbsp; &nbsp; | &nbsp;Exception raised when specified rows don't fit the required size<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;Methods defined here:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;__init__(self, msg)<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;__str__(self)<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;----------------------------------------------------------------------<br />
&nbsp;&nbsp; &nbsp; | &nbsp;Methods inherited from exceptions.Exception:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;__getitem__(...)<br />
&nbsp;&nbsp; &nbsp;class Texttable<br />
&nbsp;&nbsp; &nbsp; | &nbsp;Methods defined here:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;__init__(self, max_width=80)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Constructor<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;- max_width is an integer, specifying the maximum width of the t<br />
able<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;- if set to 0, size is unlimited, therefore cells won't be wrapp<br />
ed<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;add_row(self, array)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Add a row in the rows stack<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Cells can contain newlines.<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;draw(self)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Draw the table<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;header(self, array)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Specify the header of the table<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;reset(self)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Reset the instance:<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;- reset rows and header<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;set_chars(self, array)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Set the characters used to draw lines between rows and<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;columns.<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;The array should contain 4 fields:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[horizontal, vertical, corner, header]<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Default is set to:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;['-', '|', '+', '=']<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;set_cols_align(self, array)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Set the desired columns alignment<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;The elements of the array should be either "l", "c" or "r"<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; - "l": column flushed left<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; - "c": column centered<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; - "r": column flushed right<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;set_cols_width(self, array)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Set the desired columns width<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;The elements of the array should be integers, specifying the<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;width of each column. For example:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [10, 20, 5]<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;set_deco(self, deco)<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Set the table decoration. 'deco' can be a combinaison of:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Texttable.BORDER: Border around the table<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Texttable.HEADER: Horizontal line below the header<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Texttable.HLINES: Horizontal lines between rows<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Texttable.VLINES: Vertical lines between columns<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;Example:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Texttable.BORDER | Texttable.HEADER<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;All of them are enabled by default.<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;--------------------------------------------------------------------<br />
--<br />
&nbsp;&nbsp; &nbsp; | &nbsp;Data and other attributes defined here:<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;BORDER = 1<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;HEADER = 4<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;HLINES = 8<br />
&nbsp;&nbsp; &nbsp; |<br />
&nbsp;&nbsp; &nbsp; | &nbsp;VLINES = 16<br />
DATA<br />
&nbsp;&nbsp; &nbsp;__all__ = ['Texttable', 'ArraySizeError']<br />
&nbsp;&nbsp; &nbsp;__author__ = 'Gerome Fournier &lt;jefke(at)free.fr&gt;'<br />
&nbsp;&nbsp; &nbsp;__credits__ = 'Jeff Kowalczyk:\n &nbsp; &nbsp;- textwrap improved import\n &nbsp; &nbsp;- ..<br />
.<br />
&nbsp;&nbsp; &nbsp;__license__ = 'GPL'<br />
&nbsp;&nbsp; &nbsp;__revision__ = '$Id: texttable.py,v 1.3 2003/10/05 13:53:39 jef Exp je..<br />
.<br />
&nbsp;&nbsp; &nbsp;__version__ = '0.3'<br />
VERSION<br />
&nbsp;&nbsp; &nbsp;0.3<br />
AUTHOR<br />
&nbsp;&nbsp; &nbsp;Gerome Fournier &lt;jefke(at)free.fr&gt;<br />
CREDITS<br />
&nbsp;&nbsp; &nbsp;Jeff Kowalczyk:<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;- textwrap improved import<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;- comment concerning header output<br />
</span>
<img src ="http://www.blogjava.net/zellux/aggbug/144122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-10 23:40 <a href="http://www.blogjava.net/zellux/archive/2007/09/10/144122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>燕曦版友信息统计脚本</title><link>http://www.blogjava.net/zellux/archive/2007/09/10/143943.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 10 Sep 2007 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/09/10/143943.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/143943.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/09/10/143943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/143943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/143943.html</trackback:ping><description><![CDATA[connector.py<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;urllib,&nbsp;urllib2,&nbsp;cookielib<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyConnector:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">__init__</span><span style="color: #000000">(self):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">pass</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;login(self,&nbsp;url):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cookie&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cookielib.CookieJar()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;urllib2.install_opener(opener)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib.urlencode({</span><span style="color: #800000">'</span><span style="color: #800000">id</span><span style="color: #800000">'</span><span style="color: #000000">:&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">guest</span><span style="color: #800000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">passwd</span><span style="color: #800000">'</span><span style="color: #000000">:&nbsp;</span><span style="color: #800000">''</span><span style="color: #000000">})<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sock&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib2.urlopen(url,&nbsp;str)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;getHTML(self,&nbsp;url):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sock&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;urllib2.urlopen(url)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;self.sock.read()</span></div>
<br />
yanxiparser.py<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;sgmllib&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;SGMLParser<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;re<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;YanxiURLParser(SGMLParser):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;reset(self):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SGMLParser.reset(self)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;start_a(self,&nbsp;attrs):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(k,&nbsp;v)&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;attrs:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(k&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">href</span><span style="color: #800000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">and</span><span style="color: #000000">&nbsp;(v.find(</span><span style="color: #800000">'</span><span style="color: #800000">bbsanc</span><span style="color: #800000">'</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;0)):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.result.append(v)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;YanxiHTMLParser:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;parse(self,&nbsp;html):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ufrom&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ubirth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ufav&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">''</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;html.replace(r</span><span style="color: #800000">'</span><span style="color: #800000">&amp;nbsp;</span><span style="color: #800000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;html.replace(r</span><span style="color: #800000">'</span><span style="color: #800000">&lt;br&nbsp;/&gt;</span><span style="color: #800000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">''</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">\xbe\xcd\xca\xc7(.*)\xc0\xb2</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matchObject&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;re.search(pattern,&nbsp;html)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matchObject.group(</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;uid.strip()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">\xc0\xb4\xd7\xd4(.*)\xa3(\xac|xa1)</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matchObject&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;re.search(pattern,&nbsp;html)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ufrom&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matchObject.group(</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ufrom&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ufrom.strip()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">\xcf\xb2\xbb\xb6(.*)\n</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matchObject&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;re.search(pattern,&nbsp;html)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ufav&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matchObject.group(</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ufav&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ufav.strip()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">\n(.*)\xca\xc7\xce\xd2\xb5\xc4\xc9\xfa\xc8\xd5</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matchObject&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;re.search(pattern,&nbsp;html)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ubirth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matchObject.group(</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ubirth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ubirth.strip()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;{</span><span style="color: #800000">"</span><span style="color: #800000">id</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;:&nbsp;uid,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">from</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;:&nbsp;ufrom,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">birth</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;:&nbsp;ubirth,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">fav</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;:&nbsp;ufav}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
runner.py<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;connector&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;MyConnector<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;yanxiparser&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />rootURL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">http://yanxibbs.cn</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />loginURL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">http://yanxibbs.cn/bbslogin.php</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />url1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">http://yanxibbs.cn/cgi-bin/bbs/bbs0an?path=%2Fgroups%2FGROUP%5F3%2F06SS%2Fbyxx%2Fbjcy</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />url2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #800000">http://yanxibbs.cn/cgi-bin/bbs/bbs0an?path=%2Fgroups%2FGROUP%5F3%2F06SS%2Fbyxx%2Fbjyr</span><span style="color: #800000">'</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MyConnector()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />conn.login(loginURL)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;printInfo(url):<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;html&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.getHTML(url)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;urlParser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;YanxiURLParser()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;htmlParser&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;YanxiHTMLParser()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;urlParser.feed(html)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;targetURL&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;urlParser.result:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.getHTML(rootURL&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;targetURL)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;htmlParser.parse(html)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&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">%(id)s\t%(from)s\t%(birth)s\t%(fav)s</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;info<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />printInfo(url1)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />printInfo(url2)</span></div>
<img src ="http://www.blogjava.net/zellux/aggbug/143943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-09-10 12:27 <a href="http://www.blogjava.net/zellux/archive/2007/09/10/143943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 学习笔记 - XML 解析</title><link>http://www.blogjava.net/zellux/archive/2007/08/18/137832.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 18 Aug 2007 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/18/137832.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/137832.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/18/137832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/137832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/137832.html</trackback:ping><description><![CDATA[1. 貌似和dive into python中的有一定的差异，可能是版本的关系(python 2.2 - 2.5)<br>minidom.parse("binary.xml")得到的对象是binary.xml的整棵dom树，它的第一个结点包含了DOCTYPE的相关信息，对于它的字节点的firstNode，貌似一般都是空的。<br><br>2. unicode 相关<br>string.encode()<br>sys.getdefaultencoding()<br>指定.py文件编码的方法：<br>在每个文件开头加入编码声明<br># -*- coding: UTF-8 -*-<br><br>3. python目录的lib/site-packages/sitecustomize.py是一个特殊的脚本，Python会在启动的时候导入它。<br><br>4. 搜索元素：<br>getElementByTagName()<br>返回的是一个list<br><br>5. 元素属性<br>attributes 是一个xml.dom.minidom.NameNodeMap实例，常用的方法如keys() values()，同时也有__getitem__方法，类似于dictionary<br><br><img src ="http://www.blogjava.net/zellux/aggbug/137832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-18 16:33 <a href="http://www.blogjava.net/zellux/archive/2007/08/18/137832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 学习 - File and Directory</title><link>http://www.blogjava.net/zellux/archive/2007/08/15/137066.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 15 Aug 2007 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/15/137066.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/137066.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/15/137066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/137066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/137066.html</trackback:ping><description><![CDATA[<p>1. 几个常用对象：<br>os.system&nbsp; 执行命令<br>sys.stdin&nbsp; sys.stdout<br>os.path.getsize&nbsp;&nbsp; 获得文件大小<br>os.path.isdir<br>os.mkdir<br>os.listdir<br></p>
<p>2. walk()函数<br>很好用的一个函数<br>os.path.walk(rootdir, f, arg)<br>rootdir是要访问的目录树的根，f是用户定义的函数，arg是调用f时用的一个参数。<br>对于每一个"walk"过程中遇到的目录directory，设该目录下的文件列表为filelist，walk函数会调用<br>f(arg, directory, filelist)<br></p>
<img src ="http://www.blogjava.net/zellux/aggbug/137066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-15 22:34 <a href="http://www.blogjava.net/zellux/archive/2007/08/15/137066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 学习笔记 (5)</title><link>http://www.blogjava.net/zellux/archive/2007/08/15/136540.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 14 Aug 2007 16:07:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/15/136540.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/136540.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/15/136540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/136540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/136540.html</trackback:ping><description><![CDATA[<p>1. 交换x和y的值&nbsp; [x, y] = [y, x]<br><br>2. zip()方法把几个lists的第i个元素合成一个tuple，放在一个新的list中。<br>zip(seq1 [, seq2 [...]]) -&gt; [(seq1[0], seq2[0] ...), (...)]<br></p>
<p><strong>函数式编程相关</strong></p>
<p>1.&nbsp; Mapping<br>map() 方法对序列中的每个元素调用某个函数，返回新生成的结果序列。<br>有点类似于Ruby的Array.each do | element |<br>&gt;&gt;&gt; z = map(len, ["abc", "clounds", "rain"])<br>&gt;&gt;&gt; z<br>[3, 6, 4]<br></p>
<p>2. Filtering<br>过滤掉满足条件的元素，类似与Array.reject do | element |<br>&gt;&gt;&gt; x = [5,12,-2,13]<br>&gt;&gt;&gt; y = filter(lambda z: z &gt; 0, x)<br>&gt;&gt;&gt; y<br>[5, 12, 13]<br></p>
<p>3. List Comprehension<br>来个复杂的例子<br>&gt;&gt;&gt; y<br>[[0, 2, 22], [1, 5, 12], [2, 3, 33]]<br>&gt;&gt;&gt; [a for b in y for a in b[1:]]<br>[2, 22, 5, 12, 3, 33]<br></p>
<p>4. Reduction<br>先看示例<br>&gt;&gt;&gt; x = reduce(lambda x,y: x+y, range(5))<br>&gt;&gt;&gt; x<br>10<br>执行的顺序是：首先调用函数处理range(5)前两个值，0 + 1 = 1，然后返回的值1作为x，继续与range(5)的第三个值(2，作为y)。<br>最后的结果是0+1+2+3+4的值<br>这个常用来代替for循环</p>
<img src ="http://www.blogjava.net/zellux/aggbug/136540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-15 00:07 <a href="http://www.blogjava.net/zellux/archive/2007/08/15/136540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Python写了个URP查分程序</title><link>http://www.blogjava.net/zellux/archive/2007/08/03/134316.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Fri, 03 Aug 2007 11:50:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/03/134316.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/134316.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/03/134316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/134316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/134316.html</trackback:ping><description><![CDATA[将两个文件放在同一目录中，修改gpa.sh中的账号密码，并用chmod设置为可执行，运行即可。<br>写得不怎么样，像URPParser里处理标签的时候直接输出了，很不规范，不过懒得改了<img src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emsmilep.gif" align="absmiddle" border="0"><br>urpparser.py:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;sgmllib&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;SGMLParser<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;URPParser(SGMLParser):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;reset(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tdOpen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.colCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.firstRow&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.pieces&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SGMLParser.reset(self)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;start_td(self,&nbsp;attrs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"""</span><span style="color: #800000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;When&nbsp;encountered&nbsp;with&nbsp;tag&nbsp;td,&nbsp;check&nbsp;whether&nbsp;there's<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;align&nbsp;property&nbsp;in&nbsp;the&nbsp;tag,&nbsp;which&nbsp;will&nbsp;distinguish<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;score&nbsp;table&nbsp;from&nbsp;others.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"""</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(k,&nbsp;v)&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;attrs:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(k&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">align</span><span style="color: #800000;">"</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tdOpen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;end_td(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tdOpen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;handle_data(self,&nbsp;text):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(self.tdOpen&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;0):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(len(text.strip())&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;0):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.colCount&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(self.colCount&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.colCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.firstRow&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(self.firstRow):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(self.colCount&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">\t</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;text.strip(),</span><span style="color: #800000;">"</span><span style="color: #800000;">\t</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br></span></div>
<br>gpa.sh:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">!/usr/bin/python</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;urllib,&nbsp;cookielib,&nbsp;urllib2<br><br>loginURL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">http://fdis.fudan.edu.cn:58080/amserver/UI/Login?</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">goto=http%3A%2F%2Fwww.urp.fudan.edu.cn%3A84%2Feps</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">tar%2Fapp%2Ffudan%2FframeSub.jsp%3FaffairNO%3D035067</span><span style="color: #800000;">"</span><span style="color: #000000;"><br>scoreURL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">http://www.urp.fudan.edu.cn:84/epstar/app/fudan/S</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">coreManger/ScoreViewer/Student/Course.jsp</span><span style="color: #800000;">"</span><span style="color: #000000;"><br>logoutURL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">http://www.urp.fudan.edu.cn/logout.jsp</span><span style="color: #800000;">"</span><span style="color: #000000;"><br><br>cookie&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cookielib.CookieJar()<br>opener&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))<br>urllib2.install_opener(opener)<br>str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlencode({</span><span style="color: #800000;">'</span><span style="color: #800000;">Login.Token1</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">06301000000</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">Login.Token2</span><span style="color: #800000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">yourpassword</span><span style="color: #800000;">"</span><span style="color: #000000;">})<br>sock1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib2.urlopen(loginURL,&nbsp;str)<br>loginHTML&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sock1.read()<br>sock1.close()<br><br>sock2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib2.urlopen(scoreURL)<br>scoreHTML&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sock2.read()<br>sock2.close()<br><br>sock3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib2.urlopen(logoutURL)<br>sock3.close()<br><br></span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;urpparser&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;URPParser<br>parser&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;URPParser()<br>parser.feed(scoreHTML)<br></span><span style="color: #0000ff;">print</span><span style="color: #000000;"><br><br></span></div>
<br><br><img src ="http://www.blogjava.net/zellux/aggbug/134316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-03 19:50 <a href="http://www.blogjava.net/zellux/archive/2007/08/03/134316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 学习笔记 (4)</title><link>http://www.blogjava.net/zellux/archive/2007/08/02/133886.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 01 Aug 2007 16:30:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/08/02/133886.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/133886.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/08/02/133886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/133886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/133886.html</trackback:ping><description><![CDATA[1.基于dictionary的字符串格式化<br>&gt;&gt;&gt; params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} <br>&gt;&gt;&gt; "%(pwd)s" % params<br>'secret'<br>这个东西的用处在于和locals的搭配使用，比如样例程序中<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;handle_comment(self,&nbsp;text):<br>&nbsp;&nbsp;&nbsp;&nbsp;self.pieces.append(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">&lt;!--%(text)s--&gt;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;locals())&nbsp;</span></div>
<p>就读取了text变量的内容。<br>不过这样和直接用text变量有什么区别呢？貌似"&lt;!--%s--&gt;" % text也可以啊<br>水木上问了一下，得到的答案是<br><span style="COLOR: #0000ff">发信人: Essien5 (宝贝晶~), 信区: Python<br>标 &nbsp;题: Re: 关于locals()的用处<br>发信站: 水木社区 (Thu Aug &nbsp;2 11:16:37 2007), 转信<br><br>好处就是多个变量是代码很好维护，一一对应<br>'%s%s.......%s'%(a,b,c,d,....,z)<br>'%(a)s%(b)s......%(z)s'%locals()<br>第一种写法前面的%s和后面的变量很难对应起来，bug的源泉<br>后一个就非常直观了<br>而且要往中间再随便插变量也方便</span><br><br>2. 自己的类继承了SGMLParser后，需要对特殊标记处理，可以以start_或do_开始命名相关函数。<br>可以这样做的原因在于python的自醒机制(introspection) </p>
<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">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">def</span><span style="COLOR: #000000">&nbsp;finish_starttag(self,&nbsp;tag,&nbsp;attrs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;getattr(self,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">start_</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;tag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">except</span><span style="COLOR: #000000">&nbsp;AttributeError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;getattr(self,&nbsp;</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">do_</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;tag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">except</span><span style="COLOR: #000000">&nbsp;AttributeError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.unknown_starttag(tag,&nbsp;attrs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle_starttag(tag,&nbsp;method,&nbsp;attrs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.stack.append(tag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.handle_starttag(tag,&nbsp;method,&nbsp;attrs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br></span></div>
程序首先尝试获得start_tagname的方法，如果失败则继续尝试获得do_tagname，如果仍然不能找到，则调用unknown_starttag方法。<br>感觉这和Java的反射机制很相似，例如Javabean中的getter setter方法，也是通过特殊命名的形式让其他对象了解自己的。<br><br>3. import 语句可以写在任何地方。<br>
<img src ="http://www.blogjava.net/zellux/aggbug/133886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-08-02 00:30 <a href="http://www.blogjava.net/zellux/archive/2007/08/02/133886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 学习笔记 (3)</title><link>http://www.blogjava.net/zellux/archive/2007/07/10/129284.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 10 Jul 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/07/10/129284.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/129284.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/07/10/129284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/129284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/129284.html</trackback:ping><description><![CDATA[1.<br>由于Python的判断语句返回值的特殊性，and-or语句可以达到类似三元运算符的效果。<br>bool ? a : b<br>可以写成<br>bool and a or b<br><br>2.<br>print None 不会输出任何信息<br>需要显示None，要使用print str(None)
<br><img src ="http://www.blogjava.net/zellux/aggbug/129284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-07-10 11:00 <a href="http://www.blogjava.net/zellux/archive/2007/07/10/129284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]Ruby两本书读后感</title><link>http://www.blogjava.net/zellux/archive/2007/06/16/124684.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 16 Jun 2007 11:54:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/06/16/124684.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/124684.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/06/16/124684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/124684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/124684.html</trackback:ping><description><![CDATA[<p><a href="http://www.aurora-x.net/blog/oasis/?p=92">http://www.aurora-x.net/blog/oasis/?p=92</a><br>by opengl@rygh<br><br>现在市面上系统的，由浅及深的讲Ruby的书凤毛麟角，这本是分量最重的一本。原书第二版出版到现在也过去两年了，国内刚刚在这个月由博文引进电工发行了译本。<br><a id=more-92></a><br>800+页的大部头，一半是核心库和标准库的参考，另外一半分为三个部分——基础、环境、高级。这其中我觉得比较有价值的部分在于&#8220;高级这一块&#8221;有助于让你从一个更高的层次来理解和掌握这门语言，这一部分也是需要经常参考的部分。</p>
<p>就国内目前引进的唯一一本算是讲Ruby的书，要从这本书开始学习Ruby估计会吓跑不少潜在用户。作者是大牛没错，不过教学则是另一回事了（大家都应有体会，本科上课的时候课讲的最好的老师通常都不是学术最牛的老师）。缺点有两处很明显：</p>
<p>第一是自顶向下，它的顺序是这样的：</p>
<p>对象和类&#8211;&gt;容器、集合&#8211;&gt;标准类型&#8211;&gt;表达式&#8211;&gt;异常和模块&#8211;&gt;基本输入输出</p>
<p>一个从上降到低又陡然上升的过程。作者自己也说在第一版里这样的效果并不好，因此在第二版里特意增加了一个介绍性章节，粗略的先把所有东西列给读者看一遍。虽然起到些作用，但是实际效果我想对于初学者来说仍然不会太好。C++/Java的书我都读过不少，也没见哪个是一上来就把Class/Object这些东西甩给读者的，总是从基本类型、控制语句过渡。除非你已经对OO这套相当熟悉了，否则上来这个门槛就能把一堆新手挡在门外。</p>
<p>接下来的，谈不上十分晦涩，但也不是什么读来轻快的内容，关键是作者给的例子较少，使得象块、迭代这些特色难以掌握。再有一点，ruby的语法风格有相当部分还保留有Perl的痕迹，而Perl是出了名的以奇怪符号著称于世，这些符号在新手眼里不外天书，而高手们则爱不释手。</p>
<p>所以，要能比较顺利的通过这本书的入门之路，你得事先具有OO的基础，至少一门脚本语言的经验（Perl最佳），函数式编程的一些概念（否则当你看到块的一些用法时会很迷惑）。然后，可以用Ruby笨拙的写一些小程序了。</p>
<p>Ruby作为动态语言之一，它的最大特点自然是&#8220;动态&#8221;两个字，其著名的&#8220;duck typing&#8221;就是一大体现（在我看来，就像是基于接口的调用，但却并不用一个给定的接口去事先限制）。这些在高级部分里都有专门讲述，是应该重点学习的部分。</p>
<p>那么入门究竟用什么书更好？我推荐《Everyday Scripting with Ruby》这本。和《Programming Ruby》同一个出版社，今年一月份刚出了原版。它是以相当循序渐进的方式带领读者进入Ruby的世界，尤其是作者精心设计的几个Project是全书亮点（学习一门语言最好的方式还是要动手写程序）。</p>
<p>最后总结如下，首先看《Everyday》这本书，跟着书中的指导摆弄过所有的Project，并完成相应的练习。然后再看《Programmin》一书的Crystallized部分。再之后就主要是当作API参考手册了。花钱去买中文版我个人觉得不是很有必要，总共四部分中，前两部分我觉得蛮鸡肋的，第四部分在电脑上查更方便，只有第三部分有较高的价值。</p>
<img src ="http://www.blogjava.net/zellux/aggbug/124684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-06-16 19:54 <a href="http://www.blogjava.net/zellux/archive/2007/06/16/124684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby 学习笔记 (2)</title><link>http://www.blogjava.net/zellux/archive/2007/06/16/124681.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sat, 16 Jun 2007 11:30:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/06/16/124681.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/124681.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/06/16/124681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/124681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/124681.html</trackback:ping><description><![CDATA[
<p>1. Array#reject 方法遍历一个集合的每个元素，并把符合条件的元素删去。<br/>例如去掉数组中的所有素数<br/>nums = nums.reject do | num |<br/>prime?(num)<br/>end<br/>puts nums<br/></p>
<p>2. String#chomp 方法<br/>str.chomp(separator=$/) =&gt; new_str<br/>Returns a new +String+ with the given record separator removed from<br/>the end of _str_ (if present). If +$/+ has not been changed from<br/>the default Ruby record separator, then +chomp+ also removes<br/>carriage return characters (that is it will remove +\n+, +\r+, and<br/>+\r\n+).</p>
<p>"hello".chomp #=&gt; "hello"<br/>"hello\n".chomp #=&gt; "hello"<br/>"hello\r\n".chomp #=&gt; "hello"<br/>"hello\n\r".chomp #=&gt; "hello\n"<br/>"hello\r".chomp #=&gt; "hello"<br/>"hello \n there".chomp #=&gt; "hello \n there"<br/>"hello".chomp("llo") #=&gt; "he"</p>
<p>3. 判断是否在命令行运行脚本<br/>if $0 == __FILE__<br/>check_usage<br/>compare_inventory_files(ARGV[0], ARGV[1])<br/>end<br/>类似于Java类的main方法，在被其他类导入时不会运行其中的代码。</p>
<p>4. Enumerable#any? 方法查找一个集合中是否有满足条件的元素<br/>irb(main):004:0&gt; deposits = [1, 0, 10000]<br/>irb(main):005:0&gt; deposits.any? do | deposit |<br/>irb(main):006:1* deposit &gt; 9999<br/>irb(main):007:1&gt; end<br/>=&gt; true</p>
<p>5. 关于测试<br/>这本书(Everyday Scripting with Ruby)的很多程序都是依循测试驱动开发的思想写出来的，测试单元中的方法通常有两种目的。<br/>一种是direct test，需要测试那个函数就直接调用那个函数，传递的参数都是直接写出来的。<br/>另一种是bootstrapping test，被测试函数的参数也是通过生成这些参数的函数生成的，即一个方法测试了多个对象。<br/>Everyone finds their own balance between testing directly and testing indirectly. You will too.</p>
<p>6. Time#strftime 方法<br/>t = Time.now<br/>t.strftime("Printed on %m/%d/%Y") #=&gt; "Printed on 04/09/2003"<br/>t.strftime("at %I:%M%p") #=&gt; "at 08:56AM"</p>
<img src ="http://www.blogjava.net/zellux/aggbug/124681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-06-16 19:30 <a href="http://www.blogjava.net/zellux/archive/2007/06/16/124681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby 入门笔记 (1)</title><link>http://www.blogjava.net/zellux/archive/2007/06/14/124303.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 14 Jun 2007 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/06/14/124303.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/124303.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/06/14/124303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/124303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/124303.html</trackback:ping><description><![CDATA[先把各种热门的东西都走马观花地看一遍，呵呵。<br>看的是Everyday Scripting with Ruby，风格和In Action系列差不多，大量的实例。<br>现在学Ruby的主要目的也是everyday scripting，方便数据处理、生成，文件批处理等，RoR之类的暂时不考虑。<br><br>1. String.inspect 方法<br>文档中的说法是<br>&nbsp;&nbsp;&nbsp;&nbsp; str.inspect&nbsp;&nbsp; =&gt; string<br><br>&nbsp;&nbsp;&nbsp;&nbsp; Returns a printable version of _str_, with special characters<br>&nbsp;&nbsp;&nbsp;&nbsp; escaped.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = "hello"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str[3] = 8<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.inspect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #=&gt; "hel\010o"<br><br>具体情况试试 myString.inspect.inspect....就能了解一点了<br><br>2. Arrays.each 和 Arrays.collect<br>for_each方法<br><br>irb(main):007:0&gt; [1, 2, 3].each do | element |<br>irb(main):008:1*&nbsp;&nbsp; puts element<br>irb(main):009:1&gt; end<br>1<br>2<br>3<br>=&gt; [1, 2, 3]<br><br>后者与前者的不同之处在于，在处理数据的同时，每次处理的返回结果都会保存到一个新的数组中返回。<br>irb(main):036:0&gt; newarray = ["aBC", "B"].collect do |e|<br>irb(main):037:1* e.downcase<br>irb(main):038:1&gt; end<br>=&gt; ["abc", "b"]<br><br>3. Messages and Methods<br>It can be hard to remember the difference between messages and methods. A message is a request sent from some sender object. When the receiver object receives the message, it looks to see whether it has a method with the same name. If so, the Ruby code within the method is run, and the results are returned to the sender. The message is the request; the method fulfills it.<br>呃，还是没有感性认识。<br><br>4. Delimiting Blocks<br>块的两种表示方式：<br>array.each do | element |<br>&nbsp;&nbsp;&nbsp; puts element<br>end<br>array.each { | element |<br>&nbsp;&nbsp;&nbsp; puts element<br>}<br>通常使用第一种，但可以用一行写成的情况也可以使用第二种：<br>array.each { | element | puts element }<br><br>
<br><img src ="http://www.blogjava.net/zellux/aggbug/124303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-06-14 14:02 <a href="http://www.blogjava.net/zellux/archive/2007/06/14/124303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 学习笔记 (2)</title><link>http://www.blogjava.net/zellux/archive/2007/05/11/116773.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Fri, 11 May 2007 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/05/11/116773.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/116773.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/05/11/116773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/116773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/116773.html</trackback:ping><description><![CDATA[<p>1. Dictionary 类型<br>1) 类似于Java中的Hashtable类，Dictionary定义了键和值的一对一的关系。<br>2) 定义：{key:value}<br>d = {"server":"Tomcat", "database":"MySQL"}<br>3) key对大小写敏感。<br>4) 可混用各种数据类型。<br>5) 删除元素 del d["server"]<br>6) 清除所有元素 d.clear()</p>
<p>2. List 类型<br>1) 定义：<br>li = ["a", "b", 1]<br>2) 下标从0开始。<br>3) 负数索引从list的尾部向前计数来存取元素，即<br>li[-n] == li[len(li) - n]<br>4) 分片(slice)<br>&gt;&gt;&gt; li = ['a', 'b', 'mpilgrim', 'z', 'example']<br>&gt;&gt;&gt; li[1:3]&nbsp;&nbsp; //从第2个元素到第3个元素<br>['b', 'mpilgrim']<br>&gt;&gt;&gt; li[1:-1]&nbsp; //从第2个元素到倒数第2个元素<br>['b', 'mpilgrim', 'z']<br>&gt;&gt;&gt; li[:3] <br>['a', 'b', 'mpilgrim']<br>&gt;&gt;&gt; li[3:]&nbsp; <br>['z', 'example']<br>&gt;&gt;&gt; li[:]<br>['a', 'b', 'mpilgrim', 'z', 'example']</p>
<p>5) 增加元素<br>a) append 末尾追加单个元素<br>b) insert 将单个元素插入某个位置<br>&gt;&gt;&gt; li<br>['a', 'b', 'mpilgrim', 'z', 'example', 'new']<br>&gt;&gt;&gt; li.insert(2, "new")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&gt;&gt;&gt; li<br>['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new']<br>c) extend 合并另一个List</p>
<p>6) 搜索<br>a) index 查找一个值的首次出现并返回索引值，如果没有找到则引发异常，与Java不同<br>b) in 操作符测试一个值是否在list内</p>
<p>7) 删除元素<br>a) remove 删除某个元素，如不存在则引发异常<br>b) pop 弹出栈顶元素，即删除最后一个值并返回该值</p>
<p>8) List运算符 真方便啊 -,=<br>&gt;&gt;&gt; li = ['a', 'b', 'mpilgrim']<br>&gt;&gt;&gt; li = li + ['example', 'new'] <br>&gt;&gt;&gt; li<br>['a', 'b', 'mpilgrim', 'example', 'new']<br>&gt;&gt;&gt; li += ['two']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&gt;&gt;&gt; li<br>['a', 'b', 'mpilgrim', 'example', 'new', 'two']<br>&gt;&gt;&gt; li = [1, 2] * 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&gt;&gt;&gt; li<br>[1, 2, 1, 2, 1, 2]<br></p>
<img src ="http://www.blogjava.net/zellux/aggbug/116773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-05-11 16:22 <a href="http://www.blogjava.net/zellux/archive/2007/05/11/116773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初学时的笔记</title><link>http://www.blogjava.net/zellux/archive/2007/05/02/114991.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 01 May 2007 17:09:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/05/02/114991.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/114991.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/05/02/114991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/114991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/114991.html</trackback:ping><description><![CDATA[2007-3-11<br><br>1.&nbsp;字符串：<br>a)&nbsp;使用三引号(&#8217;&#8217;&#8217;或&#8221;&#8221;&#8221;)用来指示多行的字符串，其中可以自由的使用单引号或双引号。<br>b)&nbsp;自然字符串：在字符串前加上r或R，表示不需要转义符特殊处理。<br>c)&nbsp;Unicode字符串：串前加u。<br>d)&nbsp;和Java一样，字符串不可变。<br>e)&nbsp;Python没有专门的char类型。<br>f)&nbsp;使用正则表示式时，建议使用自然表达式处理。<br>2.&nbsp;标识符：必须以字母或下划线起始，其他部分可以有数字，大小写敏感。<br>3.&nbsp;行：<br>a)&nbsp;每个Python程序都有一些逻辑行(logical liens)组成，后者通常由若干物理行(physical lines)组成。<br>b)&nbsp;每个物理行都可以由一条注释结束，不在字符串中的#符号表示一条注释。<br>c)&nbsp;在一个交互解释界面中，必须通过输入空行来结束多行语句。<br>d)&nbsp;; 可以用于分割一物理行中的不同逻辑行，但Python中很少出现 ;<br>e)&nbsp;转义符 \ 也可以用于行末表示在下一行继续。<br>4.&nbsp;缩进：<br>a)&nbsp;缩进对于Python中很重要，错误的缩进很有可能会引发错误。<br>b)&nbsp;同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。<br>5.&nbsp;运算<br>a)&nbsp;// 返回商的整数部分，即Java中的 \ <br>b)&nbsp;比较运算符可以被任意连结，如3&lt;5&lt;7返回True。<br>6.&nbsp;控制流<br>a)&nbsp;raw_input(&#8216;Input a number: &#8216;) 将字符串输入到屏幕上，并等待用户的输入，返回字符串。有点像Basic的input。<br>b)&nbsp;if 语句中elif相当于else if。一个简单的if语句：<br>if True:<br>&nbsp;&nbsp;&nbsp; print &#8216;It is true&#8217;<br>c)&nbsp;Python中没有switch语句，使用if-elif-else代替。<br>d)&nbsp;while, for语句中也可以有else:，注意与while, for对齐<br>e)&nbsp;for i in range(1, 5)<br>依次循环i=1, 2, 3, 4<br>range()返回一个序列的数，包括1，不包括5。另外可以再增加一个步长参数，如range(0, 4, 2)生成0和2<br>f)&nbsp;break语句跳出后，else语句不被执行。<br>7.&nbsp;函数<br>a)&nbsp;形参：函数头中声明的参数；实参：提供给函数调用的参数。<br>b)&nbsp;函数块并不会修改块外参数的值。可以使用global语句声明为全局变量，但应尽量避免。<br>c)&nbsp;默认参数值：直接在函数头中赋值。但只有在末尾的参数才可以有默认值。<br>d)&nbsp;关键参数。<br>
<img src ="http://www.blogjava.net/zellux/aggbug/114991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-05-02 01:09 <a href="http://www.blogjava.net/zellux/archive/2007/05/02/114991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>