python基础第一章-P02

Python基础教程第一章—P02知识点补充

P02知识点补充

知识点补充一

字面值

什么叫字面值 就是在程序中 无需保存的值,叫字面值

字面值用于表示一些内置类型的常量

例如:

a = b + 2

# 其中 2 就是一个字面值,而且是整形字面值

关于整型数字面值,除了 int 类型 、float数类型 还有虚数类型

如下示例:

3.14j   10.j    10j     .001j   1e100j   3.14e-10j   3.14_15_93j

我们知道在数学中有一个复数

但是python中 没有专门的表示复数字面值 (只是实际复数可由一个实数加一个虚数合成)

1+3.14j      2+10.j

允许在字面值中使用下划线进行分组

无论是整数还是浮点数还是虚数,都允许在字面值中使用下划线进行分组,例如:

3.14_15_93       3.14_15_93j    100_000_000_000   0b_1110_0101

数字字面值中并不包含正负号;-1 这样的负数实际上是由单目运算符 ‘-’ 和字面值 1 合成的,(实际上这里还涉及到计算机原理)

整型数字面值的长度没有限制,能一直大到占满可用内存

在浮点数中,整型数部分和指数部分在解析时总是以 10 为基数 例如

077e010 是合法的,且表示的数值与 77e10 相同

a = 077e010
b = 77e10
if a == b:
    print(a)
    print(b)
    
770_000_000_000.0
770000000000.0

# 但是非零的十进制数开头不允许有额外的零,
# 这是为了避免与 Python 在版本 3.0 之前所使用的 C 风格八进制字面值相混淆

知识点补充二

python解释器

Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,

实现了Python语法的解释程序就成为了Python的解释器

Python相关的解释器

CPython

CPython(ClassicPython,也就是原始的Python实现,需要区别于其他实现的时候才以CPython称呼;或解作C语言实现的Python)。这是最常用的Python版本。也就是我们从官方网站获取下载的

IPython

IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。

CPython用>>>作为提示符,而IPython用 In [序号]: 作为提示符。
    
    
# 可以尝试 在安装好Python后 cmd使用 pip install ipython 在cmd命令行 输入ipython 如下所示

'''
C:\Users\Administration>pip install ipython
C:\Users\Administration>ipython
'''

JPython

Jython (JPython; Java语言实现的Python,现已正式发布) Jython可以直接调用Java的各种函数库。

PyPy

PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用(JIT技术),对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。

绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解(PyPy和CPython的不同点)

ZhPy

ZhPy(周蟒)(支持使用繁/简中文语句编写程序的Python语言) 有兴趣的同学可以简单了解了解

知识点补充三

字符与字节

计算机储存数据最终都是转换成二进制数字进行储存,而计算机进行执行指令和控制,也是通过二进制下的数字进行计算的

那么二进制和字节,字符,字符串又有什么关联尼?

一个字符不等价于一个字节,字符是人类能够识别的符号,而这些符号要保存到计算的存储中就需要用计算机能够识别的字节来表示

一个字符往往有多种表示方法,不同的表示方法会使用不同的字节数。这里所说的不同的表示方法就是指字符编码

比如字母A-Z都可以用ASCII码表示(占用一个字节),

也可以用UNICODE表示(占两个字节),

还可以用UTF-8表示(占用一个字节)

字符编码的作用就是将人类可识别的字符转换为机器可识别的字节码,以及反向过程

UNICDOE在Python程序中才是真正的字符串,而用ASCII、UTF-8、GBK等字符编码表示的是字节串,当然是在3.x版本中

关于这点,我们可以在Python的官方文档中可以看到这样的描述

Unicode string ,  translating a Unicode string into a sequence of bytes

# https://docs.python.org/3.8/howto/unicode.html?highlight=translating%20unicode%20string%20sequence%20bytes

我们写代码是写在文件中的,而字符是以字节形式保存在文件中的,

因此当我们在文件中定义一个字符串时被当做字节串也是可以理解的

但是,我们需要的是字符串,而不是字节串,一个优秀的编程语言,应该严格区分两者的关系并提供巧妙的完美的支持

对字符串取长度,结果应该是所有字符串的个数,无论中文还是英文对字符串对应的字节串取长度,
就跟编码(encode)过程使用的字符编码有关了
比如:UTF-8编码,一个中文字符需要用3个字节来表示;(为什么三个,会在后续的章节在关于编码一节说到)
GBK编码,一个中文字符需要2个字节来表示

知识点补充四

编码

关于编码有

