第四篇:数据类型
一.数字类型
1.1整型与浮点型
基本使用 int用途:年龄,等级,各种号码 定义方式: age=10 #age=int(10) float用途:身高,体重,薪资 定义方式: height=1.81 #height=float(1.81)
1.2常用操作加内置方法
print(bin(3)) #十进制转成二进制,0b11 binary表示二进制的意思 print(oct(8)) #十进制转成八进制,0o10 print(10) #10 print(hex(16)) #十进制转成十六进制,0x10
1.3int与float类型总结
存一个值or存多个值 只能存一个值 可变or不可变(了解:可变==不可hash,不可变==可hash) !!!可变:值变,id不变。 !!!不可变:值变,id就变。
age=18 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]))
二.字符串类型
2.1str的用途
str用途:描述性的数据,比如名字\国籍\学历\家庭住址
2.2字符串的定义方式
# 在单引号或双引号或三引号内的一串字符 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))
2.3字符串的常用操作+内置方法
优先掌握的操作
#1、按索引取值(正向取+反向取) :只能取 name='egon你好' print(name[0]) print(name[4]) print(name[1000]) # print(name[-1]) # print(type(name[-2])) # name[-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、长度len msg='alex say my name is sb' print(len(msg)) # 字符的个数 #4、成员运算in和not in msg='alex say my name is sb' print('alex' in msg) print('alex' not in msg) #5、移除空白strip s='*****egon****' print(s.strip('*')) s=s.strip('*') print(s) # name=' egon ' # print(name.strip()) # 改进 # name=input('用户名>>: ').strip() # print(len(name)) # name=name.strip() # if name == 'alex': # print('用户名正确') #6、切分split info='egon:123:admin' res=info.split(':') print(res,type(res)) print(res[0]) cmd='get|a.txt|32123123' print(cmd.split('|')) #7、循环 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.1列表的用途
列表用途:存放多个值
3.2列表的定义方式
l=['a','b','c'] #l=list(['a','b','c']) l1=list('hello') print(l1)
3.2列表的常用操作+内置方法
#1、按索引存取值(正向存取+反向存取):即可改也可以取 l=['a','b','c'] # print(id(l)) # print(l[-1]) # l[0]='A' # print(id(l)) # print(l) # l[3]='d' # 报错 #2、切片(顾头不顾尾,步长) stus=['alex','egon','wxx','yxx','lxx'] # # print(stus[1:3]) #3、长度 # stus=['alex','egon','wxx','yxx','lxx'] # print(len(stus)) #4、成员运算in和not in # stus=['alex','egon','wxx','yxx','lxx'] # print('alex' in stus) #5、追加 # stus=['alex','egon','wxx','yxx','lxx'] # stus.append('wupei') # stus.append('peiqi') # print(stus) # 插入 # stus=['alex','egon','wxx','yxx','lxx'] # stus.insert(1,'艾利克斯') # print(stus) #6、删除 stus=['alex','egon','wxx','yxx','lxx'] # del stus[1] # print(stus) # stus.remove('alex') # print(stus) # stus.pop(1) # stus.pop() # 默认删除末尾 # print(stus) # res1=stus.remove('alex') # 单纯的删除 # print(res1) # res2=stus.pop(0) # 取走一个值 # print(res2) #7、循环 # stus=['alex','egon','wxx','yxx','lxx'] #依赖索引 # i=0 # while i < len(stus): # print(stus[i]) # i+=1 # for i in range(len(stus)): # print(i,stus[i]) # 不依赖索引 # for item in stus: # print(item) #补充for循环 # for i in range(0,5,2): #0 2 4 # print(i) # for i in range(10):#默认从零起始 # print(i) # for i in range(10,-2,-1): # print(i) # 需要掌握的操作 # stus=['alex','egon','alex','wxx','yxx','lxx'] # print(len(stus)) # stus.__len__() # print(stus.count('alex')) # stus.extend(['a','b','c'])#拼接 # print(stus) # stus.append(['a','b','c'])#列表整体加进去了 # print(stus) # print(stus.index('alex',1,5)) # stus.reverse() # print(stus) # l=[1,10,3,12] # l.sort(reverse=True) # print(l) # 大前提:只能同类型直接比较大小,对于有索引值直接的比较是按照位置一一对应进行比较的 # s1='hello' # s2='hf' # print(s1 > s2) # l1=[3,'a','b','c'] # l2=['xxx','d'] # print(l1 > l2) # print('Z' > 'a') #A-Za-z#大A到大Z 小a到小Z # print('a' > 'B') # # 了解 # stus.clear() # print(stus) # l=stus.copy() # print(l) # stus = ['alex', 'egon', 'alex', 'wxx', 'yxx', 'lxx'] # # print(len(stus)) # stus.__len__() # print(stus.index('alex',1,5)) # stus.reverse() # print(stus) # # l=[1,10,3,12] # l.sort(reverse=True) # print(l) # __开头__结尾是满足某种条件的情况下自动触发的
3.4列表的练习
# 队列:先进先出 l1=[] #入队 l1.append('first') l1.append('second') l1.append('third') print(l1) #出队 print(l1.pop(0))#['second','third'] print(l1.pop(0))#['third'] print(l1.pop(0))#[] #堆栈:先进后出 l1=[] #入栈 l1.append('first') l1.append('second') l1.append('third') #出栈 print(l1.pop()) print(l1.pop()) print(l1.pop())
四.元祖类型
4.1什么是元祖?
元组就是一个不可变的列表
用途:存多个值,但是只有读的需求,没有改的需求
强调:在元素个数相同的情况下,使用元组更加节省空间
4.2元祖的定义方式
t=(1,2,3,4) #t=tuple((1,2,3,4)) print(id(t),type(t),t)
4.3元祖的常用操作+内置方法
优先掌握的操作: 1、按索引取值(正向取+反向取):只能取 2、切片(顾头不顾尾,步长) t=(1,2,3,4,5,6) print(t[1:4]) print(tuple('hello')) for i in range(10000): print(i) print(tuple(range(10000))) 3、长度 4、成员运算in和not in 5、循环 t=('a','b','c','c') # t[0]=1111 print(t.index('a')) print(t.count('c'))
4.4元祖的类型总结
1 存多个值 2 有序 3 不可变
4.5练习
#简单购物车,要求如下: 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入 msg_dic={ 'apple':10, 'tesla':100000, 'mac':3000, 'lenovo':30000, 'chicken':10, }
msg_dic={ 'apple':10, 'tesla':100000, 'mac':3000, 'lenovo':30000, 'chicken':10, } goods_l=[] while True: for key,item in msg_dic.items(): print('name:{name} price:{price}'.format(price=item,name=key)) choice=input('商品>>: ').strip() if not choice or choice not in msg_dic:continue count=input('购买个数>>: ').strip() if not count.isdigit():continue goods_l.append((choice,msg_dic[choice],count)) print(goods_l)
五.字典类型
5.1字典的用途
以key:value的形式存多个值
优点:存取都快,每一个值都有对应的key
5.2字典的定义方式
{}内以逗号分隔多个元素,格式为key:value, 其中key必须为不可变类型,value可以是任意类型 dic={'x':1,'y':1,'x':1111} #dic=dict({'x':1,'y':1,'x':1111}) #后面那个key把前面那个key覆盖掉了 print(dic) dic=dict(x=1,y=2,z=3) print(dic)
5.3字典的常用操作+内置方法
优先掌握的操作: 1、按key存取值:可存可取 dic={'name':'egon'} dic['age']=10 print(dic) dic['name']='EGON' print(dic) dic['name']=dic['name'].upper() print(dic) 2、长度len dic={'name':'egon','age':18} print(len(dic)) 3、成员运算in和not in:判断的字典的key #4、删除 dic={'name':'egon','age':18} del dic['name'] print(dic) res=dic.pop('name') print(res) print(dic) res=dic.pop('sex',None) #pop后面如果弹出的是没有的 那么得到逗号后面的返回值 print(dic) print(res) 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()) 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())) 4、掌握的操作 dic={'name':'egon','age':18} print(dic.get('namexxxxx')) #get根据key取value 如果没有的话不会报错取none print(dic['namexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx']) print(dic.popitem()) 随机弹一个键值对返回的是元祖的形式 dic.setdefault() dic.update({'x':1,'age':19}) 对与老字典来说,更新指的是,新字典中有而老字典中没有则添加,新有而老有,则覆盖 print(dic) 有序类型 字符串列表和元祖 dic.fromkeys() good_info={ 'name':None, 'price':None, 'count':None } 'mac' 20000 10 good_info['name']='mac' print({}.fromkeys(['name','age','sex'],None)) {'name':None,'age':None,'sex':None} list1=['name','age','sex'] dic={} for x in list1: dic[x]=None print(dic) print({}.fromkeys(list1,None)) print({}.fromkeys(['name','age','sex'],'xxxxxx')) setdefaul的用处: 1、字典有中有key,则不修改,返回原key对应的原值 dic={'name':'egon','age':18} res=dic.setdefault('name','EGON') print('返回值',res) print(dic) 2、没有对应的key,则添加,返回添加的key对应的value dic={'age':18} res=dic.setdefault('name','EGON') print('返回值',res) print(dic) #{'age': 18, 'name': 'EGON'}
5.4字典总结
总结 1、存多个值 2、无序 3、可变 dic={'x':1} print(id(dic)) dic['x']=2 print(dic) print(id(dic))
六.集合类型
5.1引子
找出下面列表中既学了linxu又学了python的学员
stus_linux=['alex','egon','张全蛋','李铁蛋','oldboy'] stus_python=['李二丫','wxx','liudehua','alex','egon'] stus_py_lx=[] for stu in stus_linux: if stu in stus_python: stus_py_lx.append(stu)#这个学生既学了linxu又学了python print(stus_py_lx)
5.2集合的用途
#用途 # 1、 关系运算 # 2、去重 s1=set('hello') #花括号内用逗号分隔 print(s1) l=['a','b',1,'a','a'] print(list(set(l))) #想去重还想保证原来的顺序:了解 l = ['a', 'b', 1, 'a', 'a'] l_new=[] s=set() for item in l: if item not in s: s.add(item) #s={'a','b',1} l_new.append(item) #l_new=['a','b',1]
5.3集合的定义方式
#定义方式:在{}内用逗号分隔开一个个元素 #注意的问题 #1、集合内没有重复的元素 #2、集合的元素必须是不可变类型 s={1,2,3,4,4,4,4,4,4,4,'a'} #s=set({1,2,3,4,'a'}) print(id(s),type(s),s) s={[1,2,3],'aa'}
5.4集合的常用操作和内置方法
#常用操作与内置方法 stus_linux={'alex','egon','张全蛋','李铁蛋','oldboy'} stus_python={'李二丫','wxx','liudehua','alex','egon'} #既报名linux又报名python的学生:交集 print(stus_linux & stus_python) print(stus_linux.intersection(stus_python)) #所有的学生:并集 print(stus_linux | stus_python) print(stus_linux.union(stus_python)) # 只报名linux,没有报名python的:差集 print(stus_linux - stus_python) print(stus_linux.difference(stus_python)) print(stus_python - stus_linux) print(stus_python.difference(stus_linux)) # 没有同时报名两门课程的学生姓名:交叉补集 print(stus_linux ^ stus_python) print(stus_linux.symmetric_difference(stus_python)) #优先掌握,循环取值 #长度len #成员运算in和not in # 查看 s1={1,'a','b','c','d'} for item in s1: print(item) # 增加 s1={'a','b','c'} # s1.add() # 一次添加一个值 s1.add(4) print(s1) s1.update({3,4,5}) #一次添加多个值 print(s1) # 删除 # s1.discard() ## 当删除的元素不存在的时候,不会报错 s1.discard(4) print(s1) # s1.remove() # 当删除的元素不存在的时候,报错 s1.remove(4) s1.pop() #随机取走一个元素 res=s1.pop() print(res) #了解的方法 s1={1,2,3} s2={1,2} s1=s1.difference(s2) print(s1) s1.difference_update(s2) print(s1) # s1.isdisjoint() #如果两个集合没有交集则返回True s1={1,2,3} s2={4,5,6} print(s1.isdisjoint(s2)) print(s2.isdisjoint(s1)) # 了解的知识点 #父集:爹包含儿子 s1={1,2,3} s2={1,2} print(s1.issubset(s2)) print(s2.issubset(s1)) print(s1.issuperset(s2)) print(s1 > s2) # 代表s1包含s2,s1是s2父集 print(s2 < s1) # s2是s1子集 s3={1,2,3} s4={1,2,3} print(s3.issuperset(s4)) print(s4.issuperset(s3)) print(s3 == s4) print( s3 >= s4) print( s4 >= s3)
练习
一.关系运算 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} 1. 求出即报名python又报名linux课程的学员名字集合 2. 求出所有报名的学生名字集合 3. 求出只报名python课程的学员名字 4. 求出没有同时这两门课程的学员名字集合
# 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} # 求出即报名python又报名linux课程的学员名字集合 print(pythons & linuxs) # 求出所有报名的学生名字集合 print(pythons | linuxs) # 求出只报名python课程的学员名字 print(pythons - linuxs) # 求出没有同时这两门课程的学员名字集合 print(pythons ^ linuxs)
二.去重 1. 有列表l=['a','b',1,'a','a'],列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序 2.在上题的基础上,保存列表原来的顺序 3.去除文件中重复的行,肯定要保持文件内容的顺序不变 4.有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序 l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ]
#去重,无需保持原来的顺序 l=['a','b',1,'a','a'] print(set(l)) #去重,并保持原来的顺序 #方法一:不用集合 l=[1,'a','b',1,'a'] l1=[] for i in l: if i not in l1: l1.append(i) print(l1) #方法二:借助集合 l1=[] s=set() for i in l: if i not in s: s.add(i) l1.append(i) print(l1) #同上方法二,去除文件中重复的行 import os with open('db.txt','r',encoding='utf-8') as read_f,\ open('.db.txt.swap','w',encoding='utf-8') as write_f: s=set() for line in read_f: if line not in s: s.add(line) write_f.write(line) os.remove('db.txt') os.rename('.db.txt.swap','db.txt') #列表中元素为可变类型时,去重,并且保持原来顺序 l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ] # print(set(l)) #报错:unhashable type: 'dict' s=set() l1=[] for item in l: val=(item['name'],item['age'],item['sex']) if val not in s: s.add(val) l1.append(item) print(l1) #定义函数,既可以针对可以hash类型又可以针对不可hash类型 def func(items,key=None): s=set() for item in items: val=item if key is None else key(item) if val not in s: s.add(val) yield item print(list(func(l,key=lambda dic:(dic['name'],dic['age'],dic['sex']))))
六.数据类型总结
按存储空间的占用分(从低到高)
数字
字符串
集合:无序,即无序存索引相关信息
元组:有序,需要存索引相关信息,不可变
列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改

浙公网安备 33010602011771号