- 代码块
for.... if.... while....下是象征意义的代码块,不是python严格定义的
一个代码块为一个模块,一个函数(def),一个类(class),一个文件等。
交互模式下每行是一个代码块(可理解为每一行在一个文件中)
- id,is,==
= 赋值
== 数值相同
id 内存地址(门牌号,唯一),指向id相同,在内存中是一个
判断id相同 i1 is i2
判断值相同 i1 == i2 (is为True,==必为True,反之不一定)
- 小数据池(缓存机制,驻留机制)
python对内存做的优化,将-5~256整数,以及一定规则的字符串,提前在内存中创建了池(容器),容器内固定放了以上值。
目的:1.节省内存 2.提高性能与效率
应用的数据类型:整数,字符串,bool值
一定规则的字符串?:不是重点
问题:
s1 = 'alex@' s2 = 'alex@' print(s1 is s2)
#在交互模式下为False,在pycharm中为True
涉及代码块:
s1 = 'alex@'
s2 = 'alex@'
python对于同一个代码块的变量,初始化对象命令时,会将变量与值的对应关系放到一个字典中,dic = {'s1': alex@的内存地址},如果下面代码再次初始化对象命令,会先从字典中寻找,如果存在相同的值,会复用(s2 = s1),即指向同一内存地址。
对于不同代码块,进行初始化对象命令,会从小数据池中寻找。
def func1(): i1 = 100 print(id(i1)) def func2(): i2 = 100 print(id(i2)) func1() func2() def func1(): i1 = 1000 print(id(i1)) def func2(): i2 = 1000 print(id(i2)) func1() func2() ''' 1957215520 1957215520 1826416549616 1826415947472 '''
- 编码
ACSⅡ:字母,数字,特殊字符。8位。
unicode:万国码,包含世界所有文字。
创建初:16位
升级:32位
对unicode升级:utf-8。A:8位
欧:16位
中:24位
gbk/gb2312:只含字母,数字,特殊字符,中文。A:8位
中:16位
1.编码间不能互相识别
2.网络传输或文件存储010101...必须使用非unicode编码
python3中:
str:内存(内部)编码方式为unicode,其他都是utf-8。
bytes:也是基础数据类型,和str相当于双胞胎,str所有方法bytes类型都适用。
区别:
str | bytes | ||
英文 | 表现形式 | s1 = 'alex' | b1 = b'alex' |
内部编码 | unicode | 非unicode | |
中文 | 表现形式 | s1 = '太白' | b1 = b'十六进制表示' |
内部编码 | unicode | 非unicode |
使用:想将一部分内容(字符串)写入文件或通过网络socket传输,必须转为bytes类型,平时代码中使用字符串。
转化:str --> bytes:encode编码
s1 = 'alex'
b1 = s1.encode('编码类型如utf-8')
bytes --> str:decode解码
b2 = b'\xcc\xab\xb0\xd7' #gbk的bytes
s2 = b1.decode('gbk')