BLOG
Enjoy when you can, and endure when you must.
APR 08, 2014/Python
multipart/form-data格式的POST实体封装与提交
在Python中,我们通常使用urllib2中提供的工具来完成HTTP请求,例如向服务器POST数据。通常情况下,所有的数据都会进行URL编码并将Content-Type设置为application/x-www-form-urlencoded。不过在一些特殊的情况下(例如服务器限制而不允许使用这种类型的数据提交)或者上传文件的时候,则需要用到multipart/form-data格式的POST提交。这种时候,我们可以手动对数据进行封装,如下面的代码所做的操作:def encode_multipart_formdata(fields, files):  &n...
MAR 15, 2014/Python
从Python看排序:插入排序
在学习排序算法时,我们可以经常看到插入排序的身影。我们继续用扑克牌来描述该算法的实现方式。假设有5张牌以如下方式堆放在桌面上: 将面上的一张牌拿起并放在手上: 因为这是第一张牌,所以我们无需考虑其位置。接着再从桌面上拿起面上的一张牌并与手上的牌进行比较,然后插入到正确的位置上: 接下来的操作与此相同。将梅花5取出然后放在梅花3和梅花8之间: 重复该过程直到所有的牌都从桌上拿起并插入到手中几张牌中的正确位置。 整个过程中,插入排序同时维护两组元素,一组排序后的元素和一组待排序的元素。在上面的扑克牌例子中,桌上的一叠扑克就是待排序...
MAR 12, 2014/Python
从Python看排序:选择排序
选择排序采用了我们在生活中常用的一种方式,同样以扑克牌为例对桌上的5张扑克牌进行升序排序。 这一次,我们纵观全局并选出最小的一张。在刚才那组扑克中可以发现梅花3是最小的: 我们将其取出拿到手上,其余牌则继续放在桌上: 然后重复之前的操作,可以得到第二大的牌“梅花5”: 将其拿起并放在“梅花3”的右边。 当桌面上所有的牌都拿起后,我们手上的牌将会以从小到大的顺序放置。 选择排序就与此过程类似。只是说在代码实现中,我们实际只在一个列表中完成整个操作。选择排序同样...
MAR 11, 2014/Python
从Python看排序:冒泡排序
冒泡排序在排序算法中是最简单的一种,它通过多次遍历列表,将最大的元素冒泡到列表的头部或尾部。我们通过对四张扑克牌(花色相同)以从小到大的方式进行排序来演示该算法的工作原理。首先将扑克牌面朝上放在桌上,如下图所示: 该算法要求多次遍历扑克,每次都从头开始,并在上一次遍历的前一张结束。在每一次遍历中,总是从前两张牌开始。如果前者比后者大,则交换位置。 然后比较第二张和第三张,同样如果前者更大则互换,否则保持原样。 这样依次类推,直到将最大的那一张牌移动到最后。 下图演示了接下来的两次遍历。第二次遍历将会使第二大的牌交换至倒数第二的位置上,第三次...
MAR 01, 2014/Python
用Python搞定基本认证
本文翻译自《Basic Authentication》,翻译得不好还请见凉。引言这篇教程意在阐明什么是基本认证(base authentication)以及如何用python对其进行处理。你可以从Voidspace Python Recipebook下载本文中的示例代码。第一个示例,So Let's Do It,展示了如何手动处理基本认证,以此解释其工作原理。第二个示例,Doing it Properly,则采用一种更合适更自动化的方法来处理。示例中利用了Python标准库中的urllib2模块,它提供了一个简单的接口用于从互联网请求页面。其中的urlopen方法以openers...
FEB 27, 2014/Python
两步验证的使用和TOTP在Python中的基本实现
两步验证是一些云服务或者游戏中使用得比较广泛的认证方式,用户在登录过程中,除了输入设置的固定密码之外,还需要输入由验证器生成的一次性密码。这种验证很多是基于TOTP(Time-Based One-Time Password,基于时间的一次性口令),它是对OTP(One-Time Password,一次性密码)的拓展,叫作HTOP(HMAC-based One-Time Password,基于HMAC的一次性口令)算法。其基本原理是: 客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程。此外,客户端和服务器各有一个计数器C,并且事先将计数值同步。 进行验证时,客户端对...
FEB 13, 2014/Python
Python中时间字符串的转换和时区的处理
在Python中,与时间相关的库有好些,可以帮助我们快速的处理与时间相关的需求和问题。这里想和大家分享一下如何将时间字符串转换为datetime以方便使用和处理。其实相关的文章可以找到很多,不过感觉很多介绍的是类似于“2014-02-13 20:53:21”这样的时间,这借助于datetime标准库中的strptime方法即可快速转换。不过如果是遇到ISO 8601中有一种日期和时间的组合表示法所表示的时间,如:2014-02-13 17:33:41.817981+08:00这里面还包含着时区,处理起来貌似要麻烦一点。其实我们无非是需要构造时间的每个部分,因此可以找一些方法将以...
JAN 22, 2014/Python
一波N折的PIL
PIL还真是挺折腾的,每次安装都会遇到一点新奇的问题,不过这就是积累呀,赶紧记录一下。首先需要说明的是,我一直使用的是CentOS系统。安装PIL前必须安装所需的依赖包:yum install zlib zlib-devel yum install libjpeg libjpeg-level yum install freetype freetype-devel这在CentOS5.x上没有问题,不过今天折腾的是CentOS6.4,发现libjpeg-devel总是提示找不到,运行yum sear...
JAN 13, 2014/Python
Win8 Metro应用缓存清理之Python版
现在有了Surface Pro 2,Win8的Metro应用就会经常使用到,毕竟这些应用对触屏的体验优化更好。不过其应用的缓存可是放在C盘的,日积月累加上有些软件的缓存还真不小,对于容量不大的SSD来说看着确实还是挺揪心的。系统内置的像“磁盘清理”一类的软件貌似也都没提供Metro应用缓存的清理。那就自己来,通过搜索通常可以找到如下手动清除的方法:1. 显示隐藏文件:资源管理器 >> 查看 >> 选项 >> 查看,勾选去掉“隐藏受保护的操作系统文件”;2. 打开Metro应用目录:在运行(同时按Win + R)键入如下路径并回车:%userp...
DEC 16, 2013/Python
正则表达式语法与re模板的简单应用
正则表达式经常被用于字符串的处理中,特别是一些使用普通处理不方便或较为复杂的环境。在Python标准库中,re模块提供了这方面的功能。不过首先,了解正则表达式的基本语法规则是必要的。其实这并不需要我介绍,因为相关的材料实在太多了,这里推荐给大家一张图片,总结的很详细(以下是一部分,点击可以查看全部)。 那接下来就是运用该语法并结合re模块来完成相应的需求。我想最常用的会是re.match和re.search,这两个方法都是尝试在字符串中匹配一个模式,如下面的示例,我们想匹配出Hello和World两个单词之间有什么内容: >>> tex...
< 1 2 3 4 > >>