第四篇:数据类型

一.数字类型

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映射的相关信息,可变,需要处理数据的增删改

 

posted @ 2018-12-28 20:32  王苗鲁  阅读(183)  评论(0)    收藏  举报