Python中生成随机整数、随机小数、0—1之间小数方法
生成随机整数使用random.randint()
生成随机小数、0—1之间小数方法使用random.random()
除了生成随机数,random模块还包含基于均匀分布、高斯分布和其他分布的随机数生成函数。比如,random.uniform() 计算均匀分布随机数,random.gauss() 计算正态分布随机数。
如何利用 collections 库中的 counter 方法统计字符串中每个单词出现的次数?
from collections import Counter
print(" ".join(map(lambda x: x[0] + str(x[1]), Counter("kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h").most_common())))
most_common可以用来产生n个最常遇到的输入值及其各自计数的序列。
在底层实现上,一个Counter对象就是一个字典,将元素映射到它出现的次数上。
collections 中的常用模块
collections模块是一个常用到的模块,这个模块实现了特定目标的容器,以提供Python标准内建容器dict,list,set和 tuple的替代选择。
OrderedDict可以实现一个有序的字典,但是在Python3.7之后,内置的dict也可以保留插入的顺序,那么OrderedDict就没有那么重要了。不过它还是有存在的意义的,常规的dict被设计为非常擅长映射操作。OrderedDict旨在擅长重新排序操作。所以,算法上,OrderedDict可以比 dict更好地处理频繁的重新排序操作。
defaultdict为字典的不存在的key提供一个默认的值,这样可以减少一些KeyError异常。
>>> from collections import OrderedDict, defaultdict,
>>> default_dict = defaultdict(str)
>>> default_dict['s'] # 一般的字典,如果键s不存在的话,会引发KeyError,而这里我们发现输出是一个默认的空字符
>>> print(default_dict) # defaultdict(<class 'str'>, {'s': ''})
nametuple是特殊tuple子类,可以用名字和下标来访问元组。它可以构建只有少数属性但是没有方法的对象,比如数据库条目。
>>> Person = collections.nametuple('Person', ['name', 'age'])
>>> p1 = Person(name='bob', age=17)
deque双端队列,可以快速的从另外一侧追加和推出对象。
在我们需要从容器的两端更快地执行追加和弹出操作的情况下,与列表相比,首选双端队列,因为与提供O(n)时间复杂度的列表相比,双端队列为追加和弹出操作提供了O(1)时间复杂度。
>>> de = collections.deque([1,2,3])
>>> de.append(4) # deque([1, 2, 3, 4])
>>> de.pop() # 4
>>> de.popleft() # 1
什么是 pickling 和 unpickling ?
所有程序都要处理输入和输出,即IO编程。在IO编程中,输入就是将数据从外面(磁盘、网络)流进内存,输出就是将数据从内存流到外面去。可能你会碰到这样的问题,将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络进行传输。
** Python中特定的序列化模块是pickle,而且它只能用于Python对象。**所以我们可以谈谈pickle和其它一些对象序列化的区别和优势,以及对象序列化的使用场景。
模块 pickle 实现了对一个Python对象结构的二进制序列化和反序列化。把变量从内存中变成可存储或传输的过程称之为序列化,反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。
pickling 是将Python对象及其所拥有的层次结构转化为一个字节流的序列化过程,而 unpickling 则是是反序列化。
常用的两个接口dump()和load():
dump():序列化某个包含层次结构的对象,并把序列化对象写入文件
dumps(): 把任意对象序列化成一个bytes
load():反序列化数据流
import pickle
class Foo:
attr = 'A class attribute'
file = open('dump.txt', 'wb') # b表示二进制
picklestring = pickle.dump(Foo, file) # 序列化一个Python类
file.close()
f = open('dump.txt', 'rb')
d = pickle.load(f) # 反序列化
f.close()
Python中还有另外一种序列化,即序列化一种更为通用的格式,而不是只能用于Python对象。所以Python中的json模块可以允许JSON序列化和反序列化的标准库模块。
我们知道,在网络传输中,JSON的使用非常普遍。那我们就来说说pickle和json方式之间有什么区别。
因为JSON是一个文本序列化格式,所以json模块的序列化输出是文本对象(unicode),但是上面说了pickle序列化的输出是二进制字节(bytes)。
json模块的序列化的输出JSON是可以直接阅读的,可读性更好,而pickle序列化的输出不能。
JSON格式是多语言支持的,广泛的兼容性,所以它能被用于Python以外的系统。pickle所使用的数据格式仅可用于Python。这样做的好处是没有外部标准给该格式强加限制。
json模块只能序列化一部分Python内置的类型,不能表示用户自定义的类对象。pickle则能表示大多数对象,包括用户自定义的类。
pickle 是个不安全的模块。要记住:永远不要去反序列化不信任的数据。因为pickle在进行反序列化加载时会自动加载相应模块并构造实例对象。如果这个被加载的模块中含有一些恶意数据去让Python执行随意指定的系统命令,那么后果会很严重。因此,一定要保证 pickle 只在相互之间可以信任的情况下进行使用。
网友评论