目前使用最广泛的版本是2.7,最新稳定版本是Python 3.3.1(2013年4月6日)。Django等库开始支持Python3了,也意味着Python3将成为主流。
用过 Python的人,基本上都知道在交互式解释器中输入 import this 就会显示 Tim Peters 的 The Zen of Python。(摘自:《Python之禅》的翻译和解释,http://goo.gl/1joZU)
翻译和解释
2. Python在工作中的应用
2.1. 实例1:文件批量处理
如对文件进行批量重命名,将文件夹中所有的文件名的”scroll_1”替换为”scroll_00”。
文件批量重命名
import os
path = 'C:\\Users\\tylerzhu\\Desktop\\icon'
for file in os.listdir(path):
if os.path.isfile(os.path.join(path,file))==True:
newname = file.replace("scroll_1", "scroll_00")
os.rename(os.path.join(path,file),os.path.join(path,newname))
print(file)
2.2. 实例2:xml与excel互转
Excel转xml
Excel,info_fight_monster.xls包含3个sheet,分别表示怪物的基本信息、技能信息、奖励信息。
XML,info_fight_monster.xml包含怪物的所有信息,格式如下:
编写脚本将Excel转换为XML格式。
Excel转XML
#! /usr/bin/env python
#coding=utf-8
'''
Created on 2013-3-31
将info_fight_monster.xls转换为XML格式。转换分为以下几步:
step1: 读取xml文件,info_fight_monster.xls
step2: 解析出怪物基本信息,在base这个sheet里面,并放到一个xml文件中
step3: 解析出怪物的技能信息,并将技能信息插入到对应的xml中
step4:解析出怪物的奖励信息,并插入到对应XML中
step5:保存xml文件
@author: tylerzhu'''
from lxml import etree
import xlrd3, codecs
attrib = ["monsterSID", "classId", "type", "level", "attrib", #
"attack", "skill", "define", "speed", "strength", #
"luck", "name", "desc", "icon", "url", "frameRate"];
prize = ["monsterSID", "prizeSID", "type", "infoType", "gameID", "itemType", #
"itemSID", "num", "plusSID", "level", "name", "desc", "icon"];
skill = ["monsterSID", "skillSID", "skillLevel"];
info_fight_monster_xml = etree.ElementTree(etree.Element("data"));
def openxls():
excel = xlrd3.open_workbook("xls/info_fight_monster.xls");
base = excel.sheet_by_name("base");
monster = excel.sheet_by_name("skill");
prize = excel.sheet_by_name("prize");
return (base, monster, prize);
def buildMonsterBase(xls):
sheet = xls[0];
for row in range(1, sheet.nrows):
monsterAttr = {};
for col in range(0, sheet.ncols):
if sheet.cell(row, col).value != None and col < len(attrib):
monsterAttr[attrib[col]] = sheet.cell(row, col).value;
if type(monsterAttr[attrib[col]]) == float:
#print(str(round(monsterAttr[attrib[col]])))
monsterAttr[attrib[col]] = str(round(monsterAttr[attrib[col]]));
sub = etree.SubElement(info_fight_monster_xml.getroot(), "monster", monsterAttr);
sub.tail = "\n"
#input()
def buildMonsterSkill(xls):
sheet = xls[1];
for row in range(1, sheet.nrows):
skillAttr = {};
for col in range(1, sheet.ncols):
if sheet.cell(row, col).value != None and col < len(attrib):
skillAttr[skill[col]] = sheet.cell(row, col).value;
if type(skillAttr[skill[col]]) == float:
skillAttr[skill[col]] = str(round(skillAttr[skill[col]]));
monsterSID = str(int(sheet.cell(row, 0).value));
monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']");
monster.text = ("\n\t");
sub = etree.SubElement(monster, "skill", skillAttr);
sub.tail = "\n\t"
def buildMonsterPrize(xls):
sheet = xls[2];
for row in range(1, sheet.nrows):
prizeAttr = {};
for col in range(1, sheet.ncols):
if sheet.cell(row, col).value != None and col < len(attrib):
prizeAttr[prize[col]] = sheet.cell(row, col).value;
if type(prizeAttr[prize[col]]) == float:
prizeAttr[prize[col]] = str(round(prizeAttr[prize[col]]));
monsterSID = str(int(sheet.cell(row, 0).value));
monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']");
monster.text = ("\n\t");
sub = etree.SubElement(monster, "prize", prizeAttr);
sub.tail = "\n\t"
def build():
xls = openxls();
buildMonsterBase(xls);
buildMonsterSkill(xls);
buildMonsterPrize(xls);
#输出合并之后的配置
ouput = codecs.open('output/info_fight_monster.xml', 'w', 'utf-8');
ouput.write(etree.tounicode(info_fight_monster_xml.getroot()))
ouput.close();
if __name__ == '__main__':
build();
是不是很简单!
Xml转Excel
下面的例子将技能书info_fight_book.xml的数据转换为excel格式,例子只包含一个sheet的,如果有多个sheet同样处理即可。
XML转Excel
#! /usr/bin/env python
#encoding=utf-8
'''
Created on 2013-5-6
将技能书info_fight_book。xml转换为excel格式。
例子只包含一个sheet,如果有多个sheet同样处理。
@author: tylerzhu
'''
from lxml import etree
import xlwt3 as xlwt
#写excel标题
#。。。
wb = xlwt.Workbook()
ws = wb.add_sheet("技能书")
tree = etree.parse('../xls/info_fight_book.xml')
root = tree.getroot()
row = 0
col = 0
for item in root:
if len(item.attrib) == 0:
continue
row = row + 1
col = 0
for attr in item.attrib:
ws.write(row, col, item.attrib[attr])
col = col + 1
wb.save('../output/技能书.xls')
2.3. 总结
通过上面例子,发现Python代码有以下特点:
1)第一行是特殊形式的注释:它被称作 组织行 ——源文件的头两个字符是#!,后面跟着一个程序。这行告诉你的Linux/Unix系统当你 执行 你的程序的时候,它应该运行哪个解释器。建议使用这种形式——#!/usr/bin/env python,而不是——#!/usr/bin/python。
2) 缩进很重要。Python使用缩进而不是一对花括号来划分语句块。
3) 文档字符串,__doc__,没多大用。但是一个好的Python程序,应该要有文档字符串,且一般遵循:“文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。”
4) python中引入模块后(import)首先就要执行模块的主块,当然模块中可能全是函数。如果要避免使用模块名称:from 模块名 import 符号名,那麽使用该符号名就不用使用模块名+点号+符号名,但是不推荐,容易造成程序不容易读,而且容易出错(特别是在python简洁而简单的语法的基础上)import... as ...起一个别名
5) 模块的__name__属性,相当有用,解决了import的缺点,可以实现如果不是运行的本模块而被调用,不调用主块
6) 如果你已经厌烦了java、c++的读写文件,那么python会让你重新喜欢上文件读写,python主张解决问题的方案越少越好,写文件就一个f = file(name, 'w'),f.write(...)读文件也一样,f = file(name),f.read或readline,最后close
l ……
3. 为什么选择Python?
3.1. 前途!钱途!
上面那截图只是2玩笑而已:-)。不管怎样,现在Python已经成为最受欢迎的程序设计语言之一,完全不用担心这个了。
TIOBE编程语言排行榜,2007、2011两年被TIOBE编程语言排行榜评为年度语言。
PYPL(Popularity of Language Index)编程语言流行指数,它对各种语言的流行指标进行了二次发掘。在过去的十年里,Python语言获得了最大的增长幅度——十年语言之冠。
3.2. 开发效率极高
据说豆瓣开发只用了3个月时间就上线了。开发效率高,有以下几方面原因。
丰富的内置类型及相关操作
1)String:字符串放在单引号、双引号、三引号(多行时)中,从0开始索引,支持
查:find、index、
切片: s[0:2]、s[1:]
连接:“abc”+“ef” => “abcdef”、join
分割:split
格式化: format
。。。大小写转换、编码等操作
2) list, []:names=[“Dave”, “Mark”, “Ann”],列表从0开始索引,索引元素names[1]。列表可以包括任意类型的对象,可以嵌套。支持增、删、查、分片。
增:insert、append
删:del、remove、pop
查:search
切片: names[0:2]、[1:]
连接:[1,2,3]+[4,5] => [1,2,3,4,,5]、extend
反转:reverse
3) tuple, ():address=(“www.python.org”, 80),a = (80,)。元组语法与list相似,意义相当于枚举,可以为空,如果只含有一个元素,需要加逗号以区别于表达式(“one”, )。元组创建之后不可修改,即无法替换、删除、插入,但支持
索引:address[0] => www.python.org
切片:address[0:] => ('www.python.org', 80)
连接:(“www.python.org”,) + (80,) => ('www.python.org', 80)
host,port=address:host => www.python.org,port => 80
4) 字典: dict(), {}:address={"host":"www.python.org", "port":80},支持
索引:address[“host”] => “www.python.org”,
get:address.get("host") => “www.python.org”
键:address.keys() => ['host', 'port']
in:"host" in address =>True
删除:del address["host"] => {'port': 80}
5) 集合:set(),a=set([1,2,3,4]);一个数值集合 b=set(“hello”),一个唯一字符集合。与列表、元组不同,集合中的元素是无序的,无法通过数字索引,且元素不能重复。
并集:a|b => set([1, 2, 3, 4, 'h', 'l', 'o', 'e'])
交集:a&b => set([])
差集:a-b => set([1, 2, 3, 4]),即在a中不在b中元素
对称差集:a^b => set([1, 2, 3, 'e', 'h', 'l', 'o', 4])
add:a.add(5) => set([1, 2, 3, 4, 5]) #添加一项
update: a.update([6,7,8]) =>set([1, 2, 3, 4, 5, 6, 7, 8])#添加多项
remove: a.remove(5) =>set([1, 2, 3, 4, 6, 7, 8])#删除一项
强大的标准库
Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。
Python标准库的主要功能有:
文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
W3C格式支持,包含HTML,SGML,XML的处理。
其它功能,包括国际化支持、数学运算、HASH、Tkinter等
无所不包的第三方库
如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面。
“There are currently 30630 packages here.”—— https://pypi.python.org/pypi。
3.3. 总而言之
用下图可以表示Python的强大
4. 还有谁在用Python?
看Python在我工作中的应用,好像没什么说服力,证明不了啥。下面让我们看看有哪些大公司或有名的应用在使用Python,使用了哪些技术。
4.1. 国外
上图只是列举了部分具有典型代表的公司,要列出所有的实在太困难的,因为太多国外在使用Python了。
Python Google的三大编程语言之一
在Google,C++、Java、Python是使用率排名前三的编程语言,使用Python的开发团队也是Google的第三大研发部门。
在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。
groups.google.com,code.google.com就是运行于Python之上的。此外,Python还广泛的用于基础维护部门。Guido Van Rossum加入Google的第一个项目Google Mondrian,是一个在线的代码预览系统,基于Perforce、BigTable(back-end)以及Python(front-end)。它使用了以下Python相关技术(http://goo.gl/3f5sy):
The application is built on top of Python open source libraries such as the Django framework, smtpd.py mail service, and the wsgiref web server software。
Google雄心勃勃的云计算平台Google App Engine最早支持的Python编程语言。
YouTube主要是Python写的
Apache
l Python
l Linux(SuSe)
l MySQL
l psyco,一个动态的Python到C的编译器
l lighttpd代替Apache做视频查看
most of the lines of code for YouTube are still in Python. Everytime you watch a YouTube video you are executing a bunch of Python code.
YouTube解决问题的哲学只有一个词:简单。许多YouTube的产品最初只是源于一个简单的Python脚本。
在线视频王者YouTube的技术哲学,http://goo.gl/PHMUE,7 Years Of YouTube Scalability Lessons In 30 Minutes
Quora - Python 驱动
下面内容主要摘自并加入了自己的注释:Quora - Python 驱动,http://goo.gl/28RGq。
Quora 是使用什么语言和框架做的?
What languages and frameworks were used to code Quora?
创始人 Charlie 的回复:
后端使用 Python 语言,Pylons 框架,但是框架一半左右被自己的系统替换(LiveNode/webnode2)
前端 JavaScript 基于 jQuery
用Thrift做后端服务器之间通信(thrift最初由facebook开发,07年四月开放源码,thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。)
Comet Server 使用Tornado
hosting 主要使用 Amazon EC2, S3
目前数据库使用 MySQL,memcached 做缓存,还有两个用 C++ 写的服务一起作为 data store
版本控制用 Git
为什么 Quora 选择 Python 作为开发语言
Why did Quora choose Python for its development?. 下文只是简单整理,不是翻译。
创始人 Adam 的回复里,提到两个创始人正好都比较熟悉 Python. 另外他说明了排除其它语言的过程:
PHP 根本不考虑。Facebook 陷进去无法脱身,不代表它是目前最好的选择,由此得到的经验是编程语言的选择非常重要而且改变的代价非常大。Adam 此处给了其它几个链接,其中有指出 PHP 一大堆弱点的,也包括一个问题 "Do Facebook engineers enjoy programming in PHP?". 我很赞同 Facebook 的工程师说的,familiarity breeds contempt. 没有完美的语言,每一种语言都有长有短,当把它用到极限的时候,短处就变得很显眼并让人烦恼。我个人认为 PHP 也仍然是不差的选择。
C# - 看起来不错但是 -
他们不想把基础搭建在微软的技术平台上。SQL Server 很好,不过 Quora 需要一大堆开源软件,这些代码即使支持 .NET, 也支持得比较差。
不想冒险使用 Mono,因为不知道它能撑多久,而且据说有性能问题
Java 程序因为一些原因很容易变得更长,写起来比 Python 痛苦多了。
Scala 太新,也是一种冒险,另外虽然不像 Java 那么差,它也天生继承 JVM 的一些弱点。
Python 虽然有性能问题,但是 Quora 一些性能很关键的代码都用 C++ 写(Python 的优势,Java 做起来相对困难)。至于类型检查的缺乏,Quora 通过完善的单元测试来弥补。
Quora 另一位创始人 Charlie 加了几点:
创立 Quora 的时候,Python 有许多很好的 web framework
Python 的数据结构跟 JavaScript 映射很好,这样 CS 之间交互数据很方便
Python 代码更易读
Python 在各方面有很多成熟的 library
为什么 Quora 要用 Pylons 做开发
Why did Quora choose to develop in Pylons?. Charlie 说他们想把 Pylons 的很多东西替换成自己的,比如他们不需要模版和 ORM. 在这方面,Pylons 比 Django 之类的要好。
Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado
其他八项可以查看:http://goo.gl/nzFCy
Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado,是用 Pyhton 语言开发的实时网络服务器,它支持上万的不间断连接,也支持以长轮询(long-polling)方式发布实时数据。
Tornado 最初是由 FriendFeed 公司开发出来的,而 FriendFeed 在 2009 被 Facebook 收购。随后 Facebook 发布 Tornado 开源工程,现在包括 Quora 在内的多家网站已使用 Tornado。
Reddit使用Python重写
Reddit(美国最大的网上社区)最早是用 Common Lisp 开发,随之用 Python 进行了重写(2005年底完成)。著名的Python 框架 Web.py 就是 Reddit 当时的员工 Aaron Swartz 开发的,现在 Reddit 的 Web 框架则使用了 Pylons 。在 2009 年 11 月,Reddit 迁移到 Amazon 的云计算平台。前端框架现在用的是 jQuery。或许你早就知道,Reddit 网站程序现在已经开源https://github.com/reddit/reddit,如果你感兴趣的话,不妨下载研究。
Dropbox
Dropbox 的99.9%的代码是用Python写的。Python使用在服务器端、桌面客户端、网站控制逻辑,后端的 API 和分析。
使用 Python 语言编写的代码,通过使用PyObjs,WxPython,types,py2exe, py2ap,PyWin32等工具,让Dropbox运行在Windows,Mac和Linux系统。
6 Lessons From Dropbox - One Million Files Saved Every 15 Minutes,http://goo.gl/Qj5sJ。
Instagram
10亿美元被Facebook收购的Instagram,主要使用Python等开源技术。
应用服务器:
l 使用Django框架。
l 使用Gunicorn作为 WSGI 服务器(过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源)。
l 使用 Fabric 加速部署。
任务队列/发布通知
队列服务使用Gearman,工作实例(都用Python写的)在给定的时间内对队列中的任务进行消费,并分发给不同的服务;对于消息推送,找到的最划算的方案是,一个开源的Twisted 服务 pyapns(A universal Apple Push Notification Service (APNS) provider)来实现,已经为Instagram处理了超过10亿条通知,并且绝对可靠。
参考:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,http://goo.gl/mkfQN;中文版:http://goo.gl/Dkymt。
OpenStack
OpenStack是一个美国国家航空航天局和Rackspace合作研发的云端运算软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目。
OpenStack是IaaS(基础设施即服务)组件,让任何人都可以自行建立和提供云端运算服务。此外,OpenStack也用作建立防火墙内的“私有云”(Private Cloud),提供机构或企业内各部门共享资源。
以Python编程语言编写
整合Tornado网页服务器、Nebula运算平台
使用Twisted软件框架
遵循Open Virtualization Format、AMQP、SQLAlchemy等标准
虚拟机器软件支援包括:KVM、Xen、VirtualBox、VMware、Hyper-V
4.2. 国内
腾讯
腾讯游戏运营支撑体系的开发团队,在使用django/celery/rabitmq/mongodb开发了一个已广泛使用的内部开放平台。
Django:是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。
Celery:(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。celery用于生产系统每天处理数以百万计的任务。celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。celery是易于集成Django, Pylons and Flask,使用 django-celery, celery-pylons and Flask-Celery 附加包即可。
豆瓣
豆瓣最初使用Python开发,只是用了3个月。洪强宁,《Python于web2.0网站的应用》,http://goo.gl/ZaI9s;《Python在豆瓣的应用》,http://goo.gl/IgeGe
最早的豆瓣就完全使用 Python 开发,后台索引基于 twisted,GUI 使用 Quixote,还用到了 cElementTree,数据库是 MySQL。所以豆瓣天生就有着 Python 的文化。在豆瓣,开发环境正逐步从 Subversion 向 mercurial 迁移,还使用了 Python 编写的 trac 和 IRC,之所以选择 IRC 是因为 IRC 有很大的灵活性,可以编写 Bot 自动化很多东西。除此之外:
l m.douban.com使用:Pylons
l 内部管理系统使用: Django
l DPark系统:使用Python编写,支持迭代计算的MapReduce框架
l DAE(douban app engine):使用Python编写,类似于GAE、SAE,定位为内部的 PaaS 平台。
新浪SAE
新浪Sina App Engine Python,是新浪研发的PaaS(平台即服务)平台,已经开始支持Python了。陈正《Introduction to SAE Python》, http://goo.gl/0lkRm
搜狐邮箱
2007年,搜狐邮件中心基于webpy(除了webpy,还用了优秀的WEB框架 – Tornado),发布了"搜狐闪电邮"的第一个Python版本。之后,Python就在搜狐邮件中心蓬勃的发展起来。到今天,搜狐邮箱已经成为国内最大的Python应用之一。而Python也成为了搜狐邮箱使用最广泛的语言。从运维到开发,从业务系统到基础服务,到处都存在它的影子。
知乎
(摘自知乎官方解答)知乎开发主要用的是friendfeed的框架tornado。Tornado异步非阻塞的I/O模型的确让人耳目一新,Tornado的优势主要在于对大量Comet长轮询连接的维护上。这也是FriendFeed开发Tornado的原因-----因为FriendFeed需要实时更新Timeline,而Comet又是目前最好,最流行的方法。由于知乎也有大量长轮询连接需要维护,所以选择Tornado也就在情理之中了。
但是我们也要看到,Tornado不是万金油,由于Tornado的WEB服务器为单线程,一个Request如果阻塞了I/O,那么这个进程将一直挂起,既无法接受新的Request,也无法Finish正在阻塞的其它Request。虽然可以Spawn多个Tornado进程,但是进程这种重量级的东西,Spawn太多会消耗大量的内存资源。这种感觉很像PHP的FastCGI进程那种味道。所以如果是会阻塞I/O的Request一般都是利用Tornado内置的异步HTTP Client交给其它动态后端来做。
所以Tornado在生产中一般前面都要包一层nginx做反向代理,用nginx来做静态文件等大数据量的I/O操作。Tornado的I/O时间实在是太金贵了,在这上面耗不起。
各种游戏公司
国内一些游戏后台使用Python开发,特别是一些网页游戏。可以搜索下有哪些公司在招聘Python游戏开发,会发现有很多公司在招聘。
下面是几篇在PyCon会议上的文章:
l 王健,《中型角色扮演游戏服务器的Python应用》,http://goo.gl/b2R6M
l 赖勇浩,《Python于 webgame 的应用》,http://goo.gl/1QMOT
l 林伟(skywind),《Python游戏开发探索与发现》中告诉大家Python已经足够简化到让策划人员也能写代码,用Python来描述一个游戏的场景。国内WebGame已经超过国外,在网易大量游戏项目用Python相关内容开发。
5. 是不是想学习Python了?
通过上面的介绍,是不是迫不及待的想学习下Python了。下面推荐学习Python相关工具与文章。
入门资料
l wiki:http://zh.wikipedia.org/zh/Python
l Chinaunix的Python论坛资料
l 《OReilly-Learning-Python-4th-Edition-Oct-2009》
l 《简明 Python 教程》(中文),对应的英文版是《A Byte of Python》
l 深入 Python 3,http://goo.gl/cyrUY
工具
l UliPad 代码编辑工具(本身由python编写)
l Pydev:eclipse + pydev插件
l Eric:基于PyQt的自由软件,功能强大。