Python的startswith和endswith

做文本处理的时候经常要判断一个文本有没有以一个子串开始,或者结束。Python为此提供了两个函数:

S.startswith(prefix[, start[, end]]) -> bool

如果字符串`S以prefix开始,返回True,否则返回Falsestartend是两个可以缺省的参数。分别是开始比较的位置和结束比较的位置。这个函数也可以写成S[start:end].startswith(prefix)`。

S.endswith(suffix[, start[, end]]) -> bool

如果字符串Ssuffix结束,返回True,否者返回False。与startswith类似,这个函数也可以写成S[start:end].endswith(suffix)startend仍然是从左数起。

Python的这两个函数有个特别的地方——它的prefixsuffix参数不仅可以是字符串,还都可以是一个元组。只要其中一个成立,就返回True,也就是一种“或”的关系。比如:

if filename.endswith((".gif", ".jpg", ".tiff")):
    print "%s是一个图片文件"%filename

上面两行代码根据文件扩展名是否是gifjpgtiff之一来决定文件是不是图片文件。这个代码也可以写成:

if filename.endswith(".gif") or filename.endswith(".jpg") \
        or filename.endswith(".tiff"):
    print "%s是一个图片文件"%filename

不过这样比较麻烦。值得注意的是,不熟悉Python的朋友可能会忘了元组周围的括号。

类型:Python,创建时间:Dec. 31, 2011, 1:16 a.m. 点击查看完整内容。。。
百年语言(转载)

Paul Graham 2003年4月

(本文出自2003年Python大会上的一篇主题讲话)

很难预测人们的生活在一百年后会是什么样子,我们只能给很少的事物一个确切的预测。我们知道到那时候每个人都将驾驶气垫轿车,地方法规将对建造上百层的高楼无所制约,大部分时间都将日月无光,女人们都将精通武术(martial arts)……在这里,让我们把这幅图景的一个细节放大来看看:那时候人们用什么编程语言来写那些气垫轿车的控制软件呢?

这是一个值得思考的问题,其意义不在于我们一定要用这种语言,而是在于据此我们可以选择可能发展成那种语言的语言——如果我们够幸运的话。

类型:Python,创建时间:Dec. 30, 2011, 7:08 p.m. 点击查看完整内容。。。
两年不重装系统的秘诀

以前写的一些东西。。主要是我使用电脑的习惯。老是中毒重装电脑的可以看一下。

类型:随感,创建时间:Dec. 30, 2011, 7:07 p.m. 点击查看完整内容。。。
Python的exit函数

在2.5版本之前的Python,输入exit或者quit会得到这样一条说明:

>>> exit
'Use Ctrl-D (i.e. EOF) to exit.'

尝试着输入exit()或者quit(),python报错。

>>> exit()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: "str" object is not callable

很多新手都碰到这个问题。似乎exitquit的存在只是为了告诉别人不要用exitquit。这可真是奇怪的逻辑。

新版本的Python改了这种做法。输入exit()quit()就如我们所料地退出了Python。这也意味着很多情况下我们不用再导入sys这个模块了

Python2.5之前的程序:

>>> import sys
>>> sys.exit()

现在:

>>> exit()

不过需要注意的事,脚本里面并不能应用exit()函数。它只存在于解释器内。这个改动主要是为了方便*nix程序员的使用。Windows程序员都喜欢直接关闭窗口吧。

类型:Python,创建时间:Dec. 31, 2011, 1:03 a.m. 点击查看完整内容。。。
Python的条件运算符

长期以来Python世界的人一直在争论是否应该拥有条件运算符。它可以用来处理根据条件返回不同的值。比如:

if contition:
    x=true_value
else:
    x=false_value

他们虽然讨论了很久,但是一直没什么结果。在python-dev邮件列表和comp.lang.python新闻主上甚至为此举行了一次投票。最后的结果是大家都同意应该添加条件运算符,可是它的语法形式是什么还是没有结果。主要的争论是C语言的cond ? true_v : false_vif cond then true_v else false_v到底挑哪个好。

最终,Guido van Rossum(Python语言的作者)挑了这样一个令人意想不到的语法形式:

true_value if condition else false_value

它的意义是:如果condition为真,计算并返回true_value,并跳过false_value的计算,否则计算并返回false_value。它完全等价于完整形式。

这个表达式的优先级是最低的,但是它优于=号。因此以下这两种形式是一样的

level = 1 if logging else 0
level = (1 if logging else 0)

不过笔者认为后一种形式看起来比较好一点,而且可以免去记忆运算符优先级的麻烦。

类型:Python,创建时间:Dec. 30, 2011, 6:59 p.m. 点击查看完整内容。。。
Python的日志系统

如果使用Python写一个比较大型的程序,你一定会用上日志系统。特别是Python这样的动态语言,很多错误都只能在运行的时候才能发现,一个好的日志系统对于Python程序相当重要。最简单的解决方案当然是直接使用print输出运行信息。但是这样太简单了,没有分级功能,如果在发布的时候想去掉调试用的运行信息还得找出所有的print语句进行修改。再者,print只能输出到控制台,想要输出到文件或者通过电子邮件发送到其他地方,一个print语句就没办法解决了。

