python基本数据类型及其使用方法
前言
python中的数据类型主要为int、float、string、list、tuple、dict、set、bool、bytes。接下来int和float统称为数字类型。
1.数据类型总结
按存储空间的占用大小分(从低到高)
数字
字符串
集合:无序,即无需存索引相关信息, 可变
元组:有序,需要存索引相关信息,不可变
列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改
按存值的个数区分
数字,字符串 # 标量/原子类型
列表,元组,字典,集合 # 容器类型
按可变不可变类型区分
列表,字典,集合 # 可变 -->不可hash
数字,字符串,元组 # 不可变-->可hash,不可变类型对象在自己的生命周期中内置有哈希值,所以可哈希的对象可以通过哈希值进行对比,也可以作为字典的键值和作为set函数的参数,可以使用__hash__()方法查看
按访问顺序区分
字典 # key值访问(映射类型)
字符串,列表,元组 # 顺序访问(序列类型)
2.数字类型
#整型int
作用:年纪,等级,身份证号,qq号等整型数字相关
定义:
age=10 #本质age=int(10)
注意:使用int()进行强制类型转换时,如果对象不是纯数字,那么就会报错,比如int('11.11')
#浮点型float
作用:薪资,身高,体重,体质参数等浮点数相关
salary=3000.3 #本质salary=float(3000.3)
注意:float强制类型转换时,float('11')--》11.0
#整型、浮点型进行的运算(如果参与运算的元素有浮点型,那么结果肯定是浮点型)
print(8/3) # 除 2.6666666666666665
print(8/.2) # 除 40.0
print(8/0.2) # 除 40.0
print(8//5) # 整除 1
print(8.0//5) # 整除 1.0
print(8*3) # 乘法 24
print(8.0*3) # 乘法 24.0
print(2**3) # 次方 8
print(2.0**3) # 次方 8.0
#二进制,十进制,八进制,十六进制
#长整形(了解)
在python2中(python3中没有长整形的概念):
>>> num=2L
>>> type(num)
<type 'long'>
#复数(了解)
>>> x=1-2j
>>> x.real
1.0
>>> x.imag
-2.0
3.字符串类型
#作用:名字,性别,国籍,地址等描述信息
#定义:在单引号\双引号\三引号内,由一串字符组成
name='sybil'
name="sybil"
name='''sybil'''
#优先掌握的操作:
#1、按索引取值(正向取+反向取) :只能取,索引不存在时会报错
s = 'abcd'
s[0] --> 'a'
s[-2] --> 'c'
#2、切片(顾头不顾尾,步长)
s = '01234'
s[0:3] --> '012'
s[0:300] -> '01234'#索引溢出并不会报错,而是返回字符串最大长度的值
#s[start:end:step] #start不写默认从头开始,end不写默认至到结束,setp默认为1,也可以是负数
#字符串切片同列表切片类似,当步长为正数时,start<end才能取到值;步长为负数时,start>end才能取到值;注意,如果步长<0,当start不写时,表示在结束位置(@代表start位置: 01234@);end不写时,表示在头的位置。(@代表end位置: @01234)。(sybil的想法:实际上step<0时,将start和end的值调换,然后顾尾不顾头,之后反转即可)
print(s[:]) # 01234
print(s[0:3]) # 0123
print(s[3:]) # 34
print(s[3:3]) # ''
print(s[3:1]) # ''
print(s[0::-1]) # 0
print(s[:0:-1]) # 4321
print(s[:3:-1]) # 4
print(s[:3:1]) # 012
print(s[0:3:-1]) # ''
print(s[3:0:-1]) # 321
print(s[-4:0:-1]) # 1
#3、长度len
s = 'abcd'
len(s) #返回字符串的长度 4
#4、成员运算in和not in
s = 'abcd'
'a' in s --> True
'a' not in s --> False
#5、移除空白strip(默认是空白字符:换行、tab、空格等,可以一次指定去除多个字符)
s=' ab cd '
s.strip() --> 'ab cd' #默认是过滤左右两边的空白字符,中间的无法去除
s = '* ab#cd *#'
s.strip('* #') --> 'ab#cd' #可以指定多个要去除的字符,但同样只能去除左右两边的
#6、切分split(默认是以空白字符切分,可以使用第二个参数指定切分的次数)
s = 'sybil:18:female'
print(s.split(':')) # ['sybil', '18', 'female']
s1 = 'sybil:18:female'
print(s.split(':', 1)) # ['sybil', '18:female']
s2 = 'sybil 18 female'
print(s2.split()) # ['sybil', '18', 'female']
#7、循环
s = 'sybil'
for item in s:
print(i, end=' ') # s y b i l
#其余操作
#1、lstrip,rstrip 使用同strip一样
s = '**sy bil*#'
print(s.rstrip('*#')) # **sy bil 只去除右边的字符
print(s.lstrip('*')) # sy bil*# 只去除左边的字符
#2、lower,upper
s = 'Sybil66'
print(s.upper()) # SYBIL66 将字符串中的字母全变为大写
print(s.lower()) # sybil66 将字符串中的字母全变为小写
#3、startswith,endswith
s = 'Sybil66'
print(s.startswith('S')) # True 判断字符串是否以S开头
print(s.startswith('Sy')) # True 判断字符串是否以Sy开头
print(s.endswith('7')) # False 判断字符串是否以7结束
print(s.endswith('77')) # False 判断字符串是否以77结束
#4、format的三种玩法
res='{} {} {}'.format('egon',18,'male') # egon 18 male
res='{1} {0} {1}'.format('egon',18,'male') # 18 egon 18
# egon 18 male
res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)
#5、split,rsplit 使用同split一样
s = 'sybil:18:female'
print(s.rsplit(':', 1)) # ['sybil:18', 'female']
print(s.lsplit(':', 1)) # ['sybil', 18:female']
#6、join 将列表中 的元素按指定字符拼接为字符串
res = ['sybil', '18', 'female']
print('@'.join(res)) # sybil@18@female
#7、replace 字符串中指定子序列替换为想要的元素
s = 'sybil:18:female'
print(s.replace(':', '@')) # sybil@18@female
print(s.replace(':', '@', 1)) # sybil@18:female
#1、find,rfind,index,rindex,count find同index最大的区别是index找不到会报错,而find是返回-1
s = 'onebyone'
print(s.find('n')) # 1
print(s.find('z')) # -1
print(s.rfind('n')) # 6
print(s.index('n')) # 1
print(s.rindex('n')) # 6
print(s.count('n')) # 2
#2、center,ljust,rjust,zfill
s = 'two'
print(s.center(9, '*')) # ***two***
print(s.ljust(9, '*')) # two******
print(s.rjust(9, '*')) # ******two
print(s.zfill(9)) # 000000two
#3、expandtabs 将字符串的中tab制表符以空格显示,默认tabsize=8
s = 'moon\tcake'
print(len(s.expandtabs())) # moon cake
#4、captalize,swapcase,title
s = 'moon cake'
print(s.capitalize()) # Moon cake 首字母大写
print(s.swapcase()) # MOON CAKE 大小写翻转
print(s.title()) # Moon Cake 每个单词的首字母大写
#5、is数字系列
#在python3中
num1=b'4' #bytes
num2=u'4' #unicode,python3中无需加u就是unicode
num3='四' #中文数字
num4='Ⅳ' #罗马数字
#isdigt:bytes,unicode
print(num1.isdigit()) #True
print(num2.isdigit()) #True
print(num3.isdigit()) #False
print(num4.isdigit()) #False
#isdecimal:uncicode
#bytes类型无isdecimal方法
print(num2.isdecimal()) #True
print(num3.isdecimal()) #False
print(num4.isdecimal()) #False
#isnumberic:unicode,中文数字,罗马数字
#bytes类型无isnumberic方法
print(num2.isnumeric()) #True
print(num3.isnumeric()) #True
print(num4.isnumeric()) #True
#三者不能判断浮点数
num5='4.3'
print(num5.isdigit()) # False
print(num5.isdecimal()) # False
print(num5.isnumeric()) # False
#6、is其他
name = 'sybil'
print(name.isalnum()) # True 判断字符串是否只包含字母或数字
print(name.isalpha()) # True 判断字符串是否只包含字母
print(name.isidentifier()) # True 判断变量名是否合法
print(name.islower()) # True 判断字符串包含的字母是否都是小写
print(name.isupper()) # False 判断字符串包含的字母是否都是大写
print(name.isspace()) # False 判断字符串是否只由空格组成
print(name.istitle()) # False 判断是否字符串中的每个单词首字母都是大写
print('Go 23Ahead'.istitle()) # True
4.列表
#作用:多个装备,多个爱好,多门课程,多个女朋友等
#定义:[]内可以有多个任意类型的值,逗号分隔
fruit_list=['apple','pear'] #本质fruit_list=list([...])
l=list('abc') # ['a', 'b', 'c']
# 使用list()时,相当于for循环将可迭代对象中的值依次取出append至一个列表
l2=list({'x':1,'y':2,'z':3}) # ['x', 'y', 'z']
#优先掌握的操作:
#1、按索引存取值(正向存取+反向存取):即可存也可以取,索引不存在时报错
l = [0, 1, 2, 3, 4, 5]
print(l[2]) # 2
print(l[-4]) # 2
l[0] = 6
print(l) # [6, 1, 2, 3, 4, 5]
#2、切片(顾头不顾尾,步长),同字符串的切片方法一样
l = [0, 1, 2, 3, 4, 5]
print(l[::-1]) # [5, 4, 3, 2, 1, 0] 列表翻转
print(l[0:3]) # [0, 1, 2]
print(l[0::-1]) # [0]
print(l[0:4:2]) # [0, 2]
#3、长度
l = [0, 1, 2, 3, 4, 5]
print(len(l)) # 6
#4、成员运算in和not in
l = [0, 1]
print(0 in l) # True
print(0 not in l) # False
#5、追加append 会将参数当做一个值来追加至列表的末尾
l = [0, 1]
l.append(2)
l.append('abc')
l.append([3, 4])
print(l) # [0, 1, 2, 'abc', [3, 4]]
#6、追加extend
l = [1, 2]
l.extend('34') # 会将可迭代对象中的元素依次追加至列表末尾
print(l)
#7、删除 有三种方式:del remove pop clear清空列表
l = [0, 1, 2]
del l[0] # 根据索引删除值,索引不存在时报错,且没有返回值
print(l) # [1, 2]
l = [0, 1, 2, 'a']
res = l.remove('a') # 指定要删除的元素,不存在时报错
print(res) # 删除成功时返回None
print(l) # [0, 1, 2]
l = [0, 1, 2, 'a']
res = l.pop() # 默认删除列表末尾的元素,并返回删除的值
print(res, l) # a [0, 1, 2]
res2 = l.pop(0) # 可以指定索引,索引不存在时报错
print(res2, l) # 0 [1, 2]
l = [2, 1, 4]
l.clear() # 删除列表中所有元素,无返回值
print(l) # []
#8、循环
l = [1, 2, 3, 4]
for i in l:
print(i, end=' ') # 1 2 3 4
#9、insert 指定索引前插入值
l = [1, 2]
l.insert(0, 'a') # ['a', 1, 2]
print(l)
l.insert(1, 'b')
print(l)
l.insert(-1, 'c')
print(l)
#10、reverse 翻转列表
l = [2, 1, 5]
l.reverse()
print(l) # [5, 1, 2]
#11、sort 排序
l = [2, 1, 5]
l.sort() #默认升序排序
print(l) # [1, 2, 5]
l.sort(reverse=True) #降序排序
print(l) # [5, 2, 1]
#12、count 统计元素个数 index 返回元素索引,如果元素不存在则报错
l = [1, 2, 1, 2]
print(l.count(2)) # 2
print(l.index(2)) # 1
# 使用index获取索引时,使用start, stop参数时,同列表的切片使用方法一样顾头不顾尾,如果该区间内不存在想获取的元素会报错
print(l.index(2, 0, 2)) # 1
#13、copy 复制列表,不过只是值复制
l = [1, 2, 3]
l2 = l.copy()
print(l2) # [1, 2, 3]
print(l == l2) # True 这意味它们其实是同一个列表
5.元组
#作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读
#定义:与列表类型比,只不过[]换成()
age=(11,22,33,44,55)本质age=tuple((11,22,33,44,55))
t1 = tuple('hello') # ('h', 'e', 'l', 'l', 'o')
#优先掌握的操作(下列方法同列表的一样,此处不描述):
#1、按索引取值(正向取+反向取):只能取
#2、切片(顾头不顾尾,步长)
#3、长度
#4、成员运算in和not in
#5、循环
#6、count 统计元素个数 index 返回元素索引,如果元素不存在则报错
# 注意
#1、如果元组只有一个元素时,一定要加个逗号
t = (4)
t2 = (4, )
print(t, type(t)) # 4 <class 'int'>
print(t2, type(t2)) # (4,) <class 'tuple'>
#2、元组是不可变类型,改变他的元素时会报错,但是可以修改元素的元素
t = (1, [1, 2], 'a')
t[1][0] = '@'
print(t) # (1, ['@', 2], 'a')
6.字典
#作用:存多个值,key-value存取,取值速度快
#定义:key必须是不可变类型,value可以是任意类型
info={'name':'egon','age':18,'sex':'male'} #本质info=dict({....})
或
info=dict(name='egon',age=18,sex='male')
或
info=dict([['name','egon'],('age',18)])
#优先掌握的操作:
#1、按key存取值:可存可取
dic = {'name': 'sybil', 'skill': 'fly'}
print(dic['name']) # 'sybil'
dic['skill'] = 'magic'
print(dic) # {'name': 'sybil', 'skill': 'magic'}
#字典可以使用get方法取值,如果key不存在不会报错,默认是返回None,可以自定义
dic = {'name': 'sybil', 'skill': 'fly'}
print(dic.get('age', '该Key不存在')) # 该Key不存在
dic['age'] # 直接报错
#2、长度len 返回字典中键值对的个数
dic = {'name': 'sybil', 'skill': 'fly'}
print(len(dic)) # 2
#3、成员运算in和not in 判断的都是key
dic = {'name': 'sybil', 'skill': 'fly'}
print('name' in dic) # True
print('fly' in dic) # False
#4、删除 del pop popitem
dic = {'name': 'sybil', 'skill': 'fly'}
del dic['skill'] # key不存在时会报错,没有返回值,企图print时会报语法错误
print(dic) # {'name': 'sybil'}
#pop删除key对应的value,并返回value,key不存在时报错
print(dic.pop('name')) # 'sybil'
print(dic) # {'skill': 'fly'}
# popitem随机删除一个键值对,并返回该键值对元组,如果字典为空时使用则报错
print(dic.popitem()) # ('skill', 'fly')
print(dic) # {'name': 'sybil'}
#5、键keys(),值values(),键值对items(),得到的结果是字典的一些对象,可以使用list强转或者for循环取值等
dic = {'name': 'sybil', 'skill': 'fly'}
print(dic.keys()) # dict_keys(['name', 'skill'])
print(dic.values()) # dict_values(['sybil', 'fly'])
print(dic.items()) # dict_items([('name', 'sybil'), ('skill', 'fly')])
#6、循环 默认就是取字典的key
dic = {'name': 'sybil', 'skill': 'fly'}
for k in dic:
print(k, end=' ') # name skill
#7、fromkeys 创建一个字典,第一个参数是可迭代对象,其中的的元素作为字典的key,第二个参数是所有key对应的value。
dic = {}
s = 'ab'
dic = dic.fromkeys(s, 1)
print(dic) # {'a': 1, 'b': 1}
#如果fromkeys第二个参数是可变类型:比如说列表,
#那么所有key对应的value的内存地址都一样,即共用一个列表,一个变全都变
dic = {}
l = ['name', 'skill']
dic = dic.fromkeys(l, [])
print(dic) # {'name': [], 'skill': []}
dic['name'].append('sybil')
print(dic) # {'name': ['sybil'], 'skill': ['sybil']}
#8、update与setdefault,更新字典,参数可以是字典或者是可以解压赋值出两个值的可迭代对象如:[['name', 'cc'], ['age', 18]]
#update 如果Key存在则修改对应的value,如果不存在则增加对应的key:value
dic = {'name': 'sybil', 'skill': 'fly'}
new_dic = {'name': 'cc', 'age': 18}
dic.update(new_dic)
print(dic) # {'name': 'cc', 'skill': 'fly', 'age': 18}
# setfault 如果key存在则不进行任何操作,否则增加key:value,两种情况下都会返回key对应的value
dic = {'name': 'sybil', 'skill': 'fly'}
print(dic.setdefault('name', 'cc')) # sybil
print(dic) # {'name': 'sybil', 'skill': 'fly'}
print(dic.setdefault('age', '18')) # 18
print(dic) # {'name': 'sybil', 'skill': 'fly', 'age': '18'}
7.集合
#作用:去重,关系运算,
#定义集合:
集合:在{}内用逗号分隔开的多个值
集合的元素遵循三个原则:
1:每个元素必须是不可变类型(可hash,可作为字典的key)
2: 没有重复的元素
3:无序
注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
#优先掌握的操作:
#1、长度len
s = {'a', 'b', 'c'}
print(len(s)) # 3
#2、成员运算in和not in
s = {'a', 'b', 'c'}
print('a' in s) # True
print('a' not in s) # False
#3、|合集
pythons = {'x', 'y', 'z'}
linux = {'x', 'y', 'a'}
print(pythons | linux) # {'a', 'z', 'y', 'x'}
#4、&交集
pythons = {'x', 'y', 'z'}
linux = {'x', 'y', 'a'}
print(pythons & linux) # {'y', 'x'}
#5、-差集
pythons = {'x', 'y', 'z'}
linux = {'x', 'y', 'a'}
print(pythons - linux) # {'z'}
print(linux - pythons) # {'a'}
#6、^对称差集
pythons = {'x', 'y', 'z'}
linux = {'x', 'y', 'a'}
print(pythons ^ linux) # {'z', 'a'}
#7、==
s1 = {1, 2}
s2 = {2, 1}
print(s1 == s2) # True
#8、父集:>,>=
s1 = {1, 2, 3}
s2 = {2, 1}
print(s1 > s2) # True s1是s2的子集
#9、子集:<,<=
s1 = {1, 2, 3}
s2 = {2, 1}
print(s2 < s1) # True
print(s1 <= s2) # False
#10、add与update
s = {1, 2}
s.add(3)
s.add(('a', 'b')) #类似列表的append方法,不过插入位置不定,因为是无序的
print(s) # {1, 2, 3, ('a', 'b')}
s.update('45') #类似列表的extend方法,可迭代对象中的元素必须是不可变类型,否则会报错
print(s) # {1, 2, 3, '4', '5', ('a', 'b')}
#11、删除集合的值 pop remove discard
# pop 随机删除集合的一个值,并返回该值,如果集合为空则报错
s = {1, 2, 3}
print(s.pop()) # 1
print(s) # {2, 3}
# remove 单纯的删除,返回值为None,值不存在会报错
s = {1, 2}
print(s.remove(1)) # None
print(s) # {2}
# discard 删除值,返回值为None,如果值不存在也是返回None
s = {1, 2}
print(s.discard(1)) # None
print(s.discard(4)) # 值不存在时返回None
print(s) # {2}