• 序列化 random模块应用


    序列化

    我们今天学习下序列化,什么是序列化呢? 将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。

    为什么要有序列化模块: 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。 但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串, 但是你要怎么把一个字符串转换成字典呢? 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。 eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。 BUT!强大的函数有代价。安全性是其最大的缺点。 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。 而使用eval就要担这个风险。 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

    序列化的目的

    1、以某种存储形式使自定义对象持久化;
    2、将对象从一个地方传递到另一个地方。
    3、使程序更具维护性。

    json

    Json模块提供了四个功能:dumps、dump、loads、load

    dumps 及 loads

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import json
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
    print(type(str_dic),str_dic)  #<class 'str'> {"k3""v3""k1""v1""k2""v2"}
    #注意,json转换完的字符串类型的字典中的字符串是由""表示的
    dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
    #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    print(type(dic2),dic2)  #<class 'dict'> {'k1''v1''k2''v2''k3''v3'}
    list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
    str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型
    print(type(str_dic),str_dic) #<class 'str'> [1, ["a""b""c"], 3, {"k1""v1""k2""v2"}]
    list_dic2 = json.loads(str_dic)
    print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a''b''c'], 3, {'k1''v1''k2''v2'}]

    dump 及 load

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import json
    f = open('json_file','w')
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    f.close()
    f = open('json_file')
    dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    f.close()
    print(type(dic2),dic2) 

    其他参数说明

     参数说明

    json格式化输出

    1
    2
    3
    4
    import json
    data = {'username':['李华','二愣子'],'sex':'male','age':16}
    json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
    print(json_dic2)

    pickle模块

    用于序列化的两个模块

    json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)pickle是python特有的模块.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import pickle
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = pickle.dumps(dic)
    print(str_dic)  #一串二进制内容
    dic2 = pickle.loads(str_dic)
    print(dic2)    #字典
    import time
    struct_time  = time.localtime(1000000000)
    print(struct_time)
    f = open('pickle_file','wb')
    pickle.dump(struct_time,f)
    f.close()
    f = open('pickle_file','rb')
    struct_time2 = pickle.load(f)
    print(struct_time2.tm_year)

    这时候机智的你又要说了,既然pickle如此强大,为什么还要学json呢? 这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。 如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。 但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~ 所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块 但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle

    总结:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    json模块里的dumps是将python的数据结构转换成字符串,loads是将字符串类型转换成python的数据结构
        json模块里的dump是将python的数据结构转换成字符串,然后存入到文件当中
        json模块里的load是将文件中字符串类型转换成python的数据结构
        pickle模块里的dumps是将python的数据结构转换成二进制的文件,loads是将二进制的文件转换成python的
            数据结构
        pickle模块里的dump是将python的数据结构转换成二进制然后存入到文件中
        pickle模块里的load是将文件中的二进制文件转成python的数据结构

    random 模块

    random是一个随机数模块,我们一般用来生成一些没有规则的内容

    获取0-1之间的随机小数

    1
    2
    import random
    print(random.random())

    我们可以获取0到1之间的随机的小数,但是还能够满足你,你想要生成指定的数字内的随机小数怎么办??

    1
    2
    import random
    print(random.uniform(1,5))

    这样写完后,你就有又想法了,说小数你实现了.整数怎么做到随机呢?老铁别急

    1
    2
    import random
    print(random.randint(1,5))

    你这样是实现了,我想让你给生成随机的奇数和偶数,怎么样不会了吧??

    1
    2
    3
    import random
    print(random.randrange(1,5,2))   #随机生成1-5的奇数
    print(random.randrange(0,5,2))   #随机生成0-5的偶数

    我还真发现了,真有点难不住你了,我现在有一个列表 lst = ['张开','宝元','佩奇','太白'],你给我随机抽一个人出来

    1
    2
    3
    import random
    lst = ['张开','宝元','佩奇','太白']
    print(random.choice(lst))

    看来还是有两把刷子的,我在考考你.怎么给我随机抽出两个来  

    1
    2
    3
    import random
    lst = ['张开','宝元','佩奇','太白']
    print(random.choices(lst,k=2))

    差点就被你骗你了,要不是我眼疾手快,发现了你随机出来的两个内容是有重复的,我还就要夸你了,没有满足需求重新实现

    1
    2
    3
    import random
    lst = ['张开','宝元','佩奇','太白']
    print(random.sample(lst,k=2))

    可以啊,真是少年有为啊,难不住了,看来事要逼着我使用绝招了.我给你一个列表你给我让他变成随机排序的

    1
    2
    3
    4
    import random
    lst = [1,2,3,4,5,6]
    random.shuffle(lst)
    print(lst)
    当你的才华还撑不起你的野心的时候,你就应该静下心来学习; 当你的能力还驾驭不了你的目标时,就应该沉下心来历练。
  • 相关阅读:
    Django Rest Framework(认证、权限、限制访问频率)
    MySql 三大知识点——索引、锁、事务
    django聚合查询
    Python装饰器用法
    linux上ssh免密登录原理及实现
    为github公开项目单独设置用户名
    golang协程池设计
    Django-Signals信号量
    linux tcp相关参数
    记一次性能优化,限制tcp_timewait数量,快速回收和重用
  • 原文地址:https://www.cnblogs.com/ellisonzhang/p/10277231.html
Copyright © 2020-2023  润新知