数据类型、字符编码、文件处理
第1章 引子
1.1 什么是数据?+
aa =cc就是我们要存储的数据。
1.2 为什么要使用数据
数据用来表示状态,不同的状态用不同的类型表示
1.3 数据的类型
1) 数字(整型,字符串,浮点,复数)
2) 字符串
3) 列表
4) 字典
1.4 按照以下几个点展开数类型的学习
基本使用
1)用途
2)定义方式
3)常用操作+内置的方法
第2章 数字
基本使用:
int用途:年龄,等级,各种号码
定义方式:
age=10
float用途:身高,体重,薪资
定义方式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
height=1.83 print(id(age)) age=19 print(id(age)) salary=3.1 print(id(salary)) salary=3.2 print(id(salary)) print(hash(10)) print(hash([1,2,3]))
常用的操作+内置方法:
print(bin(3)) #把3转换成二进制
print(oct(8))#转换成8进制
print(10)
print(hex(16))#转换成16进制
该类型总结
存一个值or存多个值
只能存一个值
可以存多个值,值都可以是什么类型
有序or无序
可变or不可变
!!!可变:值变,id不变。可变==不可hash
!!!不可变:值变,id就变。不可变==可hash
第3章 字符串
一:基本使用
str用途:描述性的数据,比如名字\国籍\学历\家庭住址
定义方式:在单引号或双引号或三引号内的一串字符
name='egon' #name=str('egon')
掌握:
str(10) #int('10')
了解知识
res=str(10)
res=str([1,2,3,4])
print(res,type(res))
int('10')
res=float('10.3')
print(res,type(res))
3.1 常用操作+内置的方法
优先掌握的操作:
3.1.1 、按索引取值(正向取+反向取) :只能取
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
name='egon你好' print(name[0]) print(name[4]) print(name[1000]) print(name[-1]) print(type(name[-2])) name[-1]='坏'
3.1.2 、切片(顾头不顾尾,步长)
msg='alex say my name is sb' print(msg[0:6]) print(msg[0:6:2]) #alex s ae
了解:
# print(msg[0:5:1])
# print(msg[3:1:-1])
# print(msg[-1:-5:-1])
# msg='alex is sb'
# print(msg[0:10:1])
# print(msg[:])
# print(msg[::1])
# print(msg[::-1])
3.1.3 长度len
msg='alex say my name is sb' print(len(msg)) # 字符的个数
3.1.4 成员运算in和not in
msg='alex say my name is sb' print('alex' in msg) print('alex' not in msg)
3.1.5 移除空白strip
s='*****egon****' print(s.strip('*')) s=s.strip('*') print(s) name=' egon ' print(name.strip())
3.1.6 改进
name=input('用户名>>: ').strip() print(len(name)) name=name.strip() if name == 'alex': print('用户名正确')
3.1.7 切分split
info='egon:123:admin' res=info.split(':') print(res,type(res)) print(res[0]) cmd='get|a.txt|32123123' # print(cmd.split('|'))
3.1.8 循环
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
msg='alex' i=0 while True: if i < len(msg): print(msg[i]) i+=1 else: break msg='alex' i=0 while True: if i == len(msg): break print(msg[i]) i+=1 msg='alex' i=0 while i < len(msg): print(msg[i]) i+=1 msg='alex' for item in msg: #item='l' print(item) for item in 11111: # 只有字符串,列表,字典 print(item)
3.2 总结
该类型总结
存一个值or存多个值
只能存一个值
可以存多个值,值都可以是什么类型
有序or无序
可变or不可变
!!!可变:值变,id不变。可变==不可hash
!!!不可变:值变,id就变。不可变==可hash
3.3 需要掌握的操作
3.3.1 strip,lstrip,rstrip
print('***sss***'.strip('***'))#去中间 print('***sss***'.lstrip('***'))#省略左边 print('***sss***'.rstrip('***'))#省略右边
3.3.2 lower,upper
print('SEX'.lower())#翻转输入大小变成小写 print('sex'.upper())#翻转输入小写变成大写
3.3.3 startswith,endswith
print('alex is sb'.startswith('alex')) #从前面顺序开始判断 print('alex is sb'.endswith('sb')) #从后面倒序开始判断
3.3.4 format的三种玩法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
第一种:{} s1=('my name is %s my age is %s '%('egon',18)) s2=('my name is {} my age is {}' .format('egon',18)) print(s1) print(s2) s1=('my name is %s my age is %s '%('egon',18)) s2=('my name is {} my age is {}'.format('egon',18,19)) print(s1) print(s2) # 第二种: s2=('my name is {0} my age is {1} {2} {3} {4} {5} '.format('egon',1,2,3,4,5)) print(s2) #第三种: s2=('my name is {name} my age is {age}'.format('name=egon',age=18)) print(s2)
3.3.5 split,rsplit
cmd='get|c:\a.txt|3333' print(cmd.split('|',1)) #split('切分条件',切分次数,-1为全部) print(cmd.rsplit('|',1))
3.3.6 jion(jion)
cmd='egon:123:admin:rwx' l=cmd.split(':') print(l) res=':'.join(l) # '以什么拼接'.join(字符串名) ':'.join([1,2,3]) #join方法传入的列表必须只包含str类型的元素
3.3.7 replace
msg='wupeiqi say my name is wupeiqi' #print(msg.replace('wupeiqi','SB')) #replace('待替换的值','替换的新值' 替换次数不输全部替换) #print(msg.replace('wupeiqi','SB',1))
3.3.8 isdigit 判断是否是数字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
age=10 while True: inp = input('>>:').strip() #去除用户输入的空格 if inp.isdigit(): #判断用户输入的是否为数字 inp =int(inp) #将用户转化为 int if inp > age : print('猜大了') elif inp == age: print('猜对了') break else: print('猜小了') else: print('输入非法')
##其他操作
1、查找字符在字符串中的位置
find(),rfind(),index(),rindex(),count() msg ='my egon hegon 123' print(msg.find('sb')) #寻找查找字符的位置,如果查找不到返回 -1 print(msg.find('egon',8,20)) #从第8位开始查找,到20结束 print(msg.rfind('egon',8,20)) #倒序查找,返回的位置还是正序 print(msg.index('egon')) #跟find功能类似,但是查找不到会报错 print(msg.index('sb'))
2、填充
center() ljust(l just) rjust(r just ) zfill()
print('dream'.center(50,'*')) #居中填充 (字符个数,'填充字符')
print('dream'.ljust(50,'*')) #靠左填充
print('dream'.rjust(50,'*')) #靠右填充
print('dream'.zfill(50)) #靠右填充 0
3、expandtabs()
msg = 'abc\tdef'
print(msg) # \t 等同于一次tab键 空一个
print(msg.expandtabs(10)) # 里输入几就代表输入几个\t
4、大小写转换
capitalize(capt lize) swapcase(swap case ) title()
print('dReAm'.capitalize()) #首字母大写,其它小写
print('DrEam'.swapcase()) #大写转小写,小写转大写
print('my name is egon'.title()) #每个单词,首字母大写
5、is数字系列
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
num1=b'4' #bytes num2=u'4' #unicode python3 中无需加u就是Unicode num3='四' #中文数字 num4='Ⅳ' #罗马数字 print(num1.isdigit()) print(num2.isdigit()) print(num3.isdigit()) print(num4.isdigit()) print(num2.isdecimal()) print(num3.isdecimal()) print(num4.isdecimal()) print(num1.isalnum()) print(num2.isalnum()) print(num3.isalnum()) print(num4.isalnum())
###总结字符串类型
1、能存几个值
只能存一个值
2、有序or无序
有序
3、可变or不可变
不可变
可hash
第4章 列表
####列表类型
1、用途:存放多个值
2、定义方式:[]内以逗号为分隔多个元素,列表内元素无类型限制
l=['a','b','c'] #l=list(['a','b','c'])
l1=list('hello')
4.1 常用操作+内置方法
####优先掌握的操作:
4.1.1 按索引存取值(正向存取+反向存取):即可改也可以取
1=['a','b','c'] print(id(l)) print(l[-1] l[0] = 'A' print(id(l)) l[3] = 'd' # 不存在的索引,报错
4.1.2 切片(顾头不顾尾,步长)
stus = ['alex', 'wxx', 'yxx', 'lxx'] print(stus[0:3:1])
4.1.3 长度 len()
stus = ['alex', 'wxx', 'yxx', 'lxx'] print(len(stus))
4.1.4 成员运算 in 和 not in
stus = ['alex', 'wxx', 'yxx', 'lxx'] print('alex' in stus)
4.1.5 追加(.append)
stus = ['alex', 'wxx', 'yxx', 'lxx'] stus.append('wupeiqi') stus.append('peiqi') print(stus)
4.1.6 插入(insert)
stus=['alex','egon','wxx','yxx','lxx'] stus.insert(1,'艾利克丝') print(stus)
4.1.7 删除
stus=['alex','egon','wxx','yxx','lxx'] del stus[1] #什么都能删的del stus.remove('alex') #单纯的删除,需要直接输入值来进行删除 stus.pop() #取走一个值,()不加参数,默认删除末尾
4.1.8 循环
stus=['alex','egon','wxx','yxx','lxx']
4.1.8.1 依赖索引
i=0 while i< len(stus): print(stus[i]) i+=1
4.1.8.2 不依赖索引
for i in range(0,5,2) : #从0开始取到第五个 步长 2 for i in range : #默认从0起始 print() 例 stus=['alex','egon','wxx','yxx','lxx'] for i in range(len(stus)) : print(stus[i])
###需要掌握的操作
stus=['alex','egon','wxx','yxx','lxx'] stus.count() stus.extend() stus.index() stus.reverse() stus.sort()
#大前提:只能同类型直接比较大小,对于有索引值的比较是按照位置一一对应进行比较的 s1='hello' s2='hf' print(s1>s2) l1=[3,'a','b','c'] l2=['xxx','d'] print(l1>l2) print('Z'>'a') #了解 1=stus.copy() clear #练习 队列:先进先出 l1=[] 入队 l1.append('first') l1.append('second') l1.append('third') print(l1) 出队 print(l1.pop(0)) print(l1.pop(0)) print(l1.pop(0)) #每次提取第一个 堆栈:先进后出
4.2 总结
总结列表类型:
1、能存多个值
2、有序
3、可变
第5章 元组
作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读
定义:与列表类型比,只不过[]换成()
age=(11,22,33,44,55)本质age=tuple((11,22,33,44,55))
强调:在元素相同的情况下,使用元组更加节省空间
5.1 常用操作加内置的方法(优先掌握的方法)
5.1.1 按索引取值(正向取+反向取):只能取
>>> t=(1,2,3,4,5,6) >>> print(t[0]) 1 >>> print(t[-1]) 6
5.1.2 切片(顾头不顾尾,步长)
>>> t=(1,2,3,4,5,6) print(t[1:4]) (2, 3, 4)
print(tuple('hello')) #打印分割字符串 >>> print(tuple('hello')) ('h', 'e', 'l', 'l', 'o') for i in range(10000): 循环9999次 print(i)
5.1.3 长度
成员运算in和not in
5.1.4 循环
第6章 字典
用途:以key:value的形式存多个值
优点:存取都快,每一个值都有对应的key
定义方式:{}内以逗号分隔多个元素,格式为key:value,
其中key必须为不可变类型,value可以是任意类型
dic={'x':1,'y':1,'x':1111} #dic=dict({'x':1,'y':1,'x':1111})
print(dic)
6.1 常用操作+内置的方法(优先掌握方法)
6.1.1 按key存取值:可存可取
dic={'name':'egon'} dic['age']=10 print(dic)
6.1.2 长度len
dic={'name':'egon','age':18} print(len(dic))
6.1.3 成员运算in和not in:判断的字典的key
6.1.4 删除
dic={'name':'egon','age':18} del dic['name'] print(dic) res=dic.pop('name') print(res) print(dic) res=dic.pop('sex',None) print(res)
6.1.5 键keys(),值values(),键值对items()
dic={'name':'egon','age':18} print(dic.keys()) print(dic.keys()) for x in dic.keys(): print(x) print(list(dic.keys())[0]) print(dic.values()) print(list(dic.keys()[]))
6.1.6 循环
for key in dic.keys(): print(key) for value in dic.values(): print(value) print(dic.items()) for k,v in dic.items(): #k,v=('name', 'egon') print(k,v) print(type(dic.items()))
第7章 集合
用途:关系运算,去重
定义:
可变类型是不可hash类型
不可变类型是可hash类型
注意的问题:
1)没有重复的元素
2)集合的元素必须是不可变类型
7.1 优先掌握的操作
7.1.1长度len
7.1.1 交集
stus_linux={'alex','egon','张全蛋','李铁蛋','oldboy'} stus_python={'李二丫','wxx','liudehua','alex','egon'} print(stus_linux & stus_python) print(stus_linux.intersection(stus_python))
7.1.2 并集
stus_linux={'alex','egon','张全蛋','李铁蛋','oldboy'} stus_python={'李二丫','wxx','liudehua','alex','egon'} 所有的学生:并集 print(stus_linux | stus_python) print(stus_linux.union(stus_python))
7.1.3 差集
stus_linux={'alex','egon','张全蛋','李铁蛋','oldboy'} stus_python={'李二丫','wxx','liudehua','alex','egon'} 只报名linux,没有报名python的:差集 print(stus_linux - stus_python) print(stus_linux.difference(stus_python))
7.1.4 交叉补集
stus_linux={'alex','egon','张全蛋','李铁蛋','oldboy'} stus_python={'李二丫','wxx','liudehua','alex','egon'} 没有同时报名两门课程的学生姓名:交叉补集 print(stus_linux ^ stus_python) print(stus_linux.symmetric_difference(stus_python))
第8章 运算符
身份运算(is ,is not)
is比较的是id,而双等号比较的是值
毫无疑问,id若相同则值肯定相同,而值相同id则不一定相同
>>> x=1234567890 >>> y=1234567890 >>> x == y True >>> id(x),id(y) (3581040, 31550448) >>> x is y False
第9章 数据类型总结
9.1 按照存储空间的占用分(顺序从低到高)
数字 |
|
字符串 |
|
集合: |
无序,即无也无索引相关信息 |
元组: |
有序,需要存索引相关信息,不可变 |
列表: |
有序,需要存索引相关信息,可变,需要处理数据的增删改 |
字典: |
无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改
|
9.2 按照存值个数区分
标量/原子类型 |
数字,字符串 |
容器类型 |
列表,字典,元组 |
9.3 按可变不可区分
可变 |
字典,列表 |
不可变 |
数字,字符串,元组 |
9.4 按照访问顺序区分
直接访问 |
数字 |
顺序访问(序列类型) |
列表,元组,字符串 |
key值访问(映射类型) |
字典 |
第10章 字符编码
10.1 知识储备
1)
CPU
内存
硬盘
2)文本编辑器
结论:在编写py程序的时候,是没有语法的限制,编辑的结果跟编写一个普通的文本文件是没有任何区别,只有把py程序交给python解释器并且在运行的第三个阶段才有语言意义。
3)python解释器实行python程序的原理
python3 test.py
第一阶段:先启动python解释器这个软件
第二阶段:将test.py文件读到内存
第三阶段:解释执行,识别语法
4)文本编辑器读原理
文件处理
10.2 什么是字符编码
人类的字符---> 翻译 ---> 数字
翻译的过程必须遵循一个标准:字符与数字一一对应的关系
这个标准称之为字符编码表
ASCII
8bit=1bytes,一个英文占用1字节
GBK
16bit=2bytes 2个字节表示一个中文字符,1个字节表示一个英文字符
unicode(内存中固定的编码)
16bit =2bytes 2个字节表示一个字符
utf-8:Unicode Transformation Format
#3个字节表示一个中文字符,1个字节表示一个英文字符
#保证不乱码的核心就是:文件是以什么编码存的,就必须以该编码独取
#强调:我们能控制的只是硬盘存与取。
#python3解释器,默认UTF-8编码
#python2解释器,默认ASCII编码
10.3 文件头的作用!!!重点
coding:utf-8 是告诉python解释器,用我指定的编码。
10.4 执行python程序第三个阶段发生的事
会识别python语法,定义的字符串类型又涉及到字符编码的概念
x='上' #x=str('上')
python2:
字符串分为两种形式:
x='上' #python2的strx类型会按照文件头指定的编码来存‘上’
str
unicode
python3:
str:被存成了unicode
10.5 转换
unicode ---> 编码encode -->gbk #.encode()
gbk--------->解码decode----->unicode #.decode()
#解码 .decode()
10.6 总结
文件头跟存的编码要一样.