码迷,mamicode.com
首页 > 其他好文 > 详细

18/5/4 小数据池,编码的进阶

时间:2018-06-14 11:27:12      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:har   变化   error:   TE   正是   之间   ==   type   idt   

一、内存地址(id):

  变量:将计算的中间结果储存起来,以便后续代码使用

    问题来了:变量存在哪里呢,或许可以这样问:变量储存在内存哪里呢?

      内存会进行分区,每个分区都有一个序号,而每个分区里面都储存着数据,变量就来自这里,而分区的序号就叫内存地址

  python 这门语言不像 C 语言,C 语言是属于内存级别的语言,C 涉及到指针,内存。而 python 不同,它的内存级别的已经设计好了。所以 python 比 C 简单,也正是如此,虽然 python 也有内存地址这个概念,但是它的内存地址和真实的内存地址是不一样的,只是 python 解释器虚拟的一个地址

name = alex
print(id(name))         #查询‘alex’的内存地址

2471424258264

name = alex
print(id(name))          #再次查询

1648814026968            #id出现变化

    一个等号 “=” 代表赋值,两个等号 “==” 代表比较是否相等

    is 内存地址是否相同  【验证内存地址是否相等不能在pycharm中进行,必须在终端验证】

技术分享图片

因为第一个是 True 所以 i 和 i1 在内存中用的是同一个值,第二个是 False 所以 i 和 i1 在内存中用的是两个值    这就引出来小数据池的概念

二、小数据池  :

  只存在于 int(整数) str(字符串)当中,在一定范围内,如果两个数值相同:为了节省内存,共用一个内存地址。

 技术分享图片

 

int的范围:   -5 ~256 

str的限制条件【不知道全不全】

                1.单个字母元素*个数(不能超过21)存在小数据池

                 2.自己设置的字符串(只包含数字字母),不管多大,都存在小数据池

技术分享图片

 

三、编码的进阶

  1.不同的密码本之间的二进制是不能全互相识别的,容易报错或者产生乱码

 

技术分享图片
#gbk  utf-8

#对于字母,数字,特殊符号的编码都是引用  ascii  码,所以可以直接转化。

s1 = 123asd*&^
b1 = s1.encode(utf-8)   #  转化为 utf-8 的字节
s2 = b1.decode(gbk)       #直接转化 gbk  的字符串
print(s2)

123asd*&^
 
补充:字母数字特殊字符,可以互相转换

 

  2.计算机的文件存储和传输都是二进制 010101 (gbk , utf-8 , ascii , gb2312) 不能是unicode(万国码,造成资源浪费)

大前提:python3x ,编码

  数据类型:

    int

    str

    bytes (字节) : str 拥有的所有方法,bytes都有

    bool

    list

    tupule  (元组)

    dict   (字典)

    set  (集合)

  str ; python3x  内存中的(字符串)编码方式是  Unicode  (规定)

技术分享图片

    英文:

      str:表现形式   name = ‘alex‘

        内部编码: unicode

name = alex
print(name,type(name))

alex <class str>

      bytes:表现形式: name1 = b‘alex‘

         内部编码:非unicode

name1 = balex
print(name1,type(name1))

balex <class bytes>

    中文:

      str:表现形式: name = “中国”

        内部编码: Unicode

name1 = 中国
print(name1,type(name1))

中国 <class str>

      bytes:表现形式:b‘\xe4\xb8\xad\xe5\x9b\xbd‘

        内部编码:非Unicode

name = 中国.encode(‘utf-8‘)
print(name,type(name))

b\xe4\xb8\xad\xe5\x9b\xbd <class bytes>    #\xe4 : 一个字节

技术分享图片

四、str ---> bytes  转化        ‘字符串‘.encode(编码方式)     # encode 编码

  bytes--->str   转化               字节.decode(编码方式)    # decode  解码

    #  编码方式必须相同,否则会产生乱码或报错

name = 中国.encode(utf-8)
print(name,type(name))
name1 = name.decode(gbk)
print(name1,type(name1))


b\xe4\xb8\xad\xe5\x9b\xbd <class bytes>
UnicodeDecodeError: gbk codec cant decode byte 0xad in position 2: illegal multibyte sequence          #报错

 

18/5/4 小数据池,编码的进阶

标签:har   变化   error:   TE   正是   之间   ==   type   idt   

原文地址:https://www.cnblogs.com/songzijian/p/8992610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!