类型使用分解
2021-08-02 本文已影响0人
慕知
一,数字类型
1) 定义,整型
age=10
print(age,type(age))
10 <class 'int'>
2) 类型转换
# 字符串类型转换为数字类型
a='123'
print(type(a))
a=int(a)
print(type(a))
<class 'str'>
<class 'int'>
二,字符串类型
1) 定义
# 定义:在单引号\双引号\三引号内包含一串字符
name1='lili'
name2="pp"
name3='''bb'''
2) 类型转换
# 列表转字符串
name1=['lili','pp','bb']
print(type(name1))
name1=str(['lili','pp','bb'])
print(type(name1))
<class 'list'>
<class 'str'>
# 字典转字符串
info={"name":"mz","gender":"male"}
print(type(info))
info=str({"name":"mz","gender":"male"})
print(type(info))
<class 'dict'>
<class 'str'>
3) 索引取值
info = 'good morning'
# 正向取值
print(info[0])
g
# 反向取值
print(info[-2])
n
4)切片
info = 'good morning'
# 取出索引为0-12的所有字符
print(info[0:12])
good morning
# 反向切片,-1代表从右往左一次取值
print(info[::-1])
gninrom doog
# 第三个参数3代表步长,从索引0开始,每次累加3
info = 'good morning'
print(info[0:12:3])
gdoi
# 复制切片
msg='hello world'
print(msg[:])
print(msg[::-1])
hello world
dlrow olleh
# 取值第五个索引到第0个索引,反着取,顾头不顾尾
print(msg[5:0:-1])
olle
5) 字符串长度
# 空格也算一个字符
info = 'good morning'
print(len(info))
12
6)in / not in 判断
info = 'good morning'
# 判断good是否在字符info里
print('good' in info)
# 判断bad是否不在字符info里
print('bad' not in info)
True
True
7) strip lstrip rstrip移除字符串首尾制定的字符
--------------------------------strip
# 默认去除空格
name=' mz '
print(name)
print(name.strip())
mz
mz
# 去除制定字符
info='###mz###%'
print(info.strip('#%'))
mz
--------------------------------lstrip
# 移除左边的字符
info = '&&&& mz $$$'
print(info.lstrip('& '))
mz $$$
--------------------------------rstrip
# 移除右边的字符
info = '&&&& mz $$?'
print(info.rstrip('$ ?'))
&&&& mz
8) split / rsplit切分
--------------------------split
# 括号内不指定字符,默认以空格作为切分符号
info='hello baby'
print(info.split())
['hello', 'baby']
info='10.0.0.6'
print(info.split('.'))
['10', '0', '0', '6']
abc='C:/a/c/c.txt'
# 切割1次
print(abc.split('/',1))
# 切割2次
print(abc.split('/',2))
['C:', 'a/c/c.txt']
['C:', 'a', 'c/c.txt']
info="egon:16:female"
# 代表取出0,1,2的索引的值
res=info.split(':',2)
print(res)
['egon', '16', 'female']
注意:
split切割得到的结果是列表数据类型
---------------------------rsplit
# rsplit刚好与split相反,从右往左切割,可以指定切割次数
abc='a|b|c|d'
# 切割1次
print(abc.rsplit('|',1))
# 切割2次
print(abc.rsplit('|',2))
['a|b|c', 'd']
['a|b', 'c', 'd']
备注:
例(2www2eee2rrr)
如果以上按照2切分,那么得到第一个字符合作最后一个字符都是空
info="2www2ee2"
print(info.split('2'))
['', 'www', 'ee', '']
9) 循环
info='hello?'
for i in info:
print(i)
h
e
l
l
o
?
10) lower(),upper() 字符串大小写
# 将英文字符串全部变成大写
name='muzhi'
print(name.upper())
MUZHI
# 将英文字符串全部变成小写
name='MUzHI'
print(name.lower())
muzhi
11)startswith,endswith
----- 判断字符串是否以括号内指定的字符结尾 / 开始
# 判断字符info是否以girl为结尾
info='beautiful_girl'
print(info.endswith('girl'))
True
# 判断字符info是否以abc为开始
info='beautiful_girl'
print(info.startswith('abc'))
False
12)格式化输出 format
# 方式一
info='my name is %s,my age is %s' %('mz',13)
print(info)
# 方式二
info='my name is {x},my age is {y}'.format(x='mz',y=13)
print(info)
# 方式三
# 类似于%s的用法,传入的值会按照位置与{}一一对应
info='my name is {},my age is {}'.format('mz',13)
print(info)
# 方式四:
# 把format传入的多个值当作一个列表,然后用{索引}取值
info='my name is {0},my age is {1}'.format('mz',13)
print(info)
my name is mz,my age is 13
PS:
info='my name is {x}{x},my age is {y}{y}'.format(x='mz',y=13)
print(info)
my name is mzmz,my age is 1313
13)join 拼接(把一个纯字符串组成的列表拼接成字符串)
#join拼接:把一个纯字符串组成的列表拼接成字符串
l=["mz","18",'female']
rres=":".join(l)
print(rres)
mz:18:female
print('---'.join('abc'))
print('**'.join('hello'))
a=('11','22','33')
aa="*".join(a)
print(aa)
a---b---c
h**e**l**l**o
11*22*33
注意:
必须是字符串,数字类型会报错
a=('11','22','33')要加引号
14) replace 新的字符替换字符串中旧的字符
# 以下出现2个“mz”, 1代表只把第一个mz替换
info='my name is mz , my bbs name is mz,my age is 88'
info2=info.replace('mz','mm',1)
print(info2)
my name is mm , my bbs name is mz,my age is 88
15) isdigit
--------- 判断字符串是否是纯数字组成,返回结果为True或False
a='333'
print(a.isdigit())
True
b='333lg'
print(b.isdigit())
False
三,列表类型
1,用途
用途:按照索引记录多个值,索引反映的是位置
2,定义方式
定义方式: 在[ ]内用逗号分隔开个多个任意类型的元素
#例
res=["aaa",222,['aa','bb'],"pp"]
print(type(res))
<class 'list'>
#例1
info='hello'
print(type(info))
<class 'str'>
# 例2
info=list(info)
print(type(info))
<class 'list'>
# 例3
# # list数据类型转换:能够被for循环遍历的类型,都可以被list转成列表
res = list({'k1':111,"k2":222,'k3':333})
print(res)
['k1', 'k2', 'k3']
3,取 / 替换值
# 按照索引取值
info=["mz","egon",33]
# 正向取值
print(info[0])
# mz
# 反向取值
print(info[-1])
# 33
# 查看id
print(id(info))
# 4333209728
# 根据列表索引替换对应的值,字符串不可以这么做
info[2]="tom"
print(info)
# ['mz', 'egon', 'tom']
# 不可以操作不存在的索引
info[2]="pp" # 会报错
# 可以insert,补充索引和对应的值
info.insert(3,"lily")
print(info)
# ['mz', 'egon', 'tom', 'lily']
4,切片
#切片(顾头不顾尾,步长)
info=[11,22,33,44,55]
# 索引0-4,步长为1(0索引累加1个索引,得出值)
print(info[0:4:1])
# [11, 22, 33, 44]
# 索引1-4之间,步长为2(索引1开始,累加2个索引,得出值)
print(info[1:4:2])
# [22, 44]
# 浅拷贝
print(info[:])
# [11, 22, 33, 44, 55]
# 反向取值
print(info[::-1])
# [55, 44, 33, 22, 11]
5,长度
# 长度
info = [11,22,33]
print(len(info))
# 3
6,成员运算in / not in
info=[11,22,33]
# 判断22是否在列表info里
print(22 in info)
# True
易错
# 注意这里22加上引号是字符串
print("22" in info)
# False
info=[11,22,33]
print(77 not in info)
# True
7,追加 / 插入
# append 默认追加在最后,只能追加一个元素
info=[11,22,33]
info.append(44)
print(info)
# [11, 22, 33, 44]
# extend 一次性在列表最后加入多个元素,注意要加上列表中括号
info=[11,22,33,44]
info.extend([55,'66'])
print(info)
# [11, 22, 33, 44, 55, '66']
# insert 在指定位置上插入元素,注意这里可以不用给元素加上引号,不然识别的元素也会加上引号
info=[11,22,33]
info.insert(3,'44')
print(info)
# [11, 22, 33, '44']
# insert 指定索引更改元素
info=[11,22,33]
# 索引0增加元素99
info.insert(0,99)
print((info))
# [99, 11, 22, 33]
8,删除 del / pop / remove
1) del
# del删除,不返回删除值
info=[11,22,33]
del info[2]
print(info)
# [11, 22]
2) pop
# pop pop()默认删除列表最后一个元素,也可以指定索引删除
info=[11,22,33]
print(info.pop())
# 33
print(info)
# [11, 22]
# 指定索引,删除索引1的值
info=[11,22,33]
print(info.pop(1))
# 22
3) remove
# remove()括号内指名道姓表示要删除哪个元素,没有返回值
info=[11,22,33]
info.remove(11)
print(info)
# [22, 33]
9,reverse( ) 颠倒列表内元素的顺序
info=[11,22,33]
info.reverse()
print(info)
# [33, 22, 11]
等同于
info=[11,22,33]
print(info[::-1])
# [33, 22, 11]
10,sort()给列表内所有元素排序
# sort排序(从小到大)
info=[88,33,22]
info.sort()
print(info)
# [22, 33, 88]
# sort + reverse,指定排序并颠倒
info=[3,5,1,4,3]
info.sort(reverse=True)
print(info)
# [5, 4, 3, 3, 1]
# sort + reverse,指定排序并从小到大排列(多余,可以直接用sort)
info=[3,5,1,4,3]
info.sort(reverse=False)
print(info)
# [1, 3, 3, 4, 5]
PS:
# 列表元素数量不同,也比较大小
a=[1,2]
b=[3]
print(a > b)
# 字符也可以比大小
s1='abc'
s2='t'
print(s1 > s2)
# 列表里的字符排序
info=['aw','bb','kk']
info.sort()
print(info)
# ['aw', 'bb', 'kk']
# 列表里的字符和数字不可以排序(会报错)
info=['aw',44,'kk']
info.sort()
print(info)
# 44加引号 "44",不会报错
# # ['44', 'aw', 'kk']
11,循环
# 循环
my_friend=['tom','peter','bb']
for i in my_friend:
print(i)
# tom
# peter
# bb
四,元祖类型
1,元祖类型定义
info=('abc','bcd')
print(type(info))
# <class 'tuple'>
PS:
# 不要混淆字符串类型是一个元素,元祖类型是多个元素
info=('abc')
print(type(info))
# <class 'str'>
2,类型转换
# 类型转换
# 列表类型转元祖类型
info=tuple([1,2,3])
print(info)
# (1, 2, 3)
# 字典类型转元祖类型
info=tuple({"name":"mz","age":25})
print(info)
# ('name', 'age')
3,使用
1) 索引取值
tuple1=(11,22,33)
print(tuple1[0])
2) 切片(顾头不顾尾,步长)
tuple1=(11,22,33)
# 倒序取值
print(tuple1[::-1])
# (33, 22, 11)
# 索引1-3之间,索引3不算(顾头不顾尾),步长为1 取值
tuple1=(11,22,33,44,55)
print(tuple1[1:3:1])
# (22, 33)
3) 长度
tuple1=(11,22,33)
print(len(tuple1))
4) 成员运算
tuple1=(11,22,33)
print('aa' in tuple1)
# False
print(11 in tuple1)
# True
5)循环
# 循环
tuple1=(11,22,33)
for i in tuple1:
print(i)
# 11
# 22
# 33
五,字典类型
1,定义方式
在{}内用逗号分割开多个元素,其中每个元素都是由key:value的格式的组成
key, 必须是不可变类型(通常为字符串类型)
value, 可以是任意类型
dicc={"k1":22,"k2":"dd"}
print(type(dicc))
print(dicc["k1"])
#<class 'dict'>
#22
2,类型转换
# 字符串类型转换为列表类型
info=list('hello')
print(info)
# ['h', 'e', 'l', 'l', 'o']
# 原列表类型,转换为字典类型
info=[("name","muzhi"),("age",18)]
print(info,type(info))
#[('name', 'muzhi'), ('age', 18)] <class 'list'>
new_info=dict(info)
print(new_info)
# {'name': 'muzhi', 'age': 18}
3,常用操作+内置的方法
1.1)按key存取值(可存可取)
info={"name":"muzhi","age":66,"gender":"male"}
print(info["name"])
# muzhi
# 对于字典类型,可以根据不存在的key往里添加一组元素
info["hobby"]="sing"
print(info)
# {'name': 'muzhi', 'age': 66, 'gender': 'male', 'hobby': 'sing'}
1.2)get取值
info={"name":"muzhi","age":66,"gender":"male"}
print(info.get("name"))
# muzhi
# 取一个不存在的key值,返回None
print(info.get("name2"))
# None
2,长度
# 按照多少个key值得出长度
info={"name":"muzhi","age":66,"gender":"male"}
print(len(info))
# 3
3,成员运算in和not in
根据key判断
info={"name":"tom","age":18,"gender":"male"}
# 根据key值判断
print("name" in info)
# True
# 根据value判断,False
print("male" in info)
# False
4,删除
#del 万能删除
info={"name":"tom","age":18}
del info['age']
print(info)
# {'name': 'tom'}
# pop 删除(有返回值,返回value值)
info={"name":"tom","age":18}
res=info.pop("name")
print(res)
#tom
# popitem 随机删
info={"name":"tom","age":18}
res=info.popitem()
print(res)
# ('age', 18)
5,键keys(),值values(),键值对items()
# dic.keys()
# dic.values()
# dic.items()
info={"name":"tom","age":18,"gender":"female"}
# 只取出key值
print(info.keys())
# dict_keys(['name', 'age', 'gender'])
# 只取出value值
print(info.values())
# dict_values(['tom', 18, 'female'])
print(info.items())
#dict_items([('name', 'tom'), ('age', 18), ('gender', 'female')])
6,循环
info={"name":"tom","age":18,"gender":"female"}
# 取出key值
for k in info.keys():
print(k)
# name
# age
# gender
# 取出value值
for v in info.values():
print(v)
# tom
# 18
# female
for i in info.items():
print(i)
# ('name', 'tom')
# ('age', 18)
# ('gender', 'female')
7,update / copy
info={"name":"tom","age":18,"gender":"female"}
# 把字典的name和age更新对应的值,注意语法格式update({ })有中括号
info.update({"name":"muzhi","age":99})
print(info)
# {'name': 'muzhi', 'age': 99, 'gender': 'female'}
res=info.copy()
print(res)
# {'name': 'muzhi', 'age': 99, 'gender': 'female'}
8,fromkeys
#初始化返回一个新字典,通过append赋值value
info={}.fromkeys({"id","name"},[])
info["name"].append('mmm')
print(info)
# {'name': ['mmm'], 'id': ['mmm']}
# 以上指定的是[ ] 字典,如果像赋值字符串,不可以使用append
abc={}.fromkeys({"name","age"},"")
print(abc)
abc["name"]='xxxxxx'
print(abc)
# {'age': '', 'name': 'xxxxxx'}
9,setdefault
# key不存在则新增键值对,并将新增的value返回
dic = {'name': 'egon', 'age': 18, 'gender': 'male', "level": 19}
res=dic.setdefault("hobby","sing")
print(res)
# sing
print(dic)
# {'name': 'egon', 'age': 18, 'gender': 'male', 'level': 19, 'hobby': 'sing'}
# key存在则返回对应key的value值
dic = {'name': 'egon', 'age': 18, 'gender': 'male', "level": 19}
res=dic.setdefault("name","muzhi")
print(res)
# egon
PS:
注意setdefault后面括号跟的是逗号,不是冒号
======================== 等同于 ========================
dic = {'name': 'egon', 'age': 18, 'gender': 'male'}
if 'level' in dic:
pass
else:
dic['level']=19
print(dic)
# {'name': 'egon', 'age': 18, 'gender': 'male', 'level': 19}```
六,集合
1,作用
集合、list、tuple、dict一样都可以存放多个值,但是集合主要用于:去重、关系运算
2,定义
定义:在{}内用逗号分隔开多个元素,集合具备以下三个特点:
1:每个元素必须是不可变类型
2:集合内没有重复的元素
3:集合内元素无序
info={1,3,5,2} # 等同于 info=set({1,3,5,2})
print(info)
# {1, 2, 3, 5}
# 注意1:
列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值;
而集合类型既没有索引也没有key与值对应,所以无法取得单个的值;
对于集合来说,主要用于去重与关系元素,根本没有取出单个指定值这种需求。
# 注意2:
{}既可以用于定义dict,也可以用于定义集合
但是字典内的元素必须是key:value的格式
d = {} # 默认是空字典
s = set() # 这才是定义空集合
3,使用
1,关系运算
- 例:for去重
例:取出以下的都有的名字
# 方式一
fridens1={"lily","tom","pepe","mmmzhi","egggg"}
friends2={"huahua","dogdog","mimi","tom","lily"}
for name in fridens1:
if name in friends2:
print(name)
# tom
# lily
# 方式二
fridens1={"lily","tom","pepe","mmmzhi","egggg"}
friends2={"huahua","dogdog","mimi","tom","lily"}
l=[]
for name in fridens1:
if name in friends2:
l.append(name)
print(l)
# ['lily', 'tom']
- 符号运算
fridens1={"lily","tom","pepe","mmmzhi","egggg"}
friends2={"huahua","dogdog","mimi","tom","lily"}
# 1,合集 / 并集 ( | )
print(fridens1 | friends2)
# {'mmmzhi', 'huahua', 'lily', 'pepe', 'tom', 'egggg', 'dogdog', 'mimi'}
# 2,交集( & )
# 用户一独有的好友
print(fridens1 & friends2)
# {'tom', 'lily'}
# 用户2独有的好友
print(friends2 - fridens1)
# {'mimi', 'dogdog', 'huahua'}
# 3,差集 ( - )
print(fridens1 - friends2)
# {'egggg', 'pepe', 'mmmzhi'}
# 4,对称差集 ( ^ )
# 两个用户独有的好友,即去掉共同的好友,结果是无序的!!
print(fridens1 ^ friends2)
# {'mmmzhi', 'dogdog', 'huahua', 'pepe', 'mimi', 'egggg'}
# 5,值是否相等 ( == )
print(fridens1 == friends2)
# False
# 6,父集:一个集合是否包含另一个集合
##1) 包含则返回True
res={1,3,5} > {1,3}
print(res)
# True
res1={1,3,5} >= {1,3}
print(res1)
# True
##2) 不包含则返回False
info={1,2} > {1,2,22}
print(info)
# False
# 7,子集
res={1,2} <= {1,12,3,2}
print(res)
# True
2,类型转换 / 去重(只针对不可变类型)
1)无序去重
# 1. 只能针对不可变类型
# 2. 集合本身是无序的,去重之后无法保留原来的顺序
例:
# 列表类型转集合
l=[1,2,2,"a","c","a"]
print(type(l))
# <class 'list'>
# 转为集合
new_l=set(l)
print(new_l)
# {1, 2, 'c', 'a'}
# 再转回列表,去除了重复,但是打乱了顺序
s=list(new_l)
print(s)
# ['a', 1, 2, 'c']
2)for 循环去重(有序)
针对不可变类型,并且保证顺序则需要我们自己写代码实现
# 列表转集合(去重,无序)
相比下面的例子,同样是列表,但是列表的元素不同,这个例子中的元素是不可变类型
info=["abc","bbb","cbb","abc","bbb"]
# 转集合
new_info=set(info)
print(new_info)
# {'bbb', 'abc', 'cbb'}
info=[
{"namw":"tom","age":77,"gender":"female","level":10},
{"namw":"egon","age":7,"gender":"female","level":19},
{"namw":"muzhi","age":97,"gender":"male","level":1},
{"namw":"egon","age":7,"gender":"female","level":19},
]
# 如下列表会报错,只适用于不可变类型
new_info=set(info)
print(info)
# TypeError: unhashable type: 'dict'
new_info=[]
for name in info:
if name not in new_info:
new_info.append(name)
print(new_info)
# 结果:既去除了重复,又保证了顺序,而且是针对不可变类型的去重
# [{'namw': 'tom', 'age': 77, 'gender': 'female', 'level': 10}, {'namw': 'egon', 'age': 7, 'gender': 'female', 'level': 19}, {'namw': 'muzhi', 'age': 97, 'gender': 'male', 'level': 1}]
3,其他操作
#1,长度
l={1,3,6,"a"}
print(len(l))
# 4
#2,成员运算
l={1,3,6,"a"}
print("s" in l)
# False
#3, 循环
l={1,3,6,"a"}
for i in l:
print(i)
# 1
# 3
# 6
# a
补充:可变类型/不可变类型
1)数字类型 (不可变)
x=10
print(id(x))
# 4380713520
x=3
print(id(x))
# 4380713296
# 内存地址改变了,说明整型是不可变数据类型,浮点型也一样
2)字符串 (不可变)
y='tt'
print(id(y))
# 4300352880
y='uu'
print(id(y))
# 4299950064
# 内存地址改变了,说明字符串是不可变数据类型
3)列表(可变)
list1=[11,22,"tom"]
print(id(list1))
# 4314417280
list1[2]="egon"
print(id(list1))
# 4314417280
list1.append('xxx')
print(id(list1))
# 4314417280
# 对列表的值进行操作时,值改变但内存地址不变,所以列表是可变数据类型
3) 元祖(不可变)
如果元组中存在可变类型,是可以修改,但是修改后的内存地址不变
t1=(33,'yy',['aa','bb'])
print(id(t1))
#t1[0]=66 # 会报错
#t1.append('p') # 会报错
print(id(t1[0]),id(t1[1]),id(t1[2]))
# 4337640720 4338970096 4338681984
t1[2][1]='pp'
print(id(t1[0]),id(t1[1]),id(t1[2]))
# 4337640720 4338970096 4338681984
# 如果元组中存在可变类型,是可以修改,但是修改后的内存地址不变
4)字典(可变)
dic={"name":"xxx","age":99,"gender":9}
print(id(dic))
# 4332807808
dic['age']=100
print(id(dic))
# 4332807808
# 对字典进行操作时,值改变的情况下,字典的id也是不变,即字典也是可变数据类型