通过使用Python的日志系统,就可以解决以上问题。

本文介绍了logging模块的简单使用,以及如何设置日志的输出格式、输出方式和过滤器。logging模块不止可以在屏幕上打印出日志信息,还可以将信息保存在文件,或者发到网络上,或者保存到linux/windows的系统日志里面。点击文章标题就可以阅读更多信息。

类型:Python,创建时间:Dec. 31, 2011, 12:56 a.m. 点击查看完整内容。。。
Java的闭包与final关键字

Java下的闭包(Closure):

public static Runnable outter_func(){
    final String param=System.getenv("PATH");
    Runnable r=new Runnable(){
        public void run(){
            System.out.println(param);
        }
    };
    return r;
}

r.run();

这是在Java里面使用“闭包”的一个例子。run()相当于Python里的__call__()。可以看到在run()方法里可以使用外层函数的变量。这是怎么做到的呢?答案是,Java在编译的时候做了手脚。r这个类其实还有一个隐藏的属性叫做“var$param”,在run()里面所有的param被Java编译器偷偷替换成var$param。此外在r实例化完成后,Java还调用了:

r.var$param=param

假设param不是使用final修饰的变量,当param指向了另外一个对象的时候,r.var$paramparam就不是相同的了,这就会产生了语义上的问题。因此,闭包绑定的本地变量必须使用final修饰。

类型:Java,创建时间:Dec. 31, 2011, 12:25 a.m. 点击查看完整内容。。。
使用Python开发应用时字符编码很麻烦

最近开发了一个命令行的Python程序,在Windows下和终端编码设置为zh_CN.GBK的Linux控制台下运行都会出现乱码问题。查看了一下代码,主要是因为我使用了raw_input()输入的字符被我使用socket直接发送到了Java平台进行处理。这个在发送的时候进行一下处理倒也不是很难得事,不过还要取得当前操作系统的字符编码设置,然后在每个输入的位置进行转码,很麻烦。而这样的事本应该由编程语言帮我们解决的。幸好Python3K已经在这方面做得不错了。

IT业存在着太多的分歧,整个软件业在这一方面浪费了很多力量。多种语言、多种平台、多种字符集。可以说软件业无时无刻都在和这些“不一样”做斗争。不知道有没有人统计一下这种浪费所占的百分比?

类型:Python,创建时间:Dec. 31, 2011, 12:21 a.m. 点击查看完整内容。。。
Linux最近终于有了走向联合的趋势,很好

最近的两个新闻:

显示了Linux阵营正在走向联合,而不是像以前Ubuntu那样的分裂。同时,Linux阵营正在组建越来越多的标准化组织,比如标准化桌面。我觉得这是一件非常好的事。Linux想要发展,这是必由的道路。相信到最后,各个Linux发行版之间会只剩下界面方面的细微差别,软件开发真正编译一次,到处运行

类型:LinuxApp,创建时间:Dec. 31, 2011, 12:21 a.m. 点击查看完整内容。。。
电子证书在现实世界的使用,以及CXF如何支持SSL.

这是一篇很长的文章。首先介绍了SSL的概况,解释一些基本的概念。然后又介绍了SSL的基础——非对称加密技术。短短的篇幅结束以后,就以一个现实世界的例子开始我们的安全之旅。

如果你碰到这些问题,看看这篇文章一定值。

  1. 怎么样制作一份自己的电子证书。
  2. 怎么样使用openssl以及Java的keytool工具来制作电子证书。
  3. 制作电子证书太麻烦,本文提供了一Python脚本,以向导的方式制作电子证书。
  4. 如何配置Tomcat,让它支持TLS,也就是https协议。
  5. Web Service客户端使用电子证书来验证服务器的身份。
  6. Web Service客户端提交电子证书,让服务器也可以验证客户端的身份。
  7. 吊销客户端的电子证书。禁止CXF客户端访问服务器。
类型:Java,创建时间:Dec. 30, 2011, 6:14 p.m. 点击查看完整内容。。。
cxf开发实践(服务器)

本文介绍使用CFX开发一个WebService服务器的几个基本步骤。

  1. 安装CFX
  2. 像平常一样开发一个供本地代码调用的Java类。
  3. 通过添加JAX-WS将这个Java类变成一个WebService服务
  4. 使用java2wsdl工具生成WSDL文件。
  5. 使用wsdl2java工具生成客户端代码
  6. 配置服务运行环境
  7. 测试客户端代码
类型:Java,创建时间:Dec. 30, 2011, 12:39 p.m. 点击查看完整内容。。。
关于NTFS

NTFS是自Windows NT之后微软操作系统所使用的文件系统。和FAT相比,NTFS更安全。一者NTFS有类似于UNIX系统的ACL,其控制选项甚至比UNIX的多一些。二者NTFS分区比较不怕掉电,对于错误的恢复能力比较强.

本文介绍了几个NTFS的实用技巧。另外介绍了如何用convert命令把FAT分区转换成NTFS分区。

类型:随感,创建时间:Dec. 30, 2011, 5:22 p.m. 点击查看完整内容。。。