1、Python2和Python3的区别
Python2
print('abc') print 'abc'
range() xrange()生成器
raw_input()
Python3
print('abc')
range()
input()
2、Python小数据池
is 比较,比较的是内存地址 id(内容)
li1 = [1,2,3] li2 = li1 li3 = li2 print(id(li1),id(li2)) # 1829389950088 1829389950088
数字,字符串与小数据池
数字的范围 -5~256
字符串 1)不能有特殊字符
2)s*20 还是同一个地址,s*21以后都是两个地址
i1 = 6 i2 = 6 print(id(i1),id(i2)) i3 = 300 i4 = 300 print(id(i3),id(i4))
剩下的小数据池(list dict tuple set)
不存在小数据池
l1 = [1,] l2 = [1,] print(l1 is l2)
3、编码问题
1)各个编码之间的二进制,是不能互相识别的,会产生乱码。
2)文件的储存,传输,不能是unicode(只能是utf-8 utf-16 gbk,gb2312,asciid等)
在Python3中,str 在内存中是用unicode编码。
bytes数据类型:
在Python3以后,字符串和bytes类型彻底分开了。字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的。
bytes数据类型在所有的操作和使用甚至内置方法上和字符串数据类型基本一样,也是不可变的序列对象。
bytes对象只负责以二进制字节序列的形式记录所需记录的对象,至于该对象到底表示什么(比如到底是什么字符)则由相应的编码格式解码所决定。
Python3中,bytes通常用于网络数据传输、二进制图片和文件的保存等等。
可以通过调用bytes()生成bytes实例,其值形式为 b'xxxxx',其中 'xxxxx' 为一至多个转义的十六进制字符串(单个 x 的形式为:x12
,其中x为小写的十六进制转义字符,12为二位十六进制数)组成的序列,每个十六进制数代表一个字节(八位二进制数,取值范围0-255),对于同一个字符串如果采用不同的编码方式生成bytes对象,就会形成不同的值.
str类型与bytes类型对比:
对于英文:
str :表现形式:s = 'alex'
编码方式: 010101010 unicode
bytes :表现形式:s = b'alex'
编码方式: 000101010 utf-8 gbk。。。。
对于中文:
str :表现形式:s = '中国'
编码方式: 010101010 unicode
bytes :表现形式:s = b'xe91e91e01e21e31e32'
编码方式: 000101010 utf-8 gbk。。。。
b = b'' # 创建一个空的bytes b = byte() # 创建一个空的bytes b = b'hello' # 直接指定这个hello是bytes类型 b = bytes('string',encoding='编码类型') #利用内置bytes方法,将字符串转换为指定编码的bytes b = str.encode('编码类型') # 利用字符串的encode方法编码成bytes,默认为utf-8类型 bytes.decode('编码类型'):将bytes对象解码成字符串,默认使用utf-8进行解码。
s0 = 'alex' s1 = b'alex' print(s0,type(s0)) print(s1,type(s1))
4、编码与解码
encode():编码,将str --> bytes
becode(): 解码,将bytes --> str
s1 = 'alex' s11 = s1.encode('utf-8') s11 = s1.encode('gbk') print(s11) s2 = '中国' s22 = s2.encode('utf-8') s22 = s2.encode('gbk') print(s22)
对于bytes,我们只要知道在Python3中某些场合下强制使用,以及它和字符串类型之间的互相转换,其它的基本照抄字符串。
简单的省事模式:
string = b'xxxxx'.becode() 直接以默认的utf-8编码解码bytes成string
b = string.encode() 直接以默认的utf-8编码string为bytes