万恶之源-再谈编码

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

  1. ?小数据池
  2. is和==的区别 3. 编码的问题
    ?一. ?小数据池
    在说?小数据池之前. 我们先看?一个概念念. 什什么是代码块:
    根据提示我们从官?方?文档找到了了这样的说法:
    A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block.
    A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block’s execution has completed.
    粗略的翻译:
    python程序是由代码块构成的. 一个代码块的?本作为python程序执行的单元.
    代码块: 一个模块, 一个函数, ?个类, 甚至每一个command命令都是?一个代码块. ?一个?文件也是?一 个代码块, eval()和exec()执?行行的时候也是?一个代码块
    什么是命令行?
    我们在控制台CMD中输入python进入的就是python的command模式. 在这?里里也可以写 python的程序.
    ?而根据上?面的官?方的解释来看. ?一个command命令就是?一个python代码块

二. 接下来我们来看?一下?小数据池 is和==的区别 1. id()
通过id()我们可以查看到?一个变量量表?示的值在内存中的地址.

  1. is和==
    == 判断左右两端的值是否相等. 是不是?一致.
    is 判断左右两端内容的内存地址是否?一致. 如果返回True, 那可以确定这两个变量量使 ?用的是同?一个对象
    s = ‘alex‘
    print(id(s)) # 4326667072
    我们可以这样认为. 如果内存地址相同. 那么值?一定是相等的. 如果值相等. 则不?一定是同?一 个对象
    ?小数据池. ?一种数据缓存机制. 也被称为驻留留机制. 各?大编程语?言中都有类似的东?西. 在?网上 搜索常量量池,?小数据池指的都是同?一个内容.
    ?小数据池只针对: . 其他的数据类型不存在驻留留机制
    整数, 字符串串, 布尔值
    对于整数,Python官?方?文档中这么说:
    The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined.

对于字符串串:
Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct
values are stored ina string intern pool. –引?自维基百科
在python中对-5到256之间的整数会被驻留留在内存中. 将?一定规则的字符串串缓存. 在使?用 的时候, 内存中只会创建?一个该数据的对象. 保存在?小数据池中. 当使?用的时候直接从?小数据 池中获取对象的内存引?用. ?而不需要创建?一个新的数据. 这样会节省更更多的内存区域.
优点: 能够提?高?一些字符串串, 整数的处理理速度. 省略略的创建对象的过程. 缺点: 在‘池‘中创建或者插入新的内容会花费更更多的时间.
对于数字: -5~256是会被加到?小数据池中的. 每次使?用都是同?一个对象. 对于字符串串:

  1. 如果字符串串的?长度是0或者1,都会默认进?行行缓存
  2. 字符串串?长度?大于1,但是字符串串中只包含字?母,数字,下划线时才会缓存
  3. ?用乘法的到的字符串串.1.乘数为1,仅包含数字,字?母,下划线时会被缓存.如果
    包含其他字符, ?而?长度<=1 也会被驻存, 2. 乘数?大于1 . 仅包含数字, 字?母, 下划
    线这个时候会被缓存. 但字符串串?长度不能?大于20
  4. 指定驻留留.我们可以通过sys模块中的intern()函数来指定要驻留留的内容.
    OK. 到?目前为?止. 我们已经了了解了了python的?小数据池的?一些基本情况了了. 但是!!!! 还有最后?一 个问题. ?小数据池和最开始的代码块有什什么关系呢? 同样的?一段代码在命令?行行窗?口和在py?文件中. 出现的效果是完全不?一样的.
    在代码块内的缓存机制是不?一样的. 在执?行行同?一个代码块的初始化对象的命令时, 会检 查是否其值是否已经存在, 如果存在, 会将其重?用. 换句句话说: 执?行行同?一个代码块时, 遇到初始 化对象的命令时,他会将初始化的这个变量量与值存储在?一个字典中, 在遇到新的变量量时, 会先 在字典中查询记录, 如果有同样的记录那么它会重复使?用这个字典中的之前的这个值. 所以在 你给出的例例?子中, ?文件执?行行时(同?一个代码块) 会把a, b两个变量量指向同?一个对象.
    如果是不同的代码块, 他就会看这个两个变量量是否是满?足?小数据池的数据, 如果是满?足 ?小数据池的数据则会指向同?一个地址. 所以: a, b的赋值语句句分别被当作两个代码块执?行行, 但 是他们不满?足?小数据池的数据所以会得到两个不同的对象, 因?而is判断返回False.
    a = 1000
    b = 1000
    print(a is b)
    注意. 在py?文件中.得到的结果是True, 但是在command中就不不是了了.

