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

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