Python修饰器的函数式编程
Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西。虽然好像,他们要干的事都很相似——都是想要对一个已有的模块做一些“修饰工作”,所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去。但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条(Decorator Pattern)里的UML图和那些代码,这就是我在《 从面向对象的设计模式看软件设计》“餐后甜点”一节中说的,OO鼓励了——“厚重地胶合和复杂层次”,也是《 如此理解面向对象编程》中所说的“OO的狂热者们非常害怕处理数据”,Decorator Pattern搞出来的代码简直就是OO的反面教程。
Python 的 Decorator在使用上和Java/C#的Annotation很相似,就是在方法名前面加一个@XXX注解来为这个方法装饰一些东西。但是,Java/C# ...
函数式编程
当我们说起函数式编程来说,我们会看到如下函数式编程的长相:
函数式编程的三大特性:
immutable data 不可变数据:像Clojure一样,默认上变量是不可变的,如果你要改变变量,你需要把变量copy出去修改。这样一来,可以让你的程序少很多Bug。因为,程序中的状态不好维护,在并发的时候更不好维护。(你可以试想一下如果你的程序有个复杂的状态,当以后别人改你代码的时候,是很容易出bug的,在并行中这样的问题就更多了)
first class functions:这个技术可以让你的函数就像变量一样来使用。也就是说,你的函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数。这个有点像Javascript的Prototype(参看Javascript的面向对象编程)
尾递归优化:我们知道递归的害处,那就是如果递归很深的话,stack受不了,并会导致性能大幅度下降。所以,我们使用尾递归优化技术——每次递归时都会重用stack,这样一来能够提升性能,当然,这需要语言或编译器的支持。Python就不支持。
函数式编程的几个技 ...
Python 和 PyGame 的一些示例
看到一个网页收集了很多使用Python和PyGame写游戏的示例,分享给大家。(注:我不知道用Python/PyGame写游戏其性能会怎么样,但是一些小游戏应该是没有问题的)
这个网页同时给了一本介绍Python和PyGame的电子书(PDF),下面的这些例子就是这本书的示例。所有的这些示例可以打包下载。
目录
基础 Python 示例
Pygame 图形示例
Pygame 示例
游戏示例
创建一个安装包
搜索和排序示例
文件示例
其它信息
基础 Python 示例
if_statement_examples.py – if 语句的一个简单示例
for_loop_examples.py – for 语句的一个简单示例.
while_loop_examples.py – while 语句的一个简单示例
Pygame 图形示例
pygame_base_template.py – 开启一个黑的 pygame 窗口。当你要写一个新的代码时,你可以使用这个示例的代码初始化你 ...
在Javascript里写Python
以前,本站介绍过去一种写HTML和CSS的新方法,以一种杂交式的代码,昨天给大家介绍了.NET代码和Python及Ruby代码的互相转换工具,但是这个世界可能比我们想像的还疯狂。IronPython 是一个在.NET平台上运行Python的东西,就像那些在JVM上运行其它语言的东东一样。当然,IronPython最邪恶的事情并不是在.NET上运行Python,而是在Javascript里写Python的语法。这个畸形混血儿的网址在这里(请注意翻墙)。
使用这个玩意很简单,下面,让我们看看这个混血儿长啥样?
首先,你需要链接一个js文件:
<script src="http://gestalt.ironpython.net/dlr-latest.js" type="text/javascript"></script>
然后,让我们看看如何写一个按钮事件:
<input id="button" type="button" value="Say, Hello!" />
<script type="text/python">
def b ...
Python处理encoding的小技巧
用Python写过处理文本经常会遇到需要decoding或者encoding, 尤其是处理中文的时候。
encoding的问题处理起来是个脏活儿,报错不太容易看懂,网上相关资料不太好查。有同感?请继续读下去。
常规做法是读取文件的时候立刻decode, 所有的处理工作都用unicode,写会文件的时候encode. 但是等到读取的时候在处理的代码读/写起来都很别扭,感觉像穿上鞋以后袜子滑下来了…Python 3.1.1以上的版本解决了该问题。在Python 3.1.1中,打开文件可以加入encoding的参数:
file = open(filename, encoding='xxx')
啊,这样看起来终于舒坦了。 不同写如下的code了
file = open(filename)
for line in file:
decoded_line = line.decode('xxx')
do something else
提倡使用utf8
Python程序员的进化
以前本站发布过一篇《程序员的进化》,以一种幽默的代码展现方式调侃了程序。下面这篇是关于Python程序员的。以阶乘为例,很有意思。
目录
新手程序员
第一年的刚学完Pascal的新手
第一年的刚学完C语言的新手
第一年刚学完SICP的新手
第一年刚学完Python的新手
爱偷懒的程序员
更懒的 Python 程序员
Python 专家
Python 黑客
专家级程序员
英语系的专家级程序员
Web 设计者
Unix 程序员
Windows 程序员
公司里的程序员
新手程序员
def factorial(x):
if x == 0:
return 1
else:
return x * ...
如何使用Python操作摄像头
用过USB摄像头的都知道,你需要使用鼠标来操作它,比如截个图,录个像什么的,要点N次鼠标,对于我们那些不喜欢多次点击鼠标的人来说,这是一件很boring的事情,所以,本文将教你如何使用Python来操作摄像头。
这里,我们需要三个Python库: VideoCapture, PIL 和 pygame。使用这三个库你可以非常容易的编写一个摄像头程序。之所以使用pygame,其目的就是因为这个库可以处理视频帧(fps)。下面是代码:
from VideoCapture import Device
import ImageDraw, sys, pygame, time
from pygame.locals import *
from PIL import ImageEnhance
res = (640,480)
pygame.init()
cam = Device()
cam.setResolution(res[0],res[1])
screen = pygame.display.set_mode((640,480))
pygame.display.set_caption(' ...
非常简单的Python HTTP服务
如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等。那么, Python 可能帮助你。使用Python可以完成一个简单的内建 HTTP 服务器。于是,你可以把你的目录和文件都以HTTP的方式展示出来。佻只需要干一件事情,那就是安装一个Python。
实际上来说,这是一个可以用来共享文件的非常有用的方式。实现一个微型的HTTP服务程序来说是很简单的事情,在Python下,只需要一个命令行。下面是这个命令行:(假设我们需要共享我们的目录 /home/haoel 而IP地址是192.168.1.1)
$ cd /home/haoel
$ python -m SimpleHTTPServer
这就行了,而我们的HTTP服务在8000号端口上侦听。你会得到下面的信息:
Serving HTTP on 0.0.0.0 port 8000 ...
你可以打开你的浏览器(IE或Firefox),然后输入下面的URL:
http://192.168.1.1:8000
如果你的目录下有一个叫 index.html 的文件名的文件 ...
Python也Spring了
没想到啊,Python也有Spring的框架了,看看SpringPython项目主页(http://springpython.webfactional.com/)。这个项目的Leader是这样说的:Spring Python是基于Java的Spring框架(Spring Framework)和Spring安全(Spring Security)的一个分支,它以Python语言为目标。Spring提供了许多有用的特征功能,同样地这些特征功能在Python下也应当有效。– Greg Turnquist
从这个项目的主页可以看到有下面这些Key features:
反转控制IoC
面向方面的编程(AOPAspect-oriented Programming)
数据库访问 (Data Access)
事务管理 (Transaction Management)
安全性 (Security)
远程分布式 (Remoting)
插件/命令行工具 (Plug-ins/command-line tool)  ...
Python 自然语言处理
推荐一本免费的在线电子书,《用Python进行自然语言处理》, 用NLP 工具包(开源免费,Python)来进行文本分析。特别适合初学计算语言学的学生。好像没有好的中文切词。当然,免不了需要提一下 Dan Jurafsky 教授,大家可以搜索一下,找找他的讲义。
简要翻译一下提纲:
(书的主站点:http://www.nltk.org/)
序言
用Python进行语言处理
使用文本语料库和辞典资源
处理原始文本
结构化变成
词语的分类和标签
学习文本分类
从文本中信息抽取
分析句法结构
创建基于特征的语法
分析句子的意思
管理语言学数据
后记:直面语言带来的挑战
Natural Language Processing with Python
— Analyzing Text with the Natural Language Toolkit
Steven Bird, Ewan Klein, and Edward Loper
0. Preface (extras)
1. Language Processin ...
某Python实现的尾部递归
mailper 在2009年4月26的文章里《Guido认为程序员大多数工作不需要递归》谈及递归不是编程的基础。并且在python中并没有实现尾部递归Tail Recurssion。
但是,今天我们却看见了某Python实现的尾部递归
:)
Guido认为程序员大多数工作不需要递归
Python的创造者Guido在最近一篇关于为什么Python里没有 Tail Recurssion Elimination (暂译:尾递归优化)的文章中提到一个我们可能经常听到的观点“真正的程序员一般不用递归”。
http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html
Third, I don’t believe in recursion as the basis of all programming. This is a fundamental belief of certain computer scientists, especially those who love Scheme and like to teach programming by starting with a “cons” cell and recursion. But to me, seeing recursion as the basis of everything else is just a nice the ...
用Python写NCurses UI
Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以:
可以使用整个屏幕
创建和管理一个窗口
使用8种不同的彩色
为您的程序提供鼠标支持
使用键盘上的功能键
Ncurses可以在任何遵循ANSI/POSIX标准的Unix/Linux系统上运行,除此之外,它还可以从系统数据库中检测终端的属性,,并且自动进行调整,提供一个不受终端约束的接口。因此,Ncurses可以在不同的系统平台和不同的终端上工作的非常好。
mc工具集就是一个用ncurses写的很好的例子,而且在终端上系统核心配置的界面同样是用ncurses编写的. 下面就是它们的截图:
当然,在我们这篇文章中,我们不会教你怎么写NCurses程序,我们只是想告诉你如何用Python来写Ncurses的程序,示例会非常简单,点到为止。
在此之前,我们先简单的回顾一下如何使用Python的一些简单的语法。
先看看一个最简单的Python程序:
print "How easy is this?"
x = 1
y = 2
z = x + y
print "Result of x + ...
Python调用C语言函数
使用Python的ctypes,我们可以直接调用由C直接编译出来的函数。其实就是调用动态链接库中的函数。为什么我们需要这样做呢,因为有些时候,我们可能需要一个性能上比较讲究的算法,有些时候,我们可以在Python中使用已经有了的现成的被封闭在动态链接库中的函数。下面是如何调用的示例。
首先,我们用一个乘法来表示一个算法功能。下面是C的程序:
int
multiply(int num1, int num2)
{
return num1 * num2;
}
如果在Windows下,你可能需要写成下面这个样子:
#include <windows.h>
BOOL APIENTRY
DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
__declspec(dllexport) int
multiply(int num1, int num2)
{
return ...
一个显示排序过程的Python脚本
之前向大家介绍过《一个排序算法比较的网站》,那个网站用动画演示了各种排序算法,并分析了各种排序算法。这里,要向大家推荐一个Python脚本,其可以把排序的过程给显示出来。
下图是“冒泡排序”的一个示例,其中:
折线表示了各个元素的位置变化。
折线的深浅表示了元素的大小。越深则越大。
同样,还有其它一些排序算法的图片:
堆排序(Heap Sort)
选择排序(Selection)
快速排序(Quick)
Shell排序
插入排序(Insertion)
你可以使用如下的Python代码来制作这些图片:(需要 Cairo图片库支持)
Python排序脚本
这个脚本参数如下:
-a 表示使用什么样的算法,取值为"quick", "heap", "selection", "insertion", "bubble", "shell"。
-n 表示要排序的数据个数。
-f 表示输入文件。
-p 表示文件前缀。
-d 表示输出顺序。
-x 图片宽度。
-y 图片高度。
-l 所有线的宽度。
-b 边界宽度。
使用示例如下:
./visualise.py ...
Python处理中文的时候的一些小技巧
相信第一次处理中文的朋友们可能都会对中文的encoding 和程序的报错很头疼。
如果你像我一样希望能够把事情尽快做好而不去深究,你可能会写一些异常处理的代码把 UnicodeEncodingError糊弄过去先,但当你开始怀疑有多少encoding出错的信息被你丢弃的时候,可能你会很惊奇。于是,你还是会想坐下来,(洗把脸)然后面对自己必须弄懂什么是utf-8,什么是 ‘gb2312’, 什么是 ‘gbk’ 和其中的猫腻。正如有时候猛撕小伤口上邦迪胶布的快感一样,有时候当你认真面对一些你平时一直回避的问题的时候(其实有时候需要的不是勇气), 你反而会觉得“不过如此”,并且能够一劳永逸的解决问题。
关于Python处理Unicode,我所能找到的最言简意赅的入门教程是:
Unicode In Python, Completely Demystified (揭秘Python Unicode)
简要罗列一下最重要最实用的点:
Solution
Decode early (尽早decode, 将文件中的内容转化成 unicode 再进行下一步处理)
Unicode eve ...
Python中实现多属性排序
我们有一组记录:
list_records =
(
(department, name, salary),
(department, name, salary),
...
(department, name, salary)
)
然后我们想进行类似 MS – Excel 里的 “then sort by” 中的功能一样先基于department排序,然后再在部门内按照salary排序。
其他编程语言可能相对复杂,我这里写出一个用Python实现的最简方法(也许有比这个还短的,来挑战吧)
list_records.sort(
key = lambda l: (l[0], l[2])
)
这个就是函数是编程的好处,可以无中生有的构造出一个没有名字的inline函数。假设我们有另外一个dictionary_age 是保存的 { name: ages }, 我们还可以简单的实现基于外部属性进行排序。例如,如果我们想先按照部门排序,然后在部门里按照年龄排序,我们可以写:
list_record.sort(
key = lambda l:( l[0], dictionary_age ...
【引文】如何用Python往Google Spreadsheet上写数据
现代企业里,数据决定着方向,人们都想随时看到各种报表。很多项目可能都需要dashboard一类的工作,把分散的数据变成一些能随时查看实时数据的图表,这个工作有两个环节:
把数据汇集起来,放入CSV或者数据库
一个服务器端的程序能够读到这写数据,根据需要生成在线的图表 (离线的也可以,那样每次人们想看这些图的时候都会来麻烦你,如果你在度假,他们会想敲开你的电脑)
第一步可以通过定期跑些脚本完成,但是第二步有时候就不太容易了,如果你希望你的图表能够让所有人方便随时查看,最方便的给出一个URL能让人随时访问,Google的在线文档可以提供一个简单的解决方案。
但是,如何将数据自动弄到在Google spreadsheet 上呢?手动的copy/paste是一个方法,但是很费人工,最简单的方法就是写个脚本把这个流程自动化。如何将数据写进Spreadsheet (在线表单)呢?请参考下文:
Write to a Google Spreadsheet from a Python script
注:这是个搜索方面比较大拿的Googler的博客。