Python 教学 021

Python 教学 021,第1张

概述一、Python原码、反码、补码按32位计算,原码是数的二进制表示,内部存储与运算是补码,转换用的是反码。+1的原码:0000000000000001-1的原码:1000000000000001-1的反码:1111111111111110-1的补码:1111111111111111重新计算-1+1结果:(用的都是补码)11111111111 一、Python 原码、反码、补码

按32位计算,原码是数的二进制表示,内部存储与运算是补码,转换用的是反码。

+1 的原码:0000 0000 0000 0001
-1 的原码:1000 0000 0000 0001
-1 的反码:1111 1111 1111 1110
-1 的补码:1111 1111 1111 1111

重新计算 -1+1 结果:(用的都是补码)

1111 1111 1111 1111

0000 0000 0000 0001

-----------------------

1 0000 0000 0000 0000

正数:原码 = 反码 = 补码
负数:反码 = 符号位不变,其他位取反
补码 <=> 反码+1<=>原码    (反码+1=-1反码)

-1的补码:1111 1111 1111 1111
    取反:1000 0000 0000 0000
-1的原码:1000 0000 0000 0001

补码:用来做数据的存储运算,可以实现计算机底层的减法 *** 作,默认计算机只会做加法,例:5+(-3) => 5 – 3,乘法除法是通过左移和右移 << >> 来实现。

python 中的按位取反运算

按位取反运算符:~  #是对补码取反 *** 作

运算结果:~x=-(x+1)

例如:~9为-10

原码:0000 1001    9

~:1111 0110    246

1、~9 的计算步骤:

原码:0000 0000 0000 1001

补码:0000 0000 0000 1001

按位取反:1111 1111 1111 0110

要知道它所表达的数是多少,需要转换为原码

补码:1111 1111 1111 0110

反码:1000 0000 0000 1001

原码:1000 0000 0000 1010

符号位为1是负数,即-10

2、~-9 的计算步骤:

原码:1000 0000 0000 1001

补码:1111 1111 1111 0111

按位取反:0000 0000 0000 1000

原码:正数的补码和原码相同,仍为:0 1000,即8

注意:按位取反是针对补码的 *** 作

-61:11 1101 32+16+8+4+0+1

1000 0000 0011 1101  注:是16位,32位一样理解。

二、Python 中的字符编码1、字符与字节

字符与人类更为接近,而字节则与计算机(机器)更为接近。

Unicode 才是真正的字符串,而 ASCII、UTF-8、GBK 等编码格式表示的都是字节码。

字符串是由字符构成,字符在计算机硬件中通过二进制形式存储,这种二进制形式就是字节码。unicode 就是 “与存储无关的表示”,是一种字符集,而 ASCII、UTF-8、GBK 等就是字符串对应的“二进制表示”。

Unicode 解决了人类识别计算机语言的兼容性和可用性问题,是一种字符串(只是一种字符集,而没有编码格式),而ASCII、UTF-8、GBK 等是解决字符信息(Unicode)如何在计算机内部存储和传输的,是二进制形式的字节码。

Unicode 是解决如何向人类展现可被识别的字符问题,而 UTF-8 是解决如何将人类可识别的字符转换为可被机器识别的字节码问题。

python3 所有的字符串都是Unicode字符串

python3 中解释器默认的字符编码是 UTF-8

>>> import sys>>> sys.getdefaultenCoding()'utf-8'

也可在文件头增加字符编码的显式声明:

#! /usr/bin/env python# -*- Coding:utf-8 -*-s='你好,世界!'print(s)

程序在执行时解释器会通过指定的字符编码 UTF-8 来对保存的字节码进行解码。

2、编码

ASCII 编码是1个字节,而 Unicode 编码通常是2个字节。(如果要用到非常偏僻的字符,就需要4个字节) UTF-8 编码把一个 Unicode 字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

字符

ASCII

Unicode

UTF-8

