python必知必会6

作者: Nefelibatas | 来源:发表于2022-03-04 15:13 被阅读0次

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 只在相互之间可以信任的情况下进行使用。

相关文章

  • python必知必会6

    Python中生成随机整数、随机小数、0—1之间小数方法 生成随机整数使用random.randint()生成随机...

  • 一些课程或书

    Excel 数据库《MySQL必知必会》 Python《Python Cookbook》《Web scraping...

  • 优秀参考文章--性能优化

    Android 性能优化必知必会Android 性能优化必知必会

  • python必知必会1

    新篇章系列开启,围绕两个部分,一是python编程基础与特性,二是数据结构与算法。 Q:列表和元组之间的区别是什么...

  • python必知必会8

    什么是闭包? 实现闭包的要素是哪些?闭包中的自由变量的绑定?nonlocal 的使用? 在一个内部函数中,对外部作...

  • python必知必会9

    生成器和迭代器 迭代是处理数据的重要环节,基本上对大量数据的处理上,我们都需要对数据进行迭代操作,如何在节省内存开...

  • python必知必会3

    如何求两个列表的交集、差集、并集? 求交集: list(set(a) & set(b))求差集: list(set...

  • python必知必会5

    Python 的 super 方法有什么用? 面向对象编程的主要优点之一是重用。继承是实现继承的机制之一。 在继承...

  • python必知必会4

    解释一下 python 中 pass 语句的作用 pass是一个空操作。当它被执行时,什么都不发生。它适合当语法上...

  • python必知必会11

    Python 里面如何拷贝一个对象? 直接赋值:其实就是对象的引用(别名)。 浅拷贝 (shallow copy)...

网友评论

    本文标题:python必知必会6

    本文链接:https://www.haomeiwen.com/subject/njfmrrtx.html