第二章 标准数据类型

柠檬の夏天 / 2024-04-29 / 原文

1. 六大标准数据类型

1.1 Number数字类型

#(1) int整型(正整型,0,负整形)
#二进制整型
intvar = 0b110

#八进制整型
intvar = 0o127

#十进制整型
intvar1 = 100
intvar2 = 0
intvar3 = -10

#十六进制整型
intvar = 0xff


#(2) float 浮点型(小数)
# 表达式1
floatvar = 3.6

# 表达式2 科学计数法
floatvar = 5.7e5   #小数点右移5位
floatvar = 5.7e-5  #小数点左移5位


#(3) bool 布尔型 (True真的、False假的)
boolvar = True  
boolvar = False 


#(4) complex 复数类型
"""
3 + 4j
实数+虚数
实数:3
虚数:4j
j:如果有一个数他的平方等于-1,那么这个数就是j,科学家认为,表达一个高精度的类型
"""
# 表达式1
complexvar = 3 + 4j
complexvar = -3j

# 表达式2
# complex(实数、虚数) => 复数
res = complex(3,4)

1.2 str字符串类型

特征:可获取、不可修改 、有序

#有引号的就是字符串,单引号,双引号,三引号
#(1)单引号的字符串
strvar = '美丽'


#(2)双引号的字符串
strvar = "美丽"


#(3)三引号的字符串(可以支持跨行效果)
strvar = """
英国
法国
美国
"""


#(4)获取字符串中的元素
strvar = "小明,吃饭"
print(strvar[1])


#(5)不能修改字符串中的元素
strvar[1] = 10 #error报错

1.3 list列表类型

特征:可获取、可修改、有序

#(1)定义一个空列表
listvar = []

#(2)定义普通列表
listvar = [98,5.6"大小",True,"12-90j"]

#(3) 获取列表中的元素
#正向索引    0  1   2     3       4
listvar = [98,5.6"大小",True,"12-90j"]
#逆向索引   -5  -4  -3    -2      -1

res = listvar[2]
res = listvar[-2]

#(4)修改列表中的元素
listvar = [98,5.6"大小",True,"12-90j"]
listvar[3] = "大象"

# (5)len 获取容器类型数据中元素的个数
length = len(listvar)
res = listvar[length-1]

# 简写
res = listvar[len(listvar)-1]

1.4 tuple元组类型

特征:可获取、不可修改、有序

#(1)定义一个元组
tuplevar = (1,2,3,4,"美国")

#(2)获取元组中的元素
# 正向索引   0  1 2 3  4
tuplevar = (12,23,36,49,"美国")
# 逆向索引   -5 -4  -3 -2  -1
print(tuplevar[2])

#(3)修改元组中的元素:元组中的元素不可以修改
tuplevar[0] = 100  # error报错

#(4)注意:逗号才是区分是否是元组的标识符
tuplevar =(1)      #int整型
tuplevar = 1,       #tuple元组
tuplevar = (1.5,)   #tuple元组
tuplevar = ("中国",) #tuple元组

#(5)定义空元组
tuplevar = ()

1.5 dict字典类型

"""
键值对存储的数据:
dictvar = {键1:值1,键2:值2,...}
"""

#(1)定义一个字典
dictvar = {"top":"the shy","middle":"肉鸡","boottom":"jacklove"}

#(2)定义一个空字典
dictvar = {}

#(3)获取字典中的值
res = dictvar["top"]

#(4)修改字典中的值
dictvar["middle"] = "facker"

#(5)注意:
"""
字典的键有数据类型上的要求
(允许的类型范围)不可变的数据类型:number(int float complex bool) str tuple
(不允许的类型)可变的类型:list set dict
表面上有序,本质上无序
字典的键有要求,值无要求
字典的值可以任意换掉,但是键不可以
python3.6版本之前,完全无序
python3.6版本之后,存储的时候,保留了字典定义的字面顺序,在获取内存中数据时
重新按照字面顺序做了排序,所以看起来有序,实际上存储时还是无序
"""

1.6 set集合类型

特征:无序、自动去重

# 交差并补
# 特征:无序、自动去重 
#(1)定义一个集合
setvar={"小明","小红","小兰"}

#(2)集合自动去重
setvar = {"英国","法国","美国","韩国","韩国"}

#(3)定义一个空集合
setvar = set()

#(4)获取集合中的元素:不可以获取
set[0] #error报错

#(5)修改集合中的元素:不可以修改
set[0] = 100 #error报错

