小知识点
python2 python3的区别
一:编码
- python2默认编码方式为ascii码
- python3默认编码方式为utf-8
在python2中显示中文的方法
在首行 添加 # -- encoding:utf-8 - -
二、长整形 long
在python3中不在有long类型,全是int
三:print
python2.7 中 print可加括号也可以不加
print('asd')
print 'asd'
python3 中 print必须加括号
print('asd)
四 range
python2 中有 range 和xrange(这是一个生成器)
python3 中 只有range
五 input
python2 raw_input
python3 input
is和 == 的区别
在说is 和 ‘==’的区别之前先说下 在python中 如何表示一个对象:
python的对象包含三要素,
- id(身份标识符)
- type(数据类型)
- value(值)
在python中 is 和 ‘==’ 都是比较,但是他们的比较内容不同:is 比较的 id 和value 也就是比较两个对象是否是同一个实例对象,是否是指向同一个内存地址。 ‘==’ 比较的是 value,默认会调用_ eq _()方法
>>> a = 12345
>>> b = 12345
>>> a is b
False
>>> a == b
True
看起来So easy,我们在来看两个例子
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a == b
True
嗯哼?a 和b 在256的时候 用is 判断内存地址居然是True?
小数据池
python3.6 对于整数做了一个 数据缓存:
因为出于对性能的考虑,Python内部做了很多的优化工作,对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫small_ints的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。Python把这些可能频繁使用的整数对象规定在范围[-5, 256]之间的小对象放在small_ints中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。
python 还对字符串做了 数据缓存
a = 'asd'
b = 'asd'
print(a is b) # True
a = 'asd '
b = 'asd '
print(a is b) # False
当不含有特殊字符时 公用同一个内存
a = 'a'*20
b = 'a'*20
print(a is b) # True
其他的数据类型呢?
>>> a = (1,2,3) #a和b为元组类型
>>> b = (1,2,3)
>>> a is b
False
>>> a = [1,2,3] #a和b为list类型
>>> b = [1,2,3]
>>> a is b
False
>>> a = {'python':100,'com':1} #a和b为dict类型
>>> b = {'python':100,'com':1}
>>> a is b
False
>>> a = set([1,2,3])#a和b为set类型
>>> b = set([1,2,3])
>>> a is b
False
总结
当变量是数字、字符串、元组,列表,字典时,is和==都不相同, 不能互换使用!当比较值时,要使用==,比较是否是同一个内存地址时应该使用is。当然,开发中比较值的情况比较多。
python3编码问题
ASCII | Unicode | Utf-8 | gbk |
---|---|---|---|
字母 | 8位 1字节 | 32位 4字节 | 8位 1字节 |
中文 | 32位 4字节 | 24位 3字节 |
1.各个编码之间的二进制,是不能互相识别的,会产生乱码。
2.文件的储存,传输,不能是Unicode(只能是utf-8,utf-16,gbk,ascii,等)
我们在使用python3时,可以发现python3中字符串的编码是Unicode编码,Unicode编码是不可存储、不可传输的,所以使用bytes类型
bytes类型
用法和str一样,不过显示不同 b’asd‘
bytes和str的区别是编码问题 bytes的编码是utf-8 而str的编码是Unicode。所以 当文件传输 和保存的时候需要使用bytes类型
str to bytes
encode
bytes to str
decode