
Python
文章平均质量分 62
mattkang
搞过游戏开发、web开发,喜欢python、golang,可写前后端
展开
-
飘逸的python - str vs. repr
repr - 展示给开发者看的,目标是准确性,显示的是实际在python中的形式,一般可以用eval()给转换回去。str - 展示给用户看的,目标是可读性,是经过包装的。http://img.blog.youkuaiyun.com/20130710132259078" _xhe_src="http://img.blog.youkuaiyun.com/20130710132259078"/>htt原创 2013-07-10 13:24:10 · 2658 阅读 · 0 评论 -
飘逸的python - 常见的几个坑
混用空格和tabpython是严格缩进的,全用空格或者全用tab就没错,如果是混用就会有问题。如果用vim开发的话,一般是在配置中把tab转成4个空格。用可变对象作为默认参数def f(a=[]):a.append('kzc')return a>>> f()['kzc']>>> f()['kzc', 'kzc']>>> f()['kzc',原创 2013-07-10 21:40:22 · 3097 阅读 · 0 评论 -
飘逸的python - __dict__的妙用
设想这样一个场景。我有一个字典,从某个地方获取的,比如http请求发过来的,比如从redis中hgetall出来的。我要根据这个字典来构建一个对象。比如类class Person: def __init__(self,_obj): self.name = _obj['name'] self.age = _obj['age']原创 2013-07-11 20:26:29 · 6432 阅读 · 1 评论 -
飘逸的python - 增强的格式化字符串format函数
自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足。那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱。语法它通过{}和:来代替%。“映射”示例通过位置In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.原创 2013-06-26 22:59:13 · 118199 阅读 · 11 评论 -
飘逸的python - 优雅的执行程序
在linux下,我们执行一个python程序是python /path/to/xxx.py。如果这个程序经常使用,会觉得这样有点麻烦。可以chmod +x /path/to/xxx.py,即给这个文件加上了可执行权限,就可以不用在前面敲python,直接/path/to/xxx.py运行了。不过,对于有代码洁癖的人看来,这样还不够优雅,后面还带着.py后缀。把.py后缀去掉也行,只原创 2013-07-14 12:57:39 · 2920 阅读 · 1 评论 -
飘逸的python - 彩色你的控制台
在linux的终端中,ANSI转义序列来控制颜色基本规则: 前面加上\033[,结尾用\033[0m重置为原来的颜色可以在终端中输入下面这句,就可以看到输出绿色的hello。>>echo -e '\033[0;32mhello\033[0m'其中0;32m控制颜色。最简单的,只要把0;32m中的2改成0-7,就对应不同颜色了。0黑1红2绿3棕4蓝5紫原创 2013-07-18 13:10:11 · 4627 阅读 · 0 评论 -
飘逸的python - 使用traceback获取详细的异常信息
try: 1/0except Exception,e: print e输出结果是integer division or modulo by zero,只知道是报了这个错,但是却不知道在哪个文件哪个函数哪一行报的错。下面使用traceback模块try: 1/0except Exception,e: traceback.prin原创 2013-07-18 20:59:12 · 103325 阅读 · 7 评论 -
飘逸的python - inspect谁调用了我
当程序出现诡异的bug时,我们需要层层去跟踪,尤其是要理清顺序。这时如果有个清晰的调用脉络调试就容易多了。利用inspect模块的getframeinfo方法来实现这需求。上代码感受下。import inspectdef foo(): who = inspect.getframeinfo(inspect.currentframe().f_back)[2] prin原创 2013-07-19 13:19:57 · 5786 阅读 · 0 评论 -
飘逸的python - 嵌套太深了,让笛卡尔拉你一把
在多重循环的情况下,嵌套太深,代码难看死了。这时可以用标准库itertools 中的笛卡尔积product函数。for x in ['a','b','c']: for y in ['d','e','f']: for z in ['m','n']: print x,y,z转换成from itertools import p原创 2013-07-20 13:33:34 · 7555 阅读 · 0 评论 -
飘逸的python - 中文编码长度有趣的现象
最近在做验证用户姓名的功能时发现这样一个现象。>>len(u'打怪者') #unicode3>>len(u'打怪者'.encode('gbk')) #gbk6>>len('打怪者') #utf-89一般都知道,gbk编码每个汉字占用2个字节,utf8编码的每个汉字占用3个字节,这就是很多网站不用统一标准utf8的原因,就是gbk占用字节少。既然len(u'打原创 2013-07-21 11:43:12 · 11007 阅读 · 0 评论 -
飘逸的python - 简明gzip模块压缩教程
压缩数据创建gzip文件先看一个略麻烦的做法import StringIO,gzipcontent = 'Life is short.I use python'zbuf = StringIO.StringIO()zfile = gzip.GzipFile(mode='wb', compresslevel=9, fileobj=zbuf)zfile.write(content)zfil原创 2013-07-22 07:55:54 · 12531 阅读 · 0 评论 -
飘逸的python - 多条件排序及itemgetter的应用
曾经客户端的同事用as写一大堆代码来排序,在得知python排序往往只需要一行,惊讶无比,遂对python产生浓厚的兴趣。之前在做足球的积分榜的时候需要用到多条件排序,如果积分相同,则按净胜球,再相同按进球数,再相同按失球数。即按积分P、净胜球GD、进球GS、失球GA这样的顺序。在python中,排序非常方便,排序的参数主要有key、reverse。参数cmp不建议使用了,在python3.0被移除了,用参数key代替。对于多条件排序,也非常简单,只需要记住下面这句话就行。 即参数key指定的函数原创 2013-07-29 20:49:52 · 8121 阅读 · 0 评论 -
飘逸的python - @staticmethod和@classmethod的作用与区别
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法,而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢从它们的使用上原创 2013-07-29 13:29:41 · 111431 阅读 · 12 评论 -
飘逸的python - 用urlparse从url中抽离出想要的信息
最近有个需求,要检测配置中的那些url的域名是否都正常,即是否都能ping通。不过配置中url格式是这样的 。要ping的是要把url中的域名抽离出来,一般会想到的是切割字符串,或者用正则表达式。不过有个更干净利落的方法,就是python标准库自带的urlparse。url的各个部分都原创 2013-07-23 13:09:32 · 2883 阅读 · 0 评论 -
飘逸的python - 命令行漂亮的显示json数据
之前做的一个脚本把信息用json格式存到文本中。这样的好处是简便,易编辑,并且拥有强大的表达能力。不过从文本cat出来的是一堆很难看的字符串,没换行和缩进。这时候就在想,如果有个类似于IDE的格式化代码的工具来显示格式化的json数据,那就好了。这工具不用四处去找,python就提供了这样一个东西。从python2.6开始,多了个json.tool的东西。使用很简单。在命令行中原创 2013-08-01 07:25:58 · 27956 阅读 · 3 评论 -
飘逸的python - zlib压缩存到数据库
当每天有大量的数据存到kv数据库中去,且value数据很大,于是想压缩后再存进去。之前提到了gzip压缩,为什么不直接用gzip呢。其实更确切的说gzip是一种文件格式,它压缩成gzip文件,而我是要压缩存到数据库中去。gzip是对zlib的包装,添加了一些额外的信息。zlib是一种压缩数据格式,单纯的处理数据。zlib在python中非常容易使用。>>zlib原创 2013-07-25 08:17:26 · 3362 阅读 · 0 评论 -
飘逸的python - 偏函数functools.partial
函数式编程的思想。可以理解成绑定了一部分参数的函数。作用就是少传参数,更短,更简洁。我之前做的一段用户留存率的程序。需求是这样子的,选择某一天,然后以这天为准,次日留存,3日留存,7日留存,14日留存,30日留存。已有一个获取第几天后的函数from datetime import datetime,timedeltadef GetNextDay(baseday,n):原创 2013-08-02 07:50:26 · 24887 阅读 · 5 评论 -
飘逸的python - super()只不过是用来避免硬编码的
当在子类需要调用父类的方法时,在python2.2之前,直接用类名调用类的方法,即非绑定的类方法,并把自身对象self作参数传进去。class A(object): def say(self): print 'I am A'class B(A): def say(self): print 'I am B' A.say(self原创 2013-07-26 10:25:55 · 2996 阅读 · 0 评论 -
飘逸的python - hack输出流便于调试
当项目有很多文件时,要找出控制台的输出是在哪里print出来的很麻烦,不过这事对于强大的python来说小菜一碟。先上代码和效果,再说明。import sys,tracebackclass mystdout: stdout = sys.stdout def write(self,_str): if _str != '\n': fil原创 2013-07-27 09:22:20 · 4061 阅读 · 0 评论 -
飘逸的python - 一段统计次数程序的进化
这段程序是从给定的列表中统计各个小伙伴以及他们的出现次数。littlebuddys = ['jack','terry','john','rooney','ross','kzc','john','ross','ross']新手程序员d = {}for buddy in littlebuddys: if buddy not in d: d[buddy原创 2013-07-28 07:42:07 · 4028 阅读 · 3 评论 -
飘逸的python - 灵活的动态之xxxattr
标题的xxxattr指的是hasattr/getattr/setattr/delattr。可以动态的检测、获取、设置、删除对象的属性和方法。这里所说的动态,说白了就是“可以通过字符串来做这些事”。这是一个非常强大灵活的特性。我举个例子。有个GM工具来设置玩家角色的属性,比如角色的属性有经验、体力、游戏币。roletable = {'31415926':{'exp':99,'原创 2013-08-04 07:58:45 · 3164 阅读 · 0 评论 -
飘逸的python - 发送qq邮件
之前在搞监控预警的时候需要发邮件通知,很简单,就跟呼吸一样。import smtplibfrom email.mime.text import MIMEText_user = "sigeken@qq.com"_pwd = "***"_to = "402363522@qq.com"#使用MIMEText构造符合smtp协议的header及bodymsg = MIMEText(原创 2013-08-06 08:27:30 · 15163 阅读 · 3 评论 -
飘逸的python - 发送带各种类型附件的邮件
上一篇博文演示了如何发送简单的邮件,这一篇将演示如何发送各种类型的附件。基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分。如果是附件,则add_header加入附件的声明。在python中,MIME的这些对象的继承关系如下。MIMEBase |-- MIMENonMultipart |-- MIMEAppl原创 2013-08-07 08:24:33 · 21438 阅读 · 3 评论 -
飘逸的python - 赛程表算法
最近德甲英超西甲各大联赛重燃战火,想起之前写过的一段生成赛程表的代码,用python来写这类东西太舒服了。这个算法叫做蛇环算法。即,把所有球队排成一个环形(2列),左边对阵右边,第一支队伍不动,其他队伍顺时针循环,这样就肯定不重复了。为了方便说明,假设有8支球队a到h。像下面那样按环形排好。a h| |b g| |c f| |d-e这样,第原创 2013-08-20 00:09:23 · 6710 阅读 · 2 评论 -
飘逸的python - 编码杂症之在字符串前面加u
有时候我们从其它地方接受的字符串经过艰难跋涉,它变了个样。比如收到的是'\u6253\u602a\u8005'而不是u'\u6253\u602a\u8005'。明明肉眼看起来只需要加个u,但是怎么加呢?>>s = '\u6253\u602a\u8005'>>s'\\u6253\\u602a\\u8005'>>'u'+s'u\\u6253\\u602a\\u8005'原创 2013-08-08 08:21:50 · 8718 阅读 · 0 评论 -
python第三方库推荐 - dateutil
在dateutil中,吸引我的东西有2个,1个是parser,1个是rrule。其中parser是根据字符串解析成datetime,而rrule是则是根据定义的规则来生成datetime。安装没必要下载源码包手动安装,直接用easy_install或pip在线安装easy_install python-dateutilpip install python-dateutil关原创 2013-08-21 00:17:38 · 34680 阅读 · 6 评论 -
飘逸的python - 打印螺旋矩阵
算法分析:螺旋矩阵用二维数组表示,坐标(x,y),即(x轴坐标,y轴坐标)顺时针螺旋的方向是->右,下,左,上,用数值表示即是x加1格(1,0),y加1格(0,1),x减1格(-1,0),y减1格(0,-1)坐标从(0,0)开始行走,当超出范围或遇到障碍时切换方向经过上面的分析,思路很清晰了,千言不如一码。import itertoolsdef spiral(n,m):原创 2013-08-22 00:12:02 · 7017 阅读 · 2 评论 -
飘逸的python - 理解打开文件的模式
当我们用open()函数去打开文件的时候,有好几种打开的模式。'r'->只读'w'->只写,文件已存在则清空,不存在则创建。'a'->追加,写到文件末尾'b'->二进制模式,比如打开图像、音频、word文件。'+'->更新(可读可写)这个带'+'号的有点难以理解,上代码感受下。with open('foo.txt', 'w+') as f:原创 2013-08-09 08:53:13 · 3124 阅读 · 0 评论 -
飘逸的python - 有的升序有的降序的情况下怎么多条件排序
之前在统计导出各区服玩家消费的时候需要进行升序降序混搭的多条件排序。需求是这样的。区服从小到大排,如果区服相同,则按消费从大到小排。实现方法是利用python的sort算法是稳定排序,对数据进行多次排序,先排次要条件,后排主要条件。还有一种更简洁的一行流的方法,不过只有当待排数据是数值的时候才有效。此方法利用相反数的性质,在前面加个负号。下面上代码。#假设数据如下。data原创 2013-08-23 00:11:51 · 8300 阅读 · 4 评论 -
飘逸的python - 重载操作符
前面有篇博文《 飘逸的python - 字典合并值相加》讲到了如何对字典合并。通过调用union_dict(obj1,obj2) 来合并。在这里,我们重载操作符直接用obj1 + obj2来到达相同的目的。实现方法就是,定义一个类,直接继承dict,没错,直接继承内置数据结构。然后定义魔术方法__add__()。下面看代码。def union_dict(*objs):原创 2013-08-25 08:51:50 · 3366 阅读 · 0 评论 -
飘逸的python - 性能调优利器profile及其意义
VIM 的作者Bram Moolenaar在一篇叫高效文本编辑器的7个习惯的ppt中有这么一段话。Three basic steps1. Detect inefficiency 2. Find a quicker way 3. Make it a habit即1.检测哪里效率低下2.找到一种更快的方法3.养成习惯 这3个步骤可谓是大道至简。原创 2013-08-25 13:08:32 · 7287 阅读 · 0 评论 -
飘逸的python - 不要用二进制模式打开文本文件
先看下面代码的“诡异”现象。假设在windows下,我有个f.txt文件,里面的内容是下面这样的。helloworld代码一,with open('f.txt', 'r') as f: print f.readlines()with open('f.txt', 'rb') as f: print f.readlines()输出['hell原创 2013-08-12 22:01:43 · 7332 阅读 · 0 评论 -
飘逸的python - 使用reload进行热更新
一开始我们的游戏商城配置是从txt读取解析的。后来为了方便运营修改配置,改成从数据库读取并提供后台可视化编辑配置。如果为了使配置生效而重启游戏进程那太麻烦了。这时候reload就派上用途了。下面演示如何使用reload。 假设有下面3个文件。config.txt--纯文本配置config.py--解析纯文本配置转换成python变量test_reload原创 2013-08-25 00:06:55 · 11368 阅读 · 0 评论 -
飘逸的python - 鲜为人知的参数
虽然用了这么久的python,但是还是能断断续续发现一些本以为很熟悉的东西的“秘密”。split()的maxsplit参数>>'hello,world,foo,bar'.split(',',1)['hello', 'world,foo,bar']enumerate()的start参数>>list(enumerate(['a','b','c'],2))[(原创 2013-08-15 00:21:49 · 4301 阅读 · 4 评论 -
飘逸的python - 字典合并值相加
在统计汇总游戏数据的时候,有些数据是是每天用字典存的,当我要对多天汇总的时候,就需要合并字典了。如果key相同的话它们的值就相加。不能用update方法,因为用update方法则相同的key的值会覆盖,而不是相加。千言不如一码。def union_dict(*objs): _keys = set(sum([obj.keys() for obj in objs],[]))原创 2013-08-17 00:20:46 · 20060 阅读 · 1 评论 -
飘逸的python - 类型判断type与isinstance的区别
在游戏项目中,我们会在每个接口验证客户端传过来的参数类型,如果验证不通过,返回给客户端“参数错误”错误码。这样做不但便于调试,而且增加健壮性。因为客户端是可以作弊的,不要轻易相信客户端传过来的参数。验证类型用type函数,非常好用,比如>>type('foo') == strTrue>>type(2.3) in (int,float)True既然有了type()原创 2013-08-18 11:37:30 · 68597 阅读 · 0 评论 -
python第三方库推荐 - 通过ntplib在windows上同步时间
很多时候我们有通过程序脚本同步校正北京时间的需求。在linux上同步时间比较方便,安装个ntpdate软件就行了。但是在windows的要同步时间比较麻烦。这时想到的就是从网络获取一个准确的时间,然后调用dos命令修改时间。从哪里获取呢?当然是国家授时中心。授时中心的网址是 cn.pool.ntp.org(注意,流传甚广的210.72.145.44这个ip已经失效了,直接用域名原创 2013-08-31 20:15:45 · 10653 阅读 · 0 评论 -
python第三方库推荐 - 用tablib导出xls、csv、yaml等格式
一般的后台都有导出数据的需求,tablib使得这件事变得简单。下面看示例。import tablibheaders = ('area', 'user', 'recharge')data = [ ('1', 'Rooney', 20), ('2', 'John', 30),]data = tablib.Dataset(*data, headers=headers)原创 2013-09-01 10:15:39 · 14042 阅读 · 1 评论 -
飘逸的python - 保持命名空间的整洁
API的设计是一个艺术活。往往需要其简单、易懂、整洁、不累赘。很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法的。也就是说我们只需要暴露这个方法就行,不用关心这个方法是怎么实现的,不用关心其它辅助方法的存在。在python中,有几种策略来保持命名空间的整洁。1.变量命名用下划线_开头下划线_开头的变量在其它模块from xxx import *的时候不原创 2013-08-31 21:32:40 · 4086 阅读 · 1 评论 -
python第三方库推荐 - 优雅的数据验证库schema
这个在验证表单、配置、客户端传过来的数据等很有用。安装easy_install schema 或 pip install schema基本用法from schema import SchemaSchema(xxx).validate(data)其中参数xxx可以是:基本数据类型比如int/float/list/tuple/set/str等。函数list,原创 2013-09-01 21:29:43 · 5376 阅读 · 0 评论