A

01000001

00000000 01000001

01000001

x

01001110 00101101

11100100 10111000 10101101

3、编码格式与 Unicode

字符串在系统内部存储为 0x0--0x10FFFF 范围内的码位序列。

一旦字符串对象要在 cpu 和内存以外使用,字节的大小、顺序和字节数组的存储方式就成为一个关键问题。 如同使用其他编解码器一样,将字符串序列化为字节序列被称为 编码,而从字节序列重建字符串被称为 解码。 存在许多不同的文本序列化编解码器,它们被统称为 文本编码。

其中一种编码格式能够对所有的 Unicode 字符进行编码:UTF-8。 UTF-8 是一种 8 位编码,这意味着在 UTF-8 中没有字节顺序问题。 UTF-8 字节序列中的每个字节由两部分组成:标志位(最重要的位)和内容位。 标志位是由零至四个值为 1 的二进制位加一个值为 0 的二进制位构成的序列。 Unicode 字符会按以下形式进行编码(其中 x 为内容位,当拼接为一体时将给出对应的 Unicode 字符):

范围

编码

U-00000000 ... U-0000007F

0xxxxxxx                 0x7f=127

U-00000080 ... U-000007FF

110xxxxx 10xxxxxx        0x7ff=2047

U-00000800 ... U-0000FFFF

1110xxxx 10xxxxxx 10xxxxxx   65535

U-00010000 ... U-0010FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

chr(i)

返回 Unicode 码位为整数 i 的字符的字符串格式。例如,chr(97) 返回字符串 'a',chr(8364) 返回字符串 '€'。这是 ord() 的逆函数。

实参的合法范围是 0 到 1,114,111(16 进制表示是 0x10FFFF)。如果 i 超过这个范围,会触发 ValueError异常。

ord(c)

对表示单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数。例如 ord('a') 返回整数 97, ord('中') 返回 20013 。

