文章引用:html
https://www.cnblogs.com/654321cc/p/7419124.htmlpython
http://www.cnblogs.com/alex3714/articles/5465198.html编程
若有侵权,请联系删除网络
1.bytes类型:ide
python3中,字符串是unicode格式,字节包括utf-8,gbk等等,网络传输,硬盘保存是以字节格式保存的。函数
str和bytes格式的区别:编码
str: spa
表现形式:a='hello,world'3d
内部原理:00000000 00000000 00000000 01101000 ‘h’code
。。。
。。。
bytes:
表现形式:a=b'hello,world'
内部原理:
01101000 utf-8
。。。
。。。
00000000 01101000 gbk
。。。
。。。
Bytes 对象是由单个字节做为基本元素(8位,取值范围 0-255)组成的序列,为不可变对象。
Bytes 对象只负责以二进制字节序列的形式记录所需记录的对象,至于该对象到底表示什么(好比究竟是什么字符)则由相应的编码格式解码所决定。咱们能够经过调用 bytes() 类(没错,它是类,不是函数)生成 bytes 实例,其值形式为 b'xxxxx',其中 'xxxxx' 为一至多个转义的十六进制字符串(单个 x 的形式为:\xHH,其中 \x 为小写的十六进制转义字符,HH 为二位十六进制数)组成的序列,每两个十六进制数即每一个‘x’表明一个字节(八位二进制数,取值范围 0-255),对于同一个字符串若是采用不一样的编码方式生成 bytes 对象,就会造成不一样的值。
Python 3最重要的新特性大概要算是对文本和二进制数据做了更为清晰的区分。文本老是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得二者的区分特别清晰。你不能拼接字符串和字节包,也没法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然 )。
例如:
1 a = '你好' 2 a_b = a.encode('utf-8') 3 print(a,b) 4 for i in a_b: 5 print(i) 6 for i in a_b: 7 print(bin(i))
输出:
1 b'\xe4\xbd\xa0\xe5\xa5\xbd' #原来如此,\xe4 长得这么丑,实际是十六进制的数字。和128,12,没什么本质的区别。天然就能够bin()变为二进制数字了。 2 228 3 189 4 160 5 229 6 165 7 189 8 0b11100100 9 0b10111101 10 0b10100000 11 0b11100101 12 0b10100101 13 0b10111101
回到bytes
和str
的身上。bytes
是一种比特流,它的存在形式是01010001110这种。咱们不管是在写代码,仍是阅读文章的过程当中,确定不会有人直接阅读这种比特流,它必须有一个编码方式,使得它变成有意义的比特流,而不是一堆晦涩难懂的01组合。由于编码方式的不一样,对这个比特流的解读也会不一样,对实际使用形成了很大的困扰。下面让咱们看看Python是如何处理这一系列编码问题的:
1 >>> s = "中文" 2 >>> s 3 '中文' 4 >>> type(s) 5 <class 'str'> 6 >>> b = bytes(s, encoding='utf-8') 7 >>> b 8 b'\xe4\xb8\xad\xe6\x96\x87' 9 >>> type(b) 10 <class 'bytes'>
从例子能够看出,s
是个字符串类型。Python有个内置函数bytes()
能够将字符串str
类型转换成bytes
类型,b
其实是一串01的组合,但为了在ide环境中让咱们相对直观的观察,它被表现成了b'\xe4\xb8\xad\xe6\x96\x87'
这种形式,开头的b
表示这是一个bytes
类型。\xe4
是十六进制的表示方式,它占用1个字节的长度,所以”中文“被编码成utf-8
后,咱们能够数得出一共用了6个字节,每一个汉字占用3个,这印证了上面的论述。在使用内置函数bytes()
的时候,必须明确encoding
的参数,不可省略。
咱们都知道,字符串类str
里有一个encode()
方法,它是从字符串向比特流的编码过程。而bytes
类型刚好有个decode()
方法,它是从比特流向字符串解码的过程。除此以外,咱们查看Python源码会发现bytes
和str
拥有几乎如出一辙的方法列表,最大的区别就是encode
和decode
。
从实质上来讲,字符串在磁盘上的保存形式也是01的组合,也须要编码解码。
若是,上面的阐述还不能让你搞清楚二者的区别,那么记住下面两几句话:
在将字符串存入磁盘和从磁盘读取字符串的过程当中,Python自动地帮你完成了编码和解码的工做,你不须要关心它的过程。
使用bytes
类型,实质上是告诉Python,不须要它帮你自动地完成编码和解码的工做,而是用户本身手动进行,并指定编码格式。
Python已经严格区分了bytes
和str
两种数据类型,你不能在须要bytes
类型参数的时候使用str
参数,反之亦然。这点在读写磁盘文件时容易碰到。
2.三元运算:
1 result = a if 条件 else b
若是条件为真,result = a
若是条件为假,result = b
3.进制:
计算机内存地址和为何用16进制?
为何用16进制一、计算机硬件是0101二进制的,16进制恰好是2的倍数,更容易表达一个命令或者数据。十六进制更简短,由于换算的时候一位16进制数能够顶4位2进制数,也就是一个字节(8位进制能够用两个16进制表示)二、最先规定ASCII字符集采用的就是8bit(后期扩展了,可是基础单位仍是8bit),8bit用2个16进制直接就能表达出来,无论阅读仍是存储都比其余进制要方便
三、计算机中CPU运算也是遵守ASCII字符集,以1六、3二、64的这样的方式在发展,所以数据交换的时候16进制也显得更好
四、为了统一规范,CPU、内存、硬盘咱们看到都是采用的16进制计算
16进制用在哪里
一、网络编程,数据交换的时候须要对字节进行解析都是一个byte一个byte的处理,1个byte能够用0xFF两个16进制来表达。经过网络抓包,能够看到数据是经过16进制传输的。
二、数据存储,存储到硬件中是0101的方式,存储到系统中的表达方式都是byte方式三、一些经常使用值的定义,好比:咱们常常用到的html中color表达,就是用的16进制方式,4个16进制位能够表达好几百万的颜色信息。
4.Python中一切皆对象:
对象是基于类建立的
因此,如下这些值都是对象: "wupeiqi"、3八、['北京', '上海', '深圳'],而且是根据不一样的类生成的对象。