三. 编码的补充

  1. python2中默认使?用的是ASCII码. 所以不?支持中?文. 如果需要在Python2中更更改编码.
    需要在?文件的开始编写: # -- encoding:utf-8 --
  2. python3中:内存中使?用的是unicode码. 编码回顾:
  3. ASCII : 最早的编码. ?里里?面有英?文?大写字?母, ?小写字?母, 数字, ?一些特殊字符. 没有中?文, 8个01代码, 8个bit, 1个byte
  4. GBK: 中?文国标码, ?里里?面包含了了ASCII编码和中?文常?用编码. 16个bit, 2个byte
  5. UNICODE: 万国码, ?里里?面包含了了全世界所有国家?文字的编码. 32个bit, 4个byte, 包含了了 ASCII
  6. 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的表现形式:
  7. 英?文 b‘alex‘ 英?文的表现形式和字符串串没什什么两样
  8. 中?文 b‘\xe4\xb8\xad‘ 这是?一个汉字的UTF-8的bytes表现形式 字符串串在传输时转化成bytes=> encode(字符集)来完成
    s = "alex"
    print(s.encode("utf-8")) # 将字符串串编码成UTF-8 print(s.encode("GBK")) # 将字符串串编码成GBK
    结果:
    b‘alex‘

b‘alex‘
s = "中"
print(s.encode("UTF-8")) # 中?文编码成UTF-8 print(s.encode("GBK")) # 中?文编码成GBK
结果: b‘\xe4\xb8\xad‘ b‘\xd6\xd0‘
记住: 英?文编码之后的结果和源字符串串?一致. 中?文编码之后的结果根据编码的不同. 编码结果 也不同. 我们能看到. ?一个中?文的UTF-8编码是3个字节. ?一个GBK的中?文编码是2个字节. 编码之后的类型就是bytes类型. 在?网络传输和存储的时候我们python是保存和存储的bytes 类型. 那么在对?方接收的时候. 也是接收的bytes类型的数据. 我们可以使?用decode()来进?行行解 码操作. 把bytes类型的数据还原回我们熟悉的字符串串:
编码和解码的时候都需要制定编码格式.
s = "我叫李李嘉诚"
print(s.encode("utf-8")) # b‘\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a‘
print(b‘\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a‘.decod e("utf-8")) # 解码
s = "我是?文字"
bs = s.encode("GBK") # 我们这样可以获取到GBK的?文字 # 把GBK转换成UTF-8

?首先要把GBK转换成unicode. 也就是需要解码

s = bs.decode("GBK") # 解码

然后需要进?行行重新编码成UTF-8

bss = s.encode("UTF-8") # 重新编码
print(bss)

原文地址:https://www.cnblogs.com/yet-320/p/10997098.html

时间: 2024-08-29 08:54:51

万恶之源-再谈编码的相关文章

再谈编码---小数据池(概念)

1. 小数据池小数据池在说小数据池之前. 我们先看一个概念. 什么是代码块:python程序是由代码块构成的. 一个代码块的文本作为python程序执行的单元.代码块: 一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块, eval()和exec()执行的时候也是一个代码块 小数据池. 一种数据缓存机制. 也被称为驻留机制. 小数据池只针对: 整数, 字符串串, 布尔值. 其他的数据类型不存在驻留机制 在python中对-5到256之间的整数会

再谈编码

1.is和==的区别 注意(一般情况下): 在py文件中. 如果你只是单纯的定义一个字符串. 那么一般情况下都是会被添加到小数据池中的. 我们可以这 样认为: 在使用字符串的时候, python会帮我们把字符串进行缓存, 在下次使用的时候直接指向这个字符串即可. 可以节省很多内存. is 比较的是地址 == 比较的是值 2.编码的补充 1. 英文   b'alex'  英文的表现形式和字符串没什么两样 2. 中文   b'\xe4\xb8\xad' 这是一个汉字的UTF-8的bytes表现形式