字符串这种序列与其它序列(如列表、元组)的不同之处在于,它的“元素”限定了只能是 Unicode 码点。Unicode 码点是什么呢?简单理解,就是用 Unicode 编码的字符。那字符是什么呢?字符是人类书写系统的各类符号,例如阿拉伯数字、拉丁字母、中文、日文、藏文、标点符号、控制符号(换行符、制表符等)、其它特殊符号(@#¥%$*等等)。那 Unicode 编码又是什么呢?Unicode  别名是万国码、国际码,它是一种适用性最广的、将书写字符编码为计算机数字的标准。

总所周知,在最底层的计算机硬件世界里,只有 0 和 1。那么,怎么用这个二进制数字,来表示人类的文化性的字符呢?这些字符数量庞大,而且还在日益增长与变化,什么样的编码方案才是最靠谱的呢?

历史上,人类创造了多种多样的字符编码标准,例如 ASCII(1963年)编码,以西欧语言的字符为主,它的缺点是只能编码128个字符;例如 GB2312(1981年),这是中国推出的编码标准,在兼容 ASCII 标准的基础上,还加入了对日文、俄文等字符的编码,但缺点仍是编码范围有限,无法表示古汉语、繁体字及更多书写系统的字符。

Unicode 编码标准于1991年推出,至今迭代到了第11版,已经能够编码146个书写系统的130000个字符,可谓是无所不包,真不愧是“国际码”。Unicode 编码其实是一个二进制字符集,它建立了从书写字符映射成唯一的数字字符的关系,但是,由于各系统平台对字符的理解差异,以及出于节省空间的考虑,Unicode 编码还需要再做一次转换,转换后的新的二进制数字才能作为实际存储及网络传输时的编码。

这种转换方式被称为 Unicode 转换格式(Unicode transformation Format,简称为UTF),它又细分为 UTF-8、UTF-16、UTF-32 等等方式。我们最常用的是 UTF-8。为什么 UTF-8 最常用呢?因为它是可变长度的编码方案,针对不同的字符使用不同的字节数来编码,例如编码英文字母时,只需要一个字节(8个比特),而编码较复杂的汉字时,就会用到三个字节(24个比特)。

二进制的编码串可以说是给机器阅读的,为了方便,我们通常会将其转化为十六进制,例如“中”字的 Unicode 编码可以表示成 0x4e2d ,其 UTF-8 编码可以表示为0xe4b8ad ,'0x' 用于开头表示十六进制,这样就简洁多了。不过,UTF-8 编码的结果会被表示成以字节为单位的形式,例如“中”字用 UTF-8 编码后的字节形式是中 。

Python 中为了区分 Unicode 编码与字节码,分别在开头加“u”和“b”以示区分。在Python 3中,因为 Unicode 成了默认编码格式,所以“u”被省略掉了。

# 字符转 Unicode 编码# python3 中,开头的 u 被省略,b 不可省略hex(ord('中')) >>> '0x4e2d'hex(ord('A'))  >>> '0x41'# 字符转 UTF-8 编码(encode)'中'.encode('utf-8') >>> b'丬''A'.encode('utf-8')  >>> b'A'# Unicode 编码还原成字符chr(0x4e2d) >>> '中'chr(0x41) >>> 'A'# UTF-8 编码还原成字符(decode)b'丬'.decode('utf-8') >>> '中'b'A'.decode('utf-8') >>> 'A'

总结:Python 3 中的字符串是由 Unicode 码点组成的不可变序列,也就是由采用 Unicode 标准编码的字符组成的不可变序列。Unicode 编码将书写系统的字符映射成了计算机二进制数字,为了方便,通常显示为十六进制;在运算内存中,字符以 Unicode 编码呈现,当写入磁盘或用于网络传输时,一般采用 UTF-8 方式编码。

print(chr(10004),chr(10005))for i in range(12):    print(chr(9800+i),end=',')✔ ✕♈,♉,♊,♋,♌,♍,♎,♏,♐,♑,♒,♓
三、Python 教学 bytes


Python 1-16 bytes

在 python3 以后,字符串和 bytes 类型彻底分开了。字符串是以字符为单位进行处理的,bytes 类型是以字节为单位处理的。

bytes 数据类型在所有的 *** 作和使用甚至内置方法上和字符串数据类型基本一样,也是不可变的序列对象。

bytes 对象只负责以二进制字节序列的形式记录所需记录的对象,至于该对象到底表示什么(比如到底是什么字符)则由相应的编码格式解码所决定。python3中,**bytes 通常用于网络数据传输、二进制图片和文件的保存**等等。可以通过调用 bytes() 生成 bytes 实例,其值形式为 b'xxxxx',其中 'xxxxx' 为一至多个转义的十六进制字符串(单个 x 的形式为:\x12,其中\x为小写的十六进制转义字符,12为二位十六进制数)组成的序列,每个十六进制数代表一个字节(八位二进制数,取值范围0-255),对于同一个字符串如果采用不同的编码方式生成 bytes 对象,就会形成不同的值.

创建方法:
b = b''         # 创建一个空的bytesb = bytes()     # 创建一个空的bytesb = b'hello'    #  直接指定这个hello是bytes类型b = bytes('string',enCoding='编码类型')  # 利用内置bytes方法,将字符串转换为指定编码的bytesb = str.encode('编码类型')   # 利用字符串的encode方法编码成bytes,默认为utf-8类型

bytes.decode('编码类型'):将bytes对象解码成字符串,默认使用utf-8进行解码。

简单的省事模式:

string = b'xxxxxx'.decode() # 直接以默认的 utf-8 编码解码 bytes 成 stringb = string.encode() # 直接以默认的 utf-8 编码 string 为 bytes


 

 

 

总结

以上是内存溢出为你收集整理的Python 教学 021全部内容,希望文章能够帮你解决Python 教学 021所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1187965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存