• python编码和小数据池


    python_day_6

    一. 回顾上周所有内容
    一. python基础

    1. Python是一门解释型. 弱类型语言
    2. print("内容", "内容", end=" ") 打印语句
    3. 变量: 程序运行过程中产生的中间值. 存储在内存中.供后面的程序调用
    4. 变量的数据类型:

        int, 整数

    str, 字符串

    bool, True,False

      5. 命名规则:

    1.  由数字,字母,下划线组成
    2. 不能是纯数字或者数字开头
    3. 不能是关键字
    4. 不能太长
    5. 要有意义
    6. 不要用中文
    7. 区分大小写
    8. 推荐使用驼峰和下划线命名
    9. input() 用户输入
    10. if 判断

    if 条件:
    代码块
    else:
    代码块

    if 条件:
    代码块
    elif 条件2:
    代码块
    ..
    else:
    二. while循环
    while 条件:
    循环体
    else:
    代码块
    流程:
    判断条件是否为真. 如果真.执行循环体. 再次判断条件是否真. ....直到条件为假. 执行else. 退出循环

    break 直接打断循环.
    continue 停止当前本次循环. 继续执行下一次循环

    格式化输出:
    %s 字符串
    %d 数字

    运算符:
    逻辑运算
    1. and. 两端同时为真. 结果才是真.
    2. or 或者. 两端有一个是真. 结果就是真
    3. not 取反.

    () => not => and => or
    x or y
    如果x非零, x, 否则 y

    编码:

    1. ASCII. 8bit, 1byte
    2. GBK, 16bit, 2byte
    3. unicode, 32bit,4byte
    4. UTF-8, 英文:8bit, 1byte, 欧洲: 16bit, 2byte, 中文: 24bit, 3byte

    3. 基本数据类型

    1. int 数字. bit_length() 二进制长度
    2. bool 空:False, 非空:True
    3. str, 字符串不可变

    索引切片: 由0开始
    [起始位置: 结束位置: 步长]
    操作:

    1. upper() 变成大写
    2. strip() 去掉空格(两端)
    3. replace() 替换
    4. split() 切割
    5. startswith() 以xxx开头(判断)
    6. find() 找xxx字符串在原字符串中出现的索引位置. 找不到返回-1
    7. count() 数数
    8. format() 格式化输出
    9. len() 求长度

    4. 列表:
    由[]表示
    有索引和切片
    常用操作:
    增加:append(), insert(), extend()
    删除:pop() remove() del, clear()
    修改:索引切片修改
    查询:
    for 变量 in 可迭代对象:
    循环体
    else:

    操作:
    sort(reverse=True) 排序
    reverse() 翻转
    len() 长度
    count() 数数

    元组:
    tuple, 只读列表, 由()组成. 不可变的
    索引和切片. for循环


    解构, 解包
    a, b = 1, 2

    range(10) 0-9
    range(5, 10) 5-9
    range(5,10,3) 5,8

    5. dict 字典
    由{}表示. 存储key:value 键值对. 根据key来计算hash值.找到对应的内存地址.
    key必须是可hash的. 不可变的. int, str, 元组, bool

    操作:
    增加: dict[key] = value
    setdefault(key, value)
    删除: pop(key), del , popitems(), clear()
    修改: dict[key] = value
    查询:dict[key], get(key, 默认值),
    setdefault() 先执行新增那个流程. 然后.获取到key对应的值

    常规操作:
    keys() 获取所有的key.返回的像个列表
    values() 获取所有value
    items() 获取所有的key,value.装成元组. 返回列表[(key,value), (key,value)]

    通过items()获取的是k,v
    for k,v in dict.items():

    直接循环遍历. 拿到的是key
    for k in dict:


    二. 今日主要内容

    1. is 和 == 区别
    id()函数
    == 判断两边的值
    is 判断内存地址
    回顾编码:
    1. ASCII: 英文, 特殊字符, 数字, 8bit, 1byte
    2. GBK: 中文 16bit, 2byte. 兼容ASCII
    3. unicode: 万国码, 32bit 4byte. 兼容ASCII
    4. UTF-8: 长度可变的unicode. 英文:8bit, 欧洲:16bit, 中文:24bit 3byte

    python2 只能用ASCII
    python3 有unicode, 默认的编码就是unicode
    内存里用的是unicode. 硬盘和网络传输用的是utf-8或者GBK

    2. encode() 编码. 获取到的是编码之后的结果. bytes
    3. decode() 解码. 把bytes编程我们熟悉的字符串


    06. 万恶之源-再谈编码
    本节主要内容:

    1. is和==的区别
    2. 编码的问题

    ⼀. is和==的区别
    1. id()
    通过id()我们可以查看到⼀个变量表⽰的值在内存中的地址

       s = "alex 是 大 xx"
            abc = id(s)   # 得到内存地址
            print(abc)
    
            lst = ["大阳哥", "佳琪哥", "小花生", "燃哥"]
            print(id(lst))  # 就是一个内存地址. 毫无意义
    
            lst = ["周杰伦", "燃哥"]
            lst1 = ["周杰伦", "燃哥"]
            print(id(lst))
            print(id(lst1))
    
            s = "燃哥"
            s1 = "燃哥"
            # 小数据池. 会对字符串进行缓存, 为了节省内存
            print(id(s))
            print(id(s1))
    
            tu = ("燃哥", "周杰伦")
            tu1 = ("燃哥", "周杰伦")
            print(id(tu), id(tu1))
    
            dic = {"a": "b", "c":"d"}
            dic1 = {"a": "b", "c":"d"}
            print(id(dic), id(dic1))
    
            a = 10
            b = 10
            print(id(a), id(b))
    
            布尔也有,
            a = True
            b = True
            print(id(a), id(b))
    
            -5
            a = 257
            b = 257
            print(id(a), id(b))
    
            a = "小威"
            b = "小威"
            print(id(a), id(b))
    
            1. id() 查看内存地址
            2. str 有小数据池的
    
            == is id
            == 判断. 左右两端是否相等和一致, 比较的是内容
            is 判断. 判断的是内存地址  id()的值来判断    内存地址
    
            lst = ["马化腾", "小威"]
            lst2 = ["马化腾", "小威"]
            print(lst == lst2)  # True
            print(lst is lst2)  # False
    
            s = "alex"
            print("1111111111")
            print("1111111111")
            print("1111111111")
            print("1111111111")
            print("1111111111")
            print("1111111111")
            print("1111111111")
            print("1111111111")
            print("1111111111")
    
            s2 = "alex"
            print(s == s2) # True
            print(s is s2)  # True. 小数据池
    
            s1 = "@akljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdklakljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdkl"
            s2 = "@akljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdklakljflkasdjklfjkasdlfjklsdajfklsdajfklasdjkflasdjklfjsdaklfjsdakljfklasdjfklsdajfklsdajfklsdajklfsjadklfjsadklfjasdkljfklsdjfklsdjfklsdjfklsdjfklasdjfklasdjklfjasdkl"
            print(id(s1), id(s2))
    
            s = "abc中def"
            print(s.title())

    ⼩数据池(常量池): 把我们使⽤过的值存储在⼩数据池中.供其他的变量使⽤.
    ⼩数据池给数字和字符串使⽤, 其他数据类型不存在.
    对于数字: -5~256是会被加到⼩数据池中的. 每次使⽤都是同⼀个对象.
    对于字符串:

    1. 如果是纯⽂字信息和下划线. 那么这个对象会被添加到⼩数据池
    2. 如果是带有特殊字符的. 那么不会被添加到⼩数据池. 每次都是新的
    3. 如果是单⼀字⺟*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加到⼩数据池中

    注意(⼀般情况下): 在py⽂件中. 如果你只是单纯的定义⼀个字符串. 那么⼀般情况下都是会
    被添加到⼩数据池中的. 我们可以这样认为: 在使⽤字符串的时候, python会帮我们把字符串
    进⾏缓存, 在下次使⽤的时候直接指向这个字符串即可. 可以节省很多内存.
    这个问题千万不要纠结. 因为官⽅没有给出⼀个完美的结论和定论.所以只能是⾃⼰摸索.
    以下内容摘⾃官⽹中关于id()的描述
    Return the “identity” of an object. This is an integer which is
    guaranteed to be unique and constant for this object during its
    lifetime. Two objects with non-overlapping lifetimes may have the
    same id() value.
    CPython implementation detail: CPython implementation detail: This is the address of the object in
    memory.
    说了这么多. 这个id()和is有什么关系呢. 注意. is比较的就是id()计算出来的结果. 由于id是帮我
    们查看某数据(对象) 的内存地址. 那么is比较的就是数据(对象)的内存地址.
    最终我们通过is可以查看两个变量使⽤的是否是同⼀个对象.
    == 双等表⽰的是判断是否相等, 注意. 这个双等比较的是具体的值.⽽不是内存地址

    总结:
    is 比较的是地址
    == 比较的是值
    二. 编码的补充
    1. python2中默认使⽤的是ASCII码. 所以不⽀持中⽂. 如果需要在Python2中更改编码.
    需要在⽂件的开始编写:

    2. python3中: 内存中使⽤的是unicode码.

    编码回顾:
    1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符. 没有中⽂,
    8个01代码, 8个bit, 1个byte
    2. GBK: 中⽂国标码, ⾥⾯包含了ASCII编码和中⽂常⽤编码. 16个bit, 2个byte
    3. UNICODE: 万国码, ⾥⾯包含了全世界所有国家⽂字的编码. 32个bit, 4个byte, 包含了
    ASCII
    4. UTF-8: 可变⻓度的万国码. 是unicode的⼀种实现. 最⼩字符占8位
    1.英⽂: 8bit 1byte
    2.欧洲⽂字:16bit 2byte
    3.中⽂:24bit 3byte

    综上, 除了ASCII码以外, 其他信息不能直接转换.
    在python3的内存中. 在程序运⾏阶段. 使⽤的是unicode编码. 因为unicode是万国码. 什么内
    容都可以进⾏显⽰. 那么在数据传输和存储的时候由于unicode比较浪费空间和资源. 需要把
    unicode转存成UTF-8或者GBK进⾏存储. 怎么转换呢. 在python中可以把⽂字信息进⾏编码.
    编码之后的内容就可以进⾏传输了. 编码之后的数据是bytes类型的数据.其实啊. 还是原来的
    数据只是经过编码之后表现形式发⽣了改变⽽已.
    bytes的表现形式:
    1. 英⽂ b'alex' 英⽂的表现形式和字符串没什么两样
    2. 中⽂ b'xe4xb8xad' 这是⼀个汉字的UTF-8的bytes表现形式
    字符串在传输时转化成bytes=> encode(字符集)来完成

        s = "alex马"
        想要存储.必须进行编码
    
        encode() 编码之后的内容是bytes类型的数据
    
        30个字节 10个字. 每个字3个字节
        b'xe6x9dx8exe5x98x89xe8xafx9axe7x9ax84xe5x84xbfxe5xadx90xe8xa2xabxe7xbbx91xe6x9exb6xe4xbax86'
        bs = s.encode("UTF-8")   # 把字符串编码成UTF-8的形式
        print(bs)
    
        #英文:编码之后的结果是英文本身
        #中文:编码之后UTF-8 下. 一个中文3个字节

    记住: 英⽂编码之后的结果和源字符串⼀致. 中⽂编码之后的结果根据编码的不同. 编码结果
    也不同. 我们能看到. ⼀个中⽂的UTF-8编码是3个字节. ⼀个GBK的中⽂编码是2个字节.
    编码之后的类型就是bytes类型. 在⽹络传输和存储的时候我们python是保存和存储的bytes
    类型. 那么在对⽅接收的时候. 也是接收的bytes类型的数据. 我们可以使⽤decode()来进⾏解
    码操作. 把bytes类型的数据还原回我们熟悉的字符串:

    s = "饿了么"
    bs = s.encode("GBK")    # b'xb6xf6xc1xcbxc3xb4' GBK 一个中文:2个字节
    print(bs)
    
    s = ""
    print(s.encode("utf-8"))
    print(s.encode("GBK"))
    
    decode()解码

    编码和解码的时候都需要制定编码格式.

    bs = b'xb6xf6xc1xcbxc3xb4'    # 从别人那里读到的   GBK
    # # 编程人认识的东西
    s = bs.decode("GBK")    # 解码之后是字符串, 用什么编码就用什么解码
    # print(s)
    
    # GBK => utf-8
    bs = b'xb6xf6xc1xcbxc3xb4'
    # 先解码成unicode字符串
    s = bs.decode("GBK")
    # 在把字符串编码成UTF-8
    bss = s.encode("UTF-8")
    print(bss)

    作业:

    一,老男孩好声⾳选秀⼤赛评委在打分的时候呢, 可以进⾏输入. 假设, 老男孩有10个评委.
    让10个评委进⾏打分, 要求, 分数必须⼤于5分, ⼩于10分.
    count = 1
    while count <= 10:
        print("%s号评委" % (count))
        s = int(input("开始打分(分数必须⼤于5分, ⼩于10分):"))
        if s <= 5 or s >= 10:
            print("不符合评分要求,请重新打分:")
            continue
        count += 1
    二. 电影投票. 程序先给出⼀个⽬前正在上映的电影列表. 由⽤户给每⼀个电影投票.
    最终 将该⽤户投票信息公布出来 lst = ['⾦瓶梅', '解救吾先⽣', '美国往事', '⻄⻄⾥的美丽传说']
    结果: {'⾦瓶梅': 99, '解救吴先⽣': 80, '美国往事': 6, '⻄⻄⾥的美丽传说': 23}
    lst = ['⾦瓶梅', '解救吾先⽣', '美国往事', '⻄⻄⾥的美丽传说']
    dic = {}
    a = 0
    for i in lst:
        print(lst[a])
        s = int(input("请为该电影打分:"))
        dic[lst[a]] = s
        a += 1
    print(dic)
    三.念数字.  给出一个字典. 在字典中标识出每个数字的发音. 包括相关符号. 然后由
    用户输入一个数字. 让程序读出相对应的发音(不需要语音输出. 单纯的打印即可)
    dic = {
        "-":"fu",
        "0":"ling",
        "1":"yi",
        "2":"er",
        "3":"san",
        "4":"si",
        "5":"wu",
        "6":"liu",
        "7":"qi",
        "8":"ba",
        "9":"jiu",
        ".":"dian"
    }
    a = 0
    s = input("请输入一个数字:")
    for i in s:
        if i in dic.keys():
            print(dic[i],end = " ")
    四.车牌区域划分, 现给出以下车牌. 根据车牌的信息, 分析出各省的车牌持有量. (升级题)
    car = ['鲁A32444','鲁B12333','京B8989M','黑C40678','黑C46555','沪B25041']
    locals = {'':"上海",'':'黑龙江','':'山东','':'湖北','':'湖南','':'北京'}
    dic = {}
    li = []
    for i in range(len(car)):
        for a in locals:
            if car[i][0] in a:
                li.append(locals[a])
    for b in li:
        dic[b] = li.count(b)
    print(dic)
    五.干掉主播. 现有如下主播收益信息, 按照要求, 完成相应操作:
    1.计算各位主播收益的平均值.
    zhubo = {'卢本伟':122000,'冯提莫':189999,'金老板':99999,'吴老板':25000000,'alex':126}
    sum = 0
    for i in zhubo.values():
        sum = sum + i
        a = sum / len(zhubo)
    print("这些主播的平均收入是:%s" % (a))
    2.干掉收益小于平均值的主播.
    for i in list(zhubo):
        if zhubo[i] < a:
            del zhubo[i]
    print(zhubo)
    3.干掉卢本伟.
    del zhubo["卢本伟"]
    print(zhubo)

    2018-07-09  16:12:38

    “继续奔跑 输掉一切也不要输掉微笑”

  • 相关阅读:
    记某b/s项目维护思路及心得
    Csla.Net架构学习总结
    ado.net entity framework使用odp.net(ODAC for .net)连接oracle11g体验
    向北走,还是向南走。也谈创业...
    星级豪华酒店如何提高利润回报率
    .net compact framework2.0 Wince智能设备开发项目经验分享 .net拖空间之进阶篇
    Cipherlab CPT9300手持扫描枪开发体验
    LogMiner日志分析工具的使用
    微软首度承认Linux威胁Windows
    有关SYSDATE与DBLINK的问题
  • 原文地址:https://www.cnblogs.com/zycorn/p/9284325.html
Copyright © 2020-2023  润新知