Python基础知识(26):常用内建模块(Ⅱ)

1、hashlib

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等

摘要算法又称哈希算法、散列算法。

(1)它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)

(2)摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过

MD5

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示

import hashlib
md5 = hashlib.md5()
md5.update('How to use md5 in python hashlib'.encode('utf-8'))
print(md5.hexdigest()) 结果:
8b6e4d30c576051f3ca4be97e8314d15

SHA1

import hashlib
sha1 = hashlib.sha1()
sha1.update('How to use SHA1 in python hashlib'.encode('utf-8'))
print(sha1.hexdigest()) 结果:
8a4dbc942c7ff059115b56645ab484c4188bd5ce

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示

比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法不仅越慢,而且摘要长度更长

摘要算法的应用

用户登录网站的用户名和口令都存储数据库,口令使用摘要算法进行加密

当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误

要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令

设计一个验证用户登录的函数,根据用户输入的口令是否正确

import hashlib
db = {
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}
def calc_md5(password):
md5 = hashlib.md5()
md5.update(password.encode('utf-8'))
return md5.hexdigest()
def login(user, password):
md5 = calc_md5(password)
if user in db and md5 in db.get(user):
print('Welcome')
else:
print('Incorrect username or password') login('michael', '')
login('bob', 'abc999')
login('alice', 'alice2008')
login('michael', '')
login('bob', '')
login('alice', 'Alice2008') 结果:
Welcome
Welcome
Welcome
Incorrect username or password
Incorrect username or password
Incorrect username or password

HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出

Python自带的hmac模块实现了标准的Hmac算法,它利用一个key对message计算“杂凑”后的hash,使用hmac算法比标准hash算法更安全,因为针对相同的message,不同的key会产生不同的hash

import hmac
message = b'Hello,world!'
key = b'secret'
h = hmac.new(key, message, digestmod='MD5')
print(h.hexdigest()) 结果:
21db988f124ebc9fade5492afb9df52d

3、itertools

Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数

(1)count

count()会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出

import itertools
natuals = itertools.count(1)
for i in natuals:
print(i)

(2)cycle

cycle()会把传入的一个序列无限重复下去

import itertools
cs = itertools.cycle('ABC')
for i in cs:
print(i)

(3)repeat

repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数

import itertools
ns = itertools.repeat('A', 3)
for i in ns:
print(i) 结果:
A
A
A

(4)takewhile

无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素

无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列

import itertools
natuals = itertools.count(1)
ns = itertools.takewhile(lambda x:x<=10, natuals)
for i in ns:
print(i) 结果:
1
...
10

(5)chain

chain()可以把一组迭代对象串联起来,形成一个更大的迭代器

import itertools
for c in itertools.chain('ABC',''):
print(c) 结果:
A
B
C
1
2
3

(6)groupby

groupby()把迭代器中相邻的重复元素挑出来放在一起

实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key

如果我们要忽略大小写分组,就可以让元素'A''a'都返回相同的key

import itertools
for key,group in itertools.groupby('monent'):
print(key,list(group)) for key,group in itertools.groupby('AAaaaBBBbbccC', lambda c:c.upper()):
print(key,list(group)) 结果:
m ['m']
o ['o']
n ['n']
e ['e']
n ['n']
t ['t']
A ['A', 'A', 'a', 'a', 'a']
B ['B', 'B', 'B', 'b', 'b']
C ['c', 'c', 'C']

4、contextlib

在Python中,读写文件这样的资源要特别注意,必须在使用完毕后正确关闭它们。正确关闭文件资源的一个方法是使用try...finally

try...finally非常繁琐,使用Python的with语句更加方便

#try..finally...
try:
f = open('/path/to/file', 'r')
f.read()
finally:
if f:
f.close() #with
with open('/path/to/file', 'r') as f:
f.read()

实现上下文管理是通过__enter____exit__这两个方法实现的,任何对象只要正确实现了上下文管理,就可以用于with语句

@contextmanager

编写__enter____exit__仍然很繁琐,因此Python的标准库contextlib提供了更简单的写法

@closing

如果一个对象没有实现上下文,我们就不能把它用于with语句。这个时候,可以用closing()来把该对象变为上下文对象