ANSI标准、国家标准、ISO标准
不同ASCII衍生  字符集  的出现,让文档交流变得非常困难,因此各种组织都陆续进行了标准化流程。
例如美国ANSI组织制定了ANSI标准字符编码
需要注意的是,我们现在通常说到ANSI编码,通常指的是平台的默认编码,
例如: 英文操作系统中是ISO-8859-1,
中文系统是GBK, ISO组织制定的各种ISO标准字符编码,
还有各国也会制定一些国家标准字符集,例如中国的GBK,GB2312和GB18030。

字符集(Character Set),字面上的理解就是字符的集合,例如ASCII字符集,定义了128个字符
字符码(Code Point)指的就是字符集中每个字符的数字编号。例如ASCII字符集用0-127这连续的128个数字分别表示128个字符
国内网站参考:ascii-code.com   或维基百科:ascii

虽然通过使用不同字符集,我们可以在一台机器上查阅不同语言的文档,

但是我们仍然无法解决一个问题:在一份文档中显示所有字符

为了解决这个问题,我们需要一个全人类达成共识的巨大的字符集,这就是Unicode字符集

Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,

具体存储为什么样的字节流,取决于字符编码方案。

它从0开始,为每个符号指定一个编号,这叫做"码点"(code point)。
比如,码点0的符号就是null(表示所有二进制位都是0)
在UNIcode中
表示 : U+0000 = null
# U+表示紧跟在后面的十六进制数是Unicode的码点。下一节会讲解进制
包含了 ASCII 码等相关内容

'''
目前,Unicode的最新版本是14.0.0版,已经收录超过14万个字符,全世界现有的符号当中,三分之二以上来自东亚文字。
比如,中文"好"的码点是十六进制的597D。
'''

U+597D =

这么多符号,Unicode不是一次性定义的,而是分区定义。

目前的Unicode字符分为17组编排,
每组称为平面(Plane),而每平面拥有65536(即216)个代码点。也就是十六进制
然而目前只用了少数平面。
例如 4号平面至13号平面未使用

第 0 平面(或者说基本多文种平面)中的码点,都可以用一个 UTF-16 单位来编码,
或者以 UTF-8 来编码的话,会使用一、二或三个字节

它的码点范围是从0一直到216-1,写成16进制就是从U+0000到U+FFFF。
所有最常见的字符都放在这个平面,这是Unicode最先定义和公布的一个平面。

而第 1 到 16 平面(或称辅助平面)中的码点,
UTF-16 会以代理对的方式来使用,而 UTF-8 则会编码成 4 个字节。
码点范围从U+010000一直到U+10FFFF
平面 始末字符值 中文名称 英文名称
0号平面 U+0000 - U+FFFF 基本多文种平面 Basic Multilingual Plane,简称BMP
1号平面 U+10000 - U+1FFFF 多文种补充平面 Supplementary Multilingual Plane,简称SMP
2号平面 U+20000 - U+2FFFF 表意文字补充平面 Supplementary Ideographic Plane,简称SIP
3号平面 U+30000 - U+3FFFF 表意文字第三平面 Tertiary Ideographic Plane,简称TIP
4号平面 至 13号平面 U+40000 - U+DFFFF (尚未使用)
14号平面 U+E0000 - U+EFFFF 特别用途补充平面 Supplementary Special-purpose Plane,简称SSP
15号平面 U+F0000 - U+FFFFF 保留作为私人使用区(A区) Private Use Area-A,简称PUA-A
16号平面 U+100000 - U+10FFFF 保留作为私人使用区(B区) Private Use Area-B,简称PUA-B

Unicode只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法最直观的编码方法是,

每个码点使用四个字节表示,字节内容一一对应码点

unicode 中有多种编码,这里需要说明的是,推荐的Unicode编码是UTF-16和UTF-8

互联网的普及,强烈要求出现一种统一的编码方式,UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。
其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),
不过在互联网上基本不用。

但是还需要注意一点

Unicode字符集只是定义了字符的集合和唯一编号,
Unicode编码,则是对UTF-8、UCS-2/UTF-16等具体编码方案的统称而已,并不是具体的编码方案。
所以当需要用到字符编码的时候,
你可以写gb2312,codepage936,utf-8,utf-16,但请不要写unicode

其中最需要注意的就是乱码现象

乱码指的是程序显示出来的字符文本无法用任何语言去解读。
一般情况下会包含大量?或者�。

需要注意 当程序使用特定字符编码解析字节流的时候,
一旦遇到无法解析的字节流时,就会用?或者�来替代。
因此,一旦你最终解析得到的文本包含这样的字符,而你又无法得到原始字节流的时候,
说明正确的信息已经彻底丢失了,尝试任何字符编码都无法从这样的字符文本中还原出正确的信息来

乱码问题是所有计算机用户或多或少会遇到的问题。造成乱码的原因就是因为使用了错误的字符编码去解码字节流,因此当我们在思考任何跟文本显示有关的问题时,