#(6)注意:
"""
集合的元素有数据类型上的要求
(允许的类型范围)不可变的数据类型:number(int float complex bool) str tuple
(不允许的类型)可变的类型:list set dict

哈希算法的提出目的是让数据尽量均匀在内存当中分配,以减少哈希碰撞,提升存储分配的效率
哈希算法一定是无序的散列,所以集合和字典是无序的
"""

2. 数据类型的转换

2.1 number的强制转换

# 1.number的强制转换(int float complex bool)

#(1)int强制把数据变成整型
"""
如果是list,dict,set不可以被int强制转换,只能转换float ,bool, 纯数字字符串 
"""
var1 = 13
var2 = 5.67
var3 = True
var4 = "123456" 
var5 = "123abc" 
var6 = 3+5j

res = int(var2)  #5
res = int(var3)  #True --> 1
res = int(False) #False --> 0
res = int(var4)  #123456
res = int(var5)  #error报错
res = int(var6)  #error报错


#(2)folat 强制把数据变成小数
"""int,float, bool ,纯数字字符串"""
res = float(var1)  #13.0
res = float(var3)  #True -->1.0
res = float(False) #False -->0.0
res = float(var4)  #123456.0


#(3)complex 强制把数据变成复数
res = complex(var1)  #添加0j 表达复数
res = complex(var2)
res = complex(var3)  #True --> 1+0j
res = complex(False) #False --> 0j
res = complex(var4)  #123456+0j


#(4)bool强制把数据变成布尔型(布尔为假的十种情况)
"""
布尔值可以强转一切数据类型
0,0.0 False,0j, "",[] ,(), set(), {},None
res = bool("") //False
"""


#(5)初始化变量时,不清楚用什么值,无脑写上None,
# None 代表空的,代表什么也没有,一般用于初始化
a = None
b = None


#(6)默认转转换成当前数据类型的一个值
"""int() float() complex() bool()"""
res = bool()    #False
res = int()     #0
res = folat()   #0.0
res = complex() #0j


# 2.number 自动类型转换(int float complex bool)
"""
低精度默认向高精度进行转换
bool -> int -> float -> complex
"""
# bool + int
res = True + 100  # 1 + 100 --》101

# bool + float
res = True + 344.565  #1.0 + 344.565 --》345.565

# bool + complex
res = True + 7 -90j  #1 + 0j +7 -90j --》8 -90j

# int + float
res = 5 + 7.88  # 5.0 + 7.88--》12.88

# int + complex
res = 5 + 6 +8j # 5 + 0j  6+8j=>11+8j

# float + complex
res = 5.66 + 9.1 - 90j #5.66 + 0j +9.1 => 14.76 - 90j

# 小数的精度损耗
# 不要用小数作比较,小数后面一般有时截取15~18位,但是不完全,存在精度损耗
print(0.1 + 0.2 == 0.3)
print(5.1 + 5.9 == 11.0)

2.2 str字符串的强制转换

# 所有的数据类型都可以转换,在当前的数据类型两边套上引号
var1 = 90
var2 = 16.5
var3 = [1,2,3]
var4 = (4,5,6)
var5 ={"陈路","范冰冰","刘诗诗"}
var6 = {"a":"10","b":"20"}
var7 = True

res1 = str(var1)
res2= str(var2)
res3 = str(var3)
res4 = str(var4)
res5 = str(var5)
res6 = str(var6)
res7 = str(var7)

print(repr(res1))   #'90'
print(repr(res2))   #'16.5'
print(repr(res3))   #'[1, 2, 3]'
print(repr(res4))   #'(4, 5, 6)'
print(repr(res5))   #"{'范冰冰', '刘诗诗', '陈路'}"
print(repr(res6))   #"{'a': '10', 'b': '20'}"
print(repr(res7))   #'True'

# repr 不转义字符原型化输出字符串,在当前的数据类型两边套上引号

2.3 list列表的强制转换

"""
(1)如果是number数字类型(int,float,bool)将其转换为列表会报错,只能是容器数据类型的互转
(2)如果是字符串:把字符串中的每个元素单独拿出来,作为列表中的新元素
(3)如果是字典:只保留字典中的键
(4)如果是集合:就是单纯的在原数据类型的两边换上[]括号
(5)如果是元组:就是单纯的在原数据类型的两边换上[]括号
"""
var1 = "我爱祖国"
var2 = (4,5,6)
var3 ={"陈路","范冰冰","刘诗诗"}
var4 = {"a":"10","b":"20"}

res1 = list(var1)
res2 = list(var2)
res3 = list(var3)
res4 = list(var4)

print(res1)     #['我', '爱', '祖', '国']
print(res2)     #[4, 5, 6]
print(res3)     #['陈路', '范冰冰', '刘诗诗']
print(res4)     #['a', 'b']