06.Python再谈编码

?. is和==的区别 1. id() 通过id()我们可以查看到?个变量表?的值在内存中的地址. ?数据池(常量池): 把我们使?过的值存储在?数据池中.供其他的变量使?. ?数据池给数字和字符串使?, 其他数据类型不存在. 对于数字: -5~256是会被加到?数据池中的. 每次使?都是同?个对象. 对于字符串: 1. 如果是纯?字信息和下划线. 那么这个对象会被添加到?数据池 2. 如果是带有特殊字符的. 那么不会被添加到?数据池. 每次都是新的 3. 如果是单?字?*n的情况. 'a'*2

【Go语言】【13】再谈GO语言的结构体

本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struct{ name,address string height,weight float64 } /*初始化结构体,并赋给变量emp*/ emp := employee{name:"eagle",

软考复习之路—再谈组成原理

指令系统 指令系统是计算机硬件的语言系统,与硬件的联系息息相关. 指令系统是指CPU所能够处理的全部指令的集合,是一个CPU的根本属性(指令系统决定了一个CPU能运行 什么样的程序).现在cpu仍然使用者X86指令集,不同类型的计算机包含的指令系统的种类和数目是不同的. 所有采用高级语言编出的程序,都需要编译或者解释成为机器语言后才能运行(编译原理),这些机器语 言中所包含的就是一条条的指令.一条指令就是机器语言的一个语句,它是一组有意义的二进制代码. 格式 零地址 在堆栈型计算机中,操作数一般

HTTP协议与HTML表单(再谈GET与POST的区别)

HTTP的GET/POST方式有何区别?这是一个老生常谈的问题,但老生常谈的问题往往有一些让人误解的结论.本文将带您浅尝HTTP协议,在了 解HTTP协议的同时将会展示许多被人们忽视的内容.在掌握了HTTP协议的过程中我们将自然而然地了解到GET与POST的本质区别. HTTP请求 从使用者的角度看,一个HTTP请求起始于用户端浏览器上输入的一个URL地址:网页中的一个超链接:提交一个HTML表单.但本质上说,一个HTTP请求起始于用户端向HTTP服务器发送的一个URL请求. 一个标准的HTTP

再谈 Object Factories(对象工厂)

为何而写: 为什么再谈一次,因为上次代码实在是不够好.上篇文章对象工厂给出的代码太过拙劣,限于学识,我自己类型擦除技术仅仅是把对象的指针转换为void* 而已,实际上可以更为巧妙.这次利用新的类型擦出技术,给出一个完美的解决方,请看下文. 前情描述: 我为什么不直接保存用户提供的function的void*而非要把他copy一份利用容器vector储存起来,然后再去取其指针转换为void*.是因为用户传来的function可能是右值或临时值,一个马上要被删除的值,如果我们直接使用用户提供的fun

过早优化是万恶之源

今天早上考虑了一些问题,觉得有些地方按自己的设想会导致效率下降,如果改了可能把自己的架构搞乱.纠结了半天,领悟到这么一点: 架构.设计完成后,就这样做,觉得有地方可以修改,可以记录下来,以后优化时再修改.因为按照自己的架子来搭建程序的话,开发效率会很高,后期汇总了所有可优化的地方,再来修改也会很有针对性.如果一边写,一边改,一方面是让开发效率下降,还可能让自己的设计思路变得混乱,严重可能导致错误,甚至停止不前.所以,优化一定放在最后再来做!!! 同时,看lua文章时,看到一句话: Knuth有句

再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结

Angular 的数据绑定采用什么机制,详述原理? 脏检查机制.阐释脏检查机制,必须先了解如下问题. 单向绑定(ng-bind) 和 双向绑定(ng-model) 的区别? ng-bind 单向数据绑定($scope -> view),用于数据显示,简写形式是 {{}}. 两者的区别在于页面没有加载完毕 {{val}} 会直接显示到页面,直到 Angular 渲染该绑定数据(这种行为有可能将 {{val}} 让用户看到):而 ng-bind 则是在 Angular 渲染完毕后将数据显示. ng-