小数据池 is和== 再谈编码
昨日回顾
上节课内容回顾
1. 字典
{key:value, key:value.....}
成对的保存数据 字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的
1. 增加:
dic[新key] = 值
dic.setdefault(key, value) 新增, 查询
2. 修改:
dic[老key] = 值
dic.update(d) 把d更新到dic中
3. 删除;
pop(key)
popitem() 随机删除
del dic[key]
clear() 清空
4. 查询
for k in dic:
k
dic[k] get(key) 如果key不存在, 返回None
dic[key] 如果key不存在, 报错 setdefault(key, value)
根据key查询出value
5. 相关操作
1. keys() 所有的key
2. values() 所有的value
3. items() 所有的key和value
for k, v in dic.items(): # 自动解包
k
v
set集合
内部元素必须可哈希. 不可变
内部元素不重复 add() 添加 frozenset() 冻结集合. 不可变的.(##一般的集合本身是可变的,但是要求其内部的元素是不可变的,而这个集合本身就是不可变的)
今日内容
今日主要内容
1. 小数据池, id()
小数据池针对的是: int, str, bool
在py文件中几乎所有的字符串都会缓存.
id() 查看变量的内存地址
2. is和==的区别
is 比较的是内存地址
== 比较的是内容
当两个变量指向同一个对象的时候. is是True, ==也是True 3. 再谈编码
回顾:
1. ascii. 有: 数字, 字母, 特殊字符. 8bit 1byte 128 最前面是0
2. gbk. 包含: ascii, 中文(主要), 日文, 韩文, 繁体文字. 16bit, 2byte.
3. unicode. 包含gbk,ascii,big5... 32bit, 4byte
4. utf-8. 可变长度的unicode.
1. 英文: 8bit,1byte
2. 欧洲文字: 16bit 2byte
3. 中文: 24bit 3byte
不同的编码之间不能随意转换. 中国人gbk和德国人utf-8骂 想要沟通必须通过英文(unicode)(媒介) 在python3中. 默认的编码是unicode,我们的字符串就是unicode
在python2中. 默认的编码是ASCII. Cpython是用 c 语言写的,c语言的默认编码是ASCII unicode弊端:在存储和传输的时候. 是很浪费的
在存储和传输的时候不能直接使用unicode. 必须要对字符串进行编码. 编码成bytes类型
bytes: 字节形式的字符串 1. encode(编码格式) 编码
2. decode(编码格式) 解码 bytes是一种另类的字符串表示形式
"哈哈哈" => \xee\xab\x13\xee\xab\x13\xee\xab\x13
一.小数据池
在说小数据池之前.我们先看一个概念.什么是代码块:
根据提示我们从官方文档找到了这样的说法:
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 evalO and execO) is a code block.
A code block is executed in an execution frame. A frame contains some
admi ni strative information (used for debugging) and determines where and
how execution continues after the code bLock's execution has compLeted.
粗略的翻译:
python程序是由代码块构成的.一个代码块的文本作为python程序执行的单元.
代码块:一个模块,一个函数,一个类,甚至每一个command命令都是一个代码块.一个文件也是一个代码块,evalO)和exec( )执行的时候也是一个代码块
什么是命令行?
我们在控制台CMD中输入python进入的就是python的command模式.在这里也可以写
python的程序.
而根据上面的官方的解释来看.一个command命令就是一个python代码块
二.小数据池 is和==的区别
接下来我们来看一下小数据池is和==的区别
# id()函数可以帮我们查看一个变量的内存地址
a = 10
b = 30
print(id(a)) #
print(id(b)) # lst = ['周杰伦', "麻花藤"]
print(id(lst)) #
print(lst)
lst = [] # 创建了一个新列表
lst.append("胡辣汤")
print(id(lst)) #
print(lst) lst1 = [1,2,3] # 两个对象 内存地址是不一样的
lst2 = [1,2,3]
print(id(lst1)) #
print(id(lst2)) # s1 = "abc" # 内存中是没有"abc", 创建一个新的 0.0001
s2 = "abc" # 内存中是已经有了"abc", 直接把abc拿来用 0.0000001
print(id(s1), id(s2)) # 31096032 31096032 # 使用频率最高的数据类型: 字符串,为了能够快速的创建字符串.
# 节省内存. 把相同的规律的字符串进行缓存,当下次创建的时候就不在创建了
# 把字符串的缓存-> 小数据池 -> String iterning -> 常量池 -> 字符串缓存 # 在创建字符串之前. 先去小数据池对比. 是否已经存在了该字符串.如果存在了.
# 就不创建新的了. 直接拿原来存在的数据, 省略掉反复重复创建字符串的过程. 节约内存 # 什么数据会被缓存
# 数字, 字符串, 布尔值 => 都是不可变的数据类型
# 1. 数字
a = 1000
b = 1000
print(id(a), id(b)) # 165830000 165830000 # 2. 字符串. 如果单纯的写字符串. 几乎都会被缓存
s1 = "a昨天上厕所没关门. 红冲进去了. 面筋歌出来了. 有故事a昨天上厕所没关门. 红冲进去了. 面筋歌出来了. 有故事a昨天上厕所没关门. 红冲进去了. 面筋歌出来了. 有故事"
s2 = "a昨天上厕所没关门. 红冲进去了. 面筋歌出来了. 有故事a昨天上厕所没关门. 红冲进去了. 面筋歌出来了. 有故事a昨天上厕所没关门. 红冲进去了. 面筋歌出来了. 有故事" print(id(s1), id(s2)) # 31222064 31222064 # 如果在py文件中写的字符串. 几乎都是缓存的
# 在黑窗口里的写的几乎都不会缓存
# 不同的解释器. 缓存的机制也不一样
#
# 优点: 可以帮我们快速的创建对象.节省内存.
# 缺点: 缓存如果过大. 响应速度会比较慢
# 不要纠结. # == 和 is 区别:
#
# == 比较的是数据, 外貌
# is 比较的是内存地址, 比较身份证号 lst1 = [1,2,3]
lst2 = [1,2,3]
# 列表没有小数据池
print(id(lst1), id(lst2)) # 166167560 166126408
print(lst1 == lst2) # True
print(lst1 is lst2) # False s1 = "我叫周润发"
s2 = "我叫周润发"
print(s1 == s2)
print(s1 is s2) # 小数据池 tu1 = ("周一", "周二")
tu2 = ("周一", "周二")
print(tu1 is tu2) # 地址不相等 False
print(tu1 == tu2) # 内容相等 True # == 比较的是内容
# is 比较内存地址
id()
通过id()我们可以查看到一个变量表示的值在内存中的地址.
s = 'alex'
print(id(s)) #
is和==
==判断左右两端的值是否相等.是不是一致.
is判断左右两端内容的内存地址是否一致. 如果返回True,那可以确定这两个变量使用的是同一个对象
我们可以这样认为. 如果内存地址相同,那么值一定是相等的. 如果值相等, 则不一定是同一 个对象.
小数据池,一种数据缓存机制,也被称为驻留机制.各大编程语言中都有类似的末西.在网上搜索常量池,小数据池指的都是同一个内容.
小数据池只针対:整数,字符串,布尓値.其他的数据类型不存在驻留机制
#对于整数,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,仅包含数字,字母,下划线这个时候会被缓存.但字符串长度不能大于20
4.指定驻留.我们可以通过sys模块中的intern()函数来指定要驻留的内容.
OK.到目前为止.我们已经了解了python的小数据池的一些基本情况了.但是!!还有最后一个问题.小数据池和最开始的代码块有什么关系呢?
同样的一段代码在命令行窗口和在py文件中.出现的效果是完全不一样的.
a = 1000
b = 1000
print(a is b)
注意. 在py文件中,得到的结果是True, 但是在command(命令行)中就是False了.
在代码块内的缓存机制是不一样的.在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用.换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值.所以在你给出的例子中,文件执行时(同一个代码块)会把a, b两个变量指向同一个对象.如果是不同的代码块,他就会看这个两个变量是否是满足小数据池的数据,如果是满足小数据池的数据则会指向同一个地址.所以: a, b的赋值语句分别被当作两个代码块执行,但是他们不满足小数据池的数据所以会得到两个不同的对象,因而is判断返回False.
三.编码补充
s = "我今天非常的困" # 21个utf-8
bs = s.encode("gbk") # 把字符串转化成utf-8格式bytes
# bytes不是给人看的. 给机器用的
# 14个字节 gbk
# b'\xce\xd2\xbd\xf1\xcc\xec\xb7\xc7\xb3\xa3\xb5\xc4\xc0\xa7'
# 21个字节 utf-8
# b'\xe6\x88\x91\xe4\xbb\x8a\xe5\xa4\xa9\xe9\x9d\x9e\xe5\xb8\xb8\xe7\x9a\x84\xe5\x9b\xb0'
print(bs) # utf-8和gbk是不能直接转换的, 必须使用unicode来转换
bs = b'\xe6\x88\x91\xe4\xbb\x8a\xe5\xa4\xa9\xe9\x9d\x9e\xe5\xb8\xb8\xe7\x9a\x84\xe5\x9b\xb0'
# 把字节转化回字符串
s = bs.decode("utf-8")
print(s) b'\xe6\x88\x91\xe4\xbb\x8a\xe5\xa4\xa9\xe9\x9d\x9e\xe5\xb8\xb8\xe7\x9a\x84\xe5\x9b\xb0'
# 把这个bytes转化成gbk的bytes
bs = b'\xe6\x88\x91\xe4\xbb\x8a\xe5\xa4\xa9\xe9\x9d\x9e\xe5\xb8\xb8\xe7\x9a\x84\xe5\x9b\xb0'
# 解码
s = bs.decode("utf-8")
print(s) # 编码
bss = s.encode("gbk")
print(bss) # 关于bytes, 非ascii中的内容. 展示的时候都是\x.. 如果是ascii中的内容. 原样输出
name = "alex昨天吃多了"
bs = name.encode("gbk") # b'alex\xd7\xf2\xcc\xec\xb3\xd4\xb6\xe0\xc1\xcb'
print(bs) bss = name.encode("utf-8") # b'alex\xe6\x98\xa8\xe5\xa4\xa9\xe5\x90\x83\xe5\xa4\x9a\xe4\xba\x86'
print(bss)
1. python2中默认使用的是ASCII码,所以不支持中文.如果需要在Python2中更改编码需要在文件的开始编写:
# -*- encoding:utf-8 -*-
2. python3中: 内存中使用的是unicode码.
#编码回顾:
1. ASCII: 最早的编码.里面有英文大写字母,小写字母,数字,一些特殊字符. 没有中文,8个01代码, 8个bit, 1个byte
2. GBK:中文国标码,里面包含了ASCII编码和中文常用编码.16个bit, 2个byte
3. UNICODE: 万国码,里面包含了全世界所有国家文字的编码.32个bit, 4个byte,包含了ASCII
4. UTF-8:可变长度的万国码.是unicode的一种实现.最小字符占8位
1.英文: 8bit 1byte
2.欧洲文字:16bit 2byte
3.中文: 24bit 3byte
综上,除了ASCII码以外,其他信息不能直接转换.要通过Unicode转换
在python3的内存中,在程序运行阶段使用的是unicode编码.因为unicode是万国码,什么内容都可以进行显示.那么在数据传输和存储的时候由于unicode比较浪费空间和资源.需要把unicode转存成UTF-8或者GBK进行存储.怎么转换呢.在python中可以把文字信息进行编码,编码之后的内容就可以进行传输了,编码之后的数据是bytes类型的数据.其实啊,还是原来的数据只是经过编码之后表现形式发生了改变而已.
bytes的表现形式:
1.英文b'alex' 英文的表现形式和字符串没什么两样
2.中文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类型的数据.
我们可以使用decode0来进行解码操作.把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") # 解码成unicode
# 然后需要进⾏重新编码成UTF-8
bss = s.encode("UTF-8") # 重新编码
print(bss)
Python2和Python3的比较:
- 字符串和字节不同
py2: name=u"alex"(用unicode进行编码) name='alex'(utf-8/gbk/ascii)
unicode(就是py3中的str类型) str(就是py3中的bytes类型)
py3: name='alex'(用unicode进行编码) name=b'alex'(utf-8/gbk/ascii)
str bytes
今日作业
小数据池 is和== 再谈编码的更多相关文章
- python -- 小数据池 is和 == 再谈编码
1.小数据池 python程序是由代码块构成的,一个代码块的文本作为python程序的执行单元. 代码块:一个模块,一个函数,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块, ...
- python小数据池 is和 == 再谈编码
1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 2. is和==的区别 is 比较的是内存地址 == ...
- 小数据池/is和==/再谈编码作业
# 1,老男孩好声选秀大赛评委在打分的时候呢, 可以输入分数. 假设, 老男孩有10个评委. 让10个评委进行打分, 要求, 分数必须高于5分, 低于10分.将每个评委的打分情况保存在列表中. pin ...
- python基础之小数据池,is和==区别 编码问题
主要内容 小数据池,is和==区别 编码问题 小数据池 一种缓存机制,也称为驻留机制,是为了能更快提高一些字符串和整数的处理速度is 和 == 的区别 == 主要指对变量值是否相等的判断,只要数值相同 ...
- python基础之小数据池、代码块、编码和字节之间换算
一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽 ...
- python基础之小数据池、代码块、编码
一.代码块.if True: print(333) print(666) while 1: a = 1 b = 2 print(a+b) for i in '12324354': print(i) 虽 ...
- id,is的用法,小数据池的概念及编码知识进阶
一:id 查询内存地址 name = 'alex' print(id(name)) li = [1,2,3] print(id(li)) 二:is 判断的是内存地址 name1 = 'alex@' ...
- python之路--小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- python的小数据池 is和== 以及再谈编码
---恢复内容开始--- 1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 # a = 10 # b ...
随机推荐
- kafka集群安全化之启用kerberos与acl
一.背景 在我们部署完kafka之后,虽然我们已经可以“肆意”的用kafka了,但是在一个大公司的实际生产环境中,kafka集群往往十分庞大,每个使用者都应该只关心自己所负责的Topic,并且对其他人 ...
- selenium中元素操作之上传操作(六)
上传操作分为两种情况: 1.input标签上传 如果是input可以直接输入路径的,那么直接调用send_keys输入路径,和前边的元素操作类似,在这里不再过多的赘述. 2.非input标签上传 非i ...
- 504 Gateway Time-out ( Nginx + PHP ) 解决小计
问题 最近有个项目,运算量比较大,服务器经常报 504 Gateway Time-out 解决方案 fastcgi_connect_timeout 默认值是 60 第一次尝试修改为 120 ,仍然报5 ...
- 2019-08-01 jquery中常用方法
1.attr()方法设置或返回被选元素的属性值 <html> <meta charset="utf-8"/> <head><title&g ...
- underscore_1: map()
map()是underscore.js中一个处理数组和对象的方法. params: 1. array || obj 2. callback 3. content 上下文指向 使用: var obj = ...
- Apache Kafka是数据库吗?
最近思路有些枯竭,找些务虚的话题来凑.本文内容完全来自于Martin Kelppmann在2019年Kafka伦敦峰会上的演讲.顺便提一句,Kelppmann是<Designing Data-I ...
- i18n,国际化翻译,excel与js互转
背景 公司开发新产品时,要求适配多国语言,采用i18n国际化工具,但翻译字典(js的json)还是需要前端自己写的.字典最终需要转换成excel给专业人员翻译,翻译完成后再转换成js字典文件. 如果手 ...
- Oracle ERP 库存管理(业务流程 核心流程)
库存核心业务 库存管理的核心是对货物本身的管理,是对货物的数量与相关属性的管理,目的是为销售与采购服务,确保合理的库存保有量,处理库存分类帐目与进出流水帐,以单据的形式基本涵盖仓库的各种进出库业务. ...
- Django 之 rest_framework 响应器使用
Django 之 rest_framework 响应器使用 使用部分: 第一步:导入模块 from rest_framework.renders import BrowsableAPIRenderer ...
- Ubuntu 18.10 安装之后做的一点事
sb_release -c //查看系统代号 #更新源/etc/apt/sources.list //打开更新目录 deb https://linux.xidian.edu.cn/mirrors/ub ...