2.4 tuple元组的强制转换

"""
(1)如果是number数字类型(int,float,bool)将其转换为列表会报错,只能是容器数据类型的互转
(2)如果是字符串:把字符串中的每个元素单独拿出来,作为列表中的新元素
(3)如果是字典:只保留字典中的键
(4)如果是集合:就是单纯的在原数据类型的两边换上()括号
(5)如果是列表:就是单纯的在原数据类型的两边换上()括号
"""
var1 = "我爱祖国"
var2 = [4,5,6]
var3 ={"陈路","范冰冰","刘诗诗"}
var4 = {"a":"10","b":"20"}

res1 = tuple(var1)
res2 = tuple(var2)
res3 = tuple(var3)
res4 = tuple(var4)

print(res1)     #('我', '爱', '祖', '国')
print(res2)     #(4, 5, 6)
print(res3)     #('刘诗诗', '陈路', '范冰冰')
print(res4)     #('a', 'b')

2.5 dict字典的强制转换

"""
要求:必须是等长的二级容器。并且里面的元素个数是2个
外层是列表,元组,集合,里层是列表或者元组的等长二级容器-->字典;
"""
#(1)外层是列表,里层是列表或者元组
lst = [["a",1],("b",2)]
dic = dict(lst)
print(dic,type(dic)) # {'a': 1, 'b': 2} 

#(2)外层是元组,里层是列表或者元组
tup =(["a",1],("b",2))
dic = dict(lst)
print(dic ,type(dic))

#(3)外层是集合,里层是元组
setvar = {("a",1),("b",2)}
dic = dict(setvar)
print(dic ,type(dic))

#(4)例外1:外层是列表,里层放集合
"""可以实现,不推荐使用 ,因为达不到想要的目的,集合无序,不推荐使用"""
lst = [["a",1],{"b",250}]
dic = dict(lst)
print(dic)

#(5)例外2:外层是列表/元组,里层放字符串
"""字符串长度只能是2位,有极大的局限性,不推荐使用"""
lst = ["a11","b22"]
dic = dict(lst)
print(dic)


#(6)判断类型 isinstance
"""
# 使用方法一
isinstance(数据,类型)
如果该数据是这个类型,返回True 反之 ,返回False
类型:int float complex bool str list tuple  set dict

# 使用方法二
isinstance(数据,(类型1,类型2,类型3...))
如果该数据在所对应的类型元组当中,返回True,反之,返回False
"""

# 使用方法一
n = 123
res = isinstance(n, int)
print(res)

n = [1, 2, 3]
res = isinstance(n, list)
res = isinstance(n, tuple)
print(res)

# 使用方法二
n = 123
res = isinstance(n, (list, str, set, tuple))
print(res)

2.6 set集合的强制转换

"""
(1)如果是number数字类型(int,float,bool)将其转换为列表会报错,只能是容器数据类型的互转
(2)如果是字符串:把字符串中的每个元素单独拿出来,作为集合中的新元素
(3)如果是字典:只保留字典中的键
(4)如果是元组:就是单纯的在原数据类型的俩边换上{}
"""

var1 = "我爱祖国"
var2 = [4,5,6]
var3 =("陈路","范冰冰","刘诗诗")
var4 = {"a":"10","b":"20"}

res1 = set(var1)
res2 = set(var2)
res3 = set(var3)
res4 = set(var4)

print(res1)     #{'祖', '我', '国', '爱'}
print(res2)     #{4, 5, 6}
print(res3)     #{'陈路', '范冰冰', '刘诗诗'}
print(res4)     #{'b', 'a'}


# 过滤掉列表中所有重复元素
list1 = [1,2,3,4,5,5,5]
res2 = set(list1)
# 再把当前的集合转换成原来的列表
res2 = list(res2)
print(res2)

"""
默认不加任何值,转换成该数据类型的空值
int() str() list() tuple() set() dict()
"""
print(int())     # 0
print(str())     # ""
print(list())    # []
print(tuple())   # ()
print(dict())    # {}
print(set())     # set()

3. 二级容器

#(1)二级列表
list = [1,2,3,[4,5,6]]

#(2)二级元组
tup =(1,2,(10,11))

#(3)二级集合
setvar = {1,2,("a","b")}

#(4)二级字典
dic = {"a":1,"b":{"c":10}}
print(dic)

#(5)四级容器
container = [1,2,3,(4,5,6),{"a":1,"b":[11,"p"]}]
res1 = container[-1]
print(res1)

#(6)等长的二级容器
"""外面是容器,里面的元素也是容器,且元素个数相同"""
list = [(1,2,3),[4,5,6],{7,8,9}]