1.collections模块中有一个namedtuple函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素,这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。
举例: >>>from collections import namedtuple
>>>b=namedtuple('b',['x','y'])
>>>a=b(1,2)
>>> a.x
1
>>> a.y
2
这其实就是用namedtuple来自定义了一个类型为tuple的只有属性的简单类,b是类型名,x,y是b的属性,然后a又相当于b的一个实例对象。
2.collections模块中有一个deque函数使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
举例: >>> from collections import deque
>>> a=deque(['1','1','2','3','4','5','6','7','6','6','5','4','4','3','3','2','2','6','7','8'])
>>> a.append('x')
说明:deque函数就是将实参列表进行处理返回一个双向列表,这样就加快了列表的增加和删除大量数据的效率了
3.collections模块中Counter函数是一个简单的计数器。
举例: from collections import Counter
>>> c=Counter()
>>> for i in 'nanjinghebeijing':
c[i]=c[i]+1
>>> c
Counter({'n': 4, 'i': 3, 'e': 2, 'g': 2, 'j': 2, 'b': 1, 'h': 1, 'a': 1})
说明:从上例中可以发现,其实counter()函数返回的其实一个字典,因为Counter实际上也是dict的一个子类,而该字典中的key是新添加的,value则是初始值为0
综上所述:其实collections模块提供了一些有用的集合类,可以根据需要选用
4.Base64是一种最常见的二进制编码方法,当我们用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以
如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。
举例: >>> a='我是汉字'
>>> b=a.encode('utf-8')
>>> type(b)
>>> base64.b64encode(b)
b'5oiR5piv5rGJ5a2X'
>>> b=b'asdasd'
>>> type(b)
>>> base64.b64encode(b)
b'YXNkYXNk'
说明:3.x版本中base不能直接对汉字字符串进行编码,否则报错'str' does not support the buffer interface,只能对二进制的数字,字母字符串进行转码,所以总的来说,
base64转码只能对二进制字符串(也就是byte类型的字符串)进行转码
5.base64由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉,去掉=后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了,Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据
6.由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_;
7.Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等,摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
MD5举例:>>> import hashlib
>>> a=hashlib.md5()
>>> a.update('wo de mi ma shi ?'.encode('utf-8'))
>>> print(a.hexdigest())
a9c67ba92fab3d497443e0f7f34b5372
>>> type(a)
说明:hashlib.md5()是一个类,a是类的一个实例,update()函数里面的实参是二进制字符串。而对于sha1算法和MD5的用法是一样的,就把上面的hashlib.MD5换成hashlib.sha1
8.python3.x版本中的字符串转换为二进制:
举例: >>> a=b'我是谁'
SyntaxError: bytes can only contain ASCII literal characters.
>>> a='我是谁'.encode('utf-8')
>>> type(a)
说明:汉字字符串只能通过UTF-8转换为二进制,而不能通过b'汉字'来进行转换为二进制
9.有没有可能两个不同的数据通过某个摘要算法得到了相同的摘要?完全有可能,因为任何摘要算法都是把无限多的数据集合映射到一个有限的集合中,这种情况称为碰撞。
10.Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数和“无限”迭代器,itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是Iterator
只有用for循环迭代的时候才真正计算
一、itertools提供的几个无限迭代器
count(n)无限迭代器
举例: >>> import itertools
>>> a=itertools.count(2)
>>> for i in a:
print(i)
2
3
4
5
6
7
说明:count(n)无限迭代器中,n表示从哪个数字开始,因为count()会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出。
cycle无线迭代器:将传入的序列进行无限重复(字符串也是序列)
举例: >>> import itertools
>>> b=itertools.cycle('abcdefg')
>>> for i in b:
print(i)
a
b
c
d
e
f
g
a
b
c
d
e
f
g
repeat()负责把一个参数无限重复下去,不过如果提供第二个参数就可以限定重复次数
举例: >>> a=itertools.repeat('asda',5)
>>> for i in a:
print(i)
asda
asda
asda
asda
asda
二、itertools提供的几个迭代器操作函数更加有用
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器,也就是更大的可迭代对象
举例:for i in itertools.chain('uyi','uyiyu','asdas','dasdasd'):
print(i)
u
y
i
u
y
i
y
.
.
.
takewhile()函数根据条件判断来截取出一个有限的序列
举例: >>> a=itertools.count()
>>> for i in itertools.takewhile(lambda x:x<=5,a):
print(i)
0
1
2
3
4
5
说明:这个函数的功能就是利用第一个参数表达式,来限制第二个参数(迭代器)的输出,其中第一个参数表达式是一个函数。
11.序列:包括列表、元组、字符串、Unicode字符串、buffer对象和xrange对象,列中的每个元素被分配一个序号——即元素的位置,也称为索引。第一个索引是 0,第二个则是 1,以此类推。序列中的最后一个元素标记为 -1,倒数第二个元素为 -2,一次类推,因此,集合和字典不是序列,因为他们都用key指定一个value而不是用索引