• python学习 day06打卡


    今天学习的主要内容是:

    一,小数据池

    代码块的概念

    python程序是由代码块构成的,一个代码块的文本作为python程序执行的单元.

    代码块:一个模块,一个函数,一个类,甚至每一个command命令都是一个代码块.一个文件也是一个代码块,eval()和exec()执行的时候也是一个代码块

    二,is 和 ==的区别

    1.id()

    通过id()我们可以查看到一个变量表示的值在内存中的地址.

    s='alex'
    print(id(s)) #4326667072

    2.is 和 ==的区别

    ==是判断左右两端的值是否相等.是不是一致.

    is是判断左右两端内容的内存地址是否一致.如果一致返回True,那可以确定这两个变量使用的是同一个对象

    我们可以这样认为.如果内存地址相同. 那么值一定相等.如果只想等,则不一定是同一个对象

    小数据池.一种数据缓存机制,也被称为驻留机制.各大编程语言中都有类似的东西.在网上搜索常量池,小数据池指的是同一个内容.

    小数据池只针对:整数,字符串,布尔值.其他的数据类型不存在驻留机制

     在python中对-5到256之间的整数会被驻留在内存中. 将⼀定规的字符串缓存.   在使⽤的时候, 内存中只会创建⼀个该数据的对象. 保存在小数据池中.

    当使用的时候直接从小数据池中获取对象的内存引用. 而不需要创建⼀个新的数据. 这样会节省更多的内存区域.         

    优点: 能够提⾼⼀些字符串, 整数的处理速度. 省略的创建对象的过程.     

    缺点: 在'池'中创建或者插入新的内容会花费更多的时间.         

    对于数字: -5~256是会被加到小数据池中的. 每次使用都是同⼀个对象.   

    对于字符串:

    1. 如果字符串的长度是0或者1, 都会默认进行缓存

    2. 字符串长度大于1, 但是字符串中只包含字母, 数字, 下划线时才会缓存

    3. 用到乘法的字符串. ①. 乘数为1, 仅包含数字, 字⺟母, 下划线时会被缓存. 如果包含其他字符, 而长度<=1 也会被驻存,

    ②. 乘数大于1 . 仅包含数字, 字母, 下划线这个时候会被缓存. 但字符串串长度不能大于20

    4. 指定驻留. 我们可以通过sys模块中的intern()函数来指定要驻留的内容. 

    小数据池和最开始代码块有什么关系?

    同样的一段代码在命令行窗口和在py文件中.出现的效果是完全不一样的.

    a = 1000
    b = 1000
    print(a is b)
    
    注意.在py文件中.得到的结果是True,但是在command中就不是了

    在代码块内的缓存机制是不一样的. 在执行同⼀个代码块的初始化对象的命令时, 会检查是否其值是否已经存在, 如果存在, 会将其重用.

    换句话说: 执行同一个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中, 在遇到新的变量时, 会先 

    在字典中查询记录, 如果有同样的记录那么它会重复使用这个字典中的之前的这个值. 所以在 你给出的例子中, 文件执行时(同一个代码块)

    会把a, b两个变量指向同⼀个对象. 

    如果是不同的代码块, 他就会看这个两个变量是否是满足小数据池的数据, 如果是满足小数据池的数据则会指向同一个地址. 所以: a, b的赋值语

    句分别被当作两个代码块执行, 但是他们不满足小数据池的数据所以会得到两个不同的对象, 因而is判断返回False. 

    在pycharm中如果只是单纯的创建变量,都是有缓存的,但是加上运算符就不一定了

    二.编码的补充

    1.python中默认使用的是ASCII码.所以不支持中文.如果需要在python中更改编码.需要在文件的开始编写:

    #-*- encoding:utf-8-*-

    2.python3中:内存中使用的是Unicode码.

    回顾 :

    1.ASCII码:最早的编码.里面有英文大小写字母,数字,一些特殊字符.没有中文,8个01代码,1byte

    2.GBK:中文国标码,里面包含了ASCII编码和中文常用编码.16bit,2byte

    3.Unicode:万国码,里面包含了全世界所有国家文字的编码.32bit,4byte,包含了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(字符集)来完成 

    b'xxxxx' 这种格式的数据是bytes类型的数据

    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'xe4xb8xad'
    b'xd6xd0'

    记住: 英文编码之后的结果和源字符串⼀致.  中文编码之后的结果根据编码的不同. 编码结果也不同. 我们能看到一个中文的UTF-8编码是3个字节.

    一个GBK的中文编码是2个字节. 编码之后的类型就是bytes类型.  在网络传输和存储的时候我们python是保存和存储的bytes类型. 那么在对方接收的时候.

    也是接收的bytes类型的数据. 我们可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串: 

    s = "我叫李嘉诚" print(s.encode("utf-8"))    
    # b'xe6x88x91xe5x8fxabxe6x9dx8exe5x98x89xe8xafx9a' 
    print(b'xe6x88x91xe5x8fxabxe6x9dx8exe5x98x89xe8xafx9a'.decod e("utf-8")) # 解码

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

    # 编码: 存储和传输。 encode()
    # 解码: 接受数据的时候。decode()

    s = "我是文字" 
    bs = s.encode("GBK")    # 我们这样可以获取到GBK的⽂文字 
    # 把GBK转换成UTF-8 
    # 首先要把GBK转换成unicode. 也就是需要解码 
    s = bs.decode("GBK")  # 解码 
    # 然后需要进⾏行行重新编码成UTF-8 
    bss = s.encode("UTF-8") 
    # 重新编码 print(bss)
  • 相关阅读:
    Reading papers_2(与GMM相关,ing...)
    Matlab DIP(瓦)ch11表示与描述练习
    HMM学习笔记_1(从一个实例中学习DTW算法)
    Matlab DIP(瓦)ch10图像分割练习
    前景检测算法_2(帧差法1)
    目标跟踪学习笔记_3(particle filter初探2)
    基础学习笔记之opencv(2):haartraining前将统一图片尺寸方法
    Reading papers_5(与human activity analysis综述相关,ing...)
    总结系列_4(C++知识学习,续...)
    HMM学习笔记_2(从一个实例中学习HMM前向算法)
  • 原文地址:https://www.cnblogs.com/af1y/p/9844290.html
Copyright © 2020-2023  润新知