在前面,我们介绍了一个优秀的第三方库 -- requests,本章再介绍两个第三方库:celeryclick其中:celery 是一个强大的分布式任务队列,通常用于实现异步任务;click 是快速创建命令行的神器;
HMAC 是用于消息认证的加密哈希算法,全称是 keyed-Hash Message Authentication Code。HMAC 利用哈希算法,以一个密钥和一个消息作为输入,生成一个加密串作为输出。HMAC 可以有效防止类似 MD5 的彩虹表等攻击,比如将常见密码的 MD5 值存入数据库,可能被反向破解。Python 的 hmac 模块提供了 HMAC 算法,它的使用形式是:hmac.
Python 内置的 hashlib 模块提供了常见的摘要算法(或称哈希算法,散列算法),如 MD5,SHA1, SHA256 等。摘要算法的基本原理是:将数据(如一段文字)运算变为另一固定长度值。MD5 (Message-Digest Algorithm 5, 消息摘要算法),是一种被广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。
Python 提供了两个标准库用于处理跟时间相关的问题,一个是 time,另一个是 datetime,datetime 对 time 进行了封装,提供了更多实用的函数。本文介绍 datetime 库的简单使用。当前时间获取当前时间可以使用 now() 或 utcnow() 方法,其中,now() 用于获取当地时间,而 utcnow() 用于获取 UTC 时间。>>> from datetime import datetime>>> datetime.
我们知道,迭代器的特点是:惰性求值(Lazy evaluation),即只有当迭代至某个值时,它才会被计算,这个特点使得迭代器特别适合于遍历大文件或无限集合等,因为我们不用一次性将它们存储在内存中。Python 内置的 itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,我们可以通过 for 循环来遍历取值,也可以使用 next() 来取值。
我们知道,Python 的数据类型有 list, tuple, dict, str 等,collections 模块提供了额外 5 个高性能的数据类型:Counter: 计数器OrderedDict: 有序字典defaultdict: 带有默认值的字典namedtuple: 生成可以通过属性访问元素内容的 tuple 子类deque: 双端队列,能够在队列两端添加或删除元素CounterCounter 是一个简单的计数器,可用于统计字符串、列表等的元素个数。
Base64,简单地讲,就是用 64 个字符来表示二进制数据的方法。这 64 个字符包含小写字母 a-z、大写字母 A-Z、数字 0-9 以及符号"+"、"/",其实还有一个 "=" 作为后缀用途,所以实际上有 65 个字符。本文主要介绍如何使用 Python 进行 Base64 编码和解码,关于 Base64 编码转换的规则可以参考 Base64 笔记。
argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。当然,Python 也有第三方的库可用于命令行解析,而且功能也更加强大,比如 docopt,Click。argparse 使用简单示例我们先来看一个简单示例。
前面我们介绍了 os 模块和 re 模块,本章再介绍 Python 常用的一些标准模块:argparsebase64collectionsdatetimehashlibhmac其中:argparse 是用于创建命令行的库;base64 是用于 base64 编码和解码的库;collections 模块提供了 5 个高性能的数据类型,如 Counter,OrderedDict 等;datetime 是用于处理日期时间的模块;
Python 的标准库 urllib 提供了大部分 HTTP 功能,但使用起来较繁琐。通常,我们会使用另外一个优秀的第三方库:Requests,它的标语是:Requests: HTTP for Humans。Requests 提供了很多功能特性,几乎涵盖了当今 Web 服务的需求,比如:浏览器式的 SSL 验证身份认证Keep-Alive &
HTTP (HyperText Transfer Protocol, 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是基于 TCP 的应用层协议,简单地说就是客户端和服务器进行通信的一种规则,它的模式非常简单,就是客户端发起请求,服务器响应请求,如下图所示:HTTP 最早于 1991 年发布,是 0.9 版,不过目前该版本已不再用。HTTP 目前在使用的版本主要有:HTTP/1.
本章主要介绍:HTTP 协议Requests 库的使用
在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。有一点需要特别注意的是,正则表达式使用 \ 对特殊字符进行转义,比如,为了匹配字符串 'python.org',我们需要使用正则表达式 'python\.org',而 Python 的字符串本身也用 \ 转义,所以上面的正则表达式在 Python 中应该写成 'python\\.
正则表达式(regular expression)是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串,可以匹配其自身。比如,正则表达式 'hello' 可以匹配字符串 'hello'。
软件系统的开发是一个很复杂的过程,随着系统复杂性的提高,代码中隐藏的 bug 也可能变得越来越多。为了保证软件的质量,测试是一个必不可少的部分,甚至还有测试驱动开发(Test-driven development, TDD)的理念,也就是先测试再编码。
我们在编写程序的时候,经常需要对异常情况做处理。比如,当一个数试图除以 0 时,我们需要捕获这个异常情况并做处理。你可能会使用类似 if/else 的条件语句来对异常情况做判断,比如,判断除法的分母是否为零,如果为零,则打印错误信息。这在某些简单的情况下是可以的,但是,在大多数时候,我们应该使用 Python 的异常处理机制。
与子程序(或者说函数)一样,协程(coroutine)也是一种程序组件。Donald Knuth 曾说,子程序是协程的特例。一个子程序就是一次函数调用,它只有一个入口,一次返回,调用顺序是明确的。但协程的调用和子程序则大不一样,协程允许有多个入口对程序进行中断、继续执行等操作。
我们知道,同一进程的多个线程之间是内存共享的,这意味着,当一个线程对全局变量做了修改,将会影响到其他所有线程,这是很危险的。为了避免多个线程同时修改全局变量,我们就需要对全局变量的修改加锁。除了对全局变量的修改进行加锁,你可能也想到了可以使用线程自己的局部变量,因为局部变量只有线程自己能看见,对同一进程的其他线程是不可访问的。
线程(thread)是进程(process)中的一个实体,一个进程至少包含一个线程。比如,对于视频播放器,显示视频用一个线程,播放音频用另一个线程。如果我们把进程看成一个容器,则线程是此容器的工作单位。进程和线程的区别主要有:进程之间是相互独立的,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,但互不影响;
进程(process)是正在运行的程序的实例,但一个程序可能会产生多个进程。比如,打开 Chrome 浏览器程序,它可能会产生多个进程,主程序需要一个进程,一个网页标签需要一个进程,一个插件也需要一个进程,等等。
关注时代Java