请时刻保持清醒:当前使用的字符编码是什么。

只有这样,我们才能正确分析和处理乱码问题。

知识点补充五

Python中的编码

在python中
编码的过程是将字符转换为字节
也就是将Unicode字符串(中的代码点)转换特定字符编码对应的字节串的过程和规则,

解码是将字节解析为字符
也就是将特定字符编码的字节串转换为对应的Unicode字符串(中的代码点)的过程和规则

无论是编码还是解码,都需要一个重要因素,就是特定的字符编码。
因为一个字符用不同的字符编码进行编码后的字节值以及字节个数大部分情况下是不同的,反之亦然。

Python中的默认编码

我们都知道,磁盘上的文件都是以二进制格式存放的,其中文本文件都是以某种特定编码的字节形式存放的。

对于程序源代码文件的字符编码是由编辑器指定的,

比如我们使用Pycharm来编写Python程序时会指定工程编码和文件编码为UTF-8,

那么Python代码被保存到磁盘时就会被转换为UTF-8编码对应的字节(encode过程)后写入磁盘。

当执行Python代码文件中的代码时,Python解释器在读取Python代码文件中的字节串之后,

需要将其转换为UNICODE字符串(decode过程)之后才执行后续操作。

这个转换过程(decode,解码)需要我们指定文件中保存的字节使用的字符编码是什么,

才能知道这些字节在UNICODE这张万国码和统一码中找到其对应的代码点是什么。

那么,如果我们没有在代码文件开始的部分指定字符编码,

Python解释器就会使用哪种字符编码把从代码文件中读取到的字节转换为UNICODE代码点呢?

就像我们配置某些软件时,有很多默认选项一样,需要在Python解释器内部设置默认的字符编码来解决这个问题,

对于Python3来讲,Python解释器在读取到中文字符的字节码尝试解码操作时,

会先查看当前代码文件头部是否有指明当前代码文件中保存的字节码对应的字符编码是什么

只是Python3的解释器以"UTF-8"作为默认编码,但是这并不表示可以完全兼容中文问题

比如我们在Windows上进行开发时,Python工程及代码文件都使用的是默认的GBK编码,

也就是说Python代码文件是被转换成GBK格式的字节码保存到磁盘中的。

Python3的解释器执行该代码文件时,试图用UTF-8进行解码操作时,同样会解码失败

那么不同的字符编码的字节可以通过Unicode相互转换吗?

答案是肯定的。Python3中定义的字符串默认就是unicode,可以直接编码成新的字符编码

但是有存在一些问题了

Unicode不是有道词典,也不是google翻译器,它并不能把一个中文翻译成一个英文(即中文还是中文)。
正确的字符编码的转换过程只是把同一个字符的字节表现形式改变了,
而字符本身的符号是不应该发生变化的,
因此并不是所有的字符编码之间的转换都是有意义的。

比如:

比如GBK编码的“中国”转成UTF-8字符编码后,
仅仅是由4个字节变成了6个字节来表示,
但其字符表现形式还应该是“中国”,
而不应该变成“你好”或者“China”

知识点补充六

python数据类型内存占用

我们需要认识到,python一切皆为对象,所以python中其实根本不存在int float这些数据的类型,int其实是一个python对象
int:24    float:24    string:49   list():56   {
    
    }:64

上面是基本的对象数据类型

我们使用sys.getsizeof 方法计算
sys.getsizeof只计算实际使用的内存大小,引用所消耗的内存大小不计算
sys.getsizeof只能作为计算内存大小的参考

由python的实现所决定的,python代码在运行的时候会由python解析器执行,
具体会解析为C语言的某种结构。
也就是说,python中的一个int(或其他)映射到c语言中会是一种复杂结构体

举例:以下不是具体的现象

typedef struct {
    
    
    PyObject_HEAD
    long ob_ival;
} PyIntObject;
struct _longobject {
    
    
    long ob_refcnt;  // 引用计数
    PyTypeObject *ob_type; //变量类型
    size_t ob_size;  //实际占用内容大小
    long ob_digit[1];  //存储的实际python值
};

// python实际的值只是相应C结构中的一个属性,难怪python的int占28个字节,
// 而C语言只需要4个字节,因为python还存储了很多相关的其他信息!其他信息是实际数值的6倍大小!
这个值包括该对象的数值、签名(包括数据类型、参数、调用方式等)等一系列数据所占总内存。
可变对象所占内存可能极小,因为对象是指针,指向很大的数据

以上就是一些基本的知识点补充

猜你喜欢

转载自blog.csdn.net/qq_42475194/article/details/121854095