Python学习之旅(二十七)的更多相关文章

  1. Python学习之旅(十七)

    Python基础知识(16):面向对象编程(Ⅰ) 类和实例 类是抽象的模板 实例是根据类创建出来的一个个具体的对象,每个对象都拥有相同的方法,但各自的数据可能不同. 类可以在创建实例的时候,把一些我们 ...

  2. python学习笔记(二十七)多线程与多进程

    线程是程序里面的最小执行单元. 进程是资源的集合. 线程是包含在一个进程里面,一个进程可以有多个线程,一个进程里面默认有一个主线程.由主线程去启动子线程. 1.多线程 import threading ...

  3. 180分钟的python学习之旅

    最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...

  4. Python学习笔记(二)——列表

    Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...

  5. python学习02python入门二

    学前须知:1.本文档有关内容均建立在python3.x版本上,python2.x已经成为历史,如有需要,文内会特别说明. 2.本文使用的编辑器多为架构在Windows上的pycharm,如需了解Lin ...

  6. 【Python学习笔记之二】浅谈Python的yield用法

    在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...

  7. Python学习笔记(二):条件控制语句与循环语句及常用函数的用法

    总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...

  8. Python学习系列(二)(基础知识)

    Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...

  9. 滴滴Booster移动APP质量优化框架 学习之旅 二

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...

  10. python学习之旅

    python学习分类 python基础    +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...

随机推荐

  1. Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)

    序号 书名 原版书名 作者 译者 出版社 页数 年代 定价 备注 1 C++Builder 5程序设计大全 C++Builder 5 Developer's Guide Jarrod Hollingw ...

  2. 【ASP.NET Core】从向 Web API 提交纯文本内容谈起

    前些时日,老周在升级“华南闲肾回收登记平台”时,为了扩展业务,尤其是允许其他开发人员在其他平台向本系统提交有关肾的介绍资料,于是就为该系统增加了几个 Web API. 其中,有关肾的介绍采用纯文本方式 ...

  3. IDEA创建多个模块MavenSpringBoot项目

    最近在学习springboot,先从创建项目开始,一般项目都是一个项目下会有多个模块,这里先创建一个最简单的实例,一个项目下有一个springboot模块项目提供web服务,引用另一个java项目(相 ...

  4. 远程FTP下载文件

    现在存在以下环境: 远程服务器:192.168.1.107 用户名:dt 密码:dt123 需要从该服务器上下载文件到本地 1.登录(进入到那个目录登录的 ,文件就会被下载到该文件) ftp 192. ...

  5. 如何快速申请苹果IOS个人开发者账号

    在上周我有一同事,他利用周末的时间自己做了一个IOS版本游戏类APP,用Unity3D开发的(抱着好玩的心态),于是他想发布到苹果App Store 上去.他没有苹果开发者账号,也没有购买过. 于是找 ...

  6. 【20180409】IT管理之IT十二条令

    团队越来越大,靠人管几乎有力无心,只能靠制度管理了. 前段时间对部门颁布了12条令,效果明显. 特此Mark. 汇报: 三条总结:汇报讲究精简,一个事情最多一句话概括. 一页报告:内容精简,报告一页w ...

  7. CSS 水平居中与垂直居中

    前言 在CSS布局中,水平居中与垂直居中一直是用到比较多的,在本篇中将介绍水平居中.垂直居中的几种方式. 示例 HTML: <div class="parent"> & ...

  8. adb获得安卓系统版本及截屏

    [时间:2017-09] [状态:Open] [关键词:adb, android,系统版本,截屏,screencap] 本文主要是我遇到的android命令行用法的一个简单总结 系统版本 获取系统版本 ...

  9. 阿里java代码检测工具p3c

    阿里在杭州云栖大会上,正式发布众所期待的<阿里巴巴Java开发规约>扫描插件! 该插件由阿里巴巴P3C项目组研发.这个项目组是阿里巴巴开发爱好者自发组织形成的虚拟项目组,把<阿里巴巴 ...

  10. halcon电路断裂检测

    read_image (Image, 'pcb')dev_close_window ()get_image_size (Image, Width, Height)dev_open_window (0, ...