数据类型:了解数据类型及其区别
“Python 的数据类型就像工具箱里的不同工具,各有各的用法~ 先问问大家:你平时写代码时
最常用哪种数据类型?遇到过‘明明看着没错,却报类型错误’的情况吗?跟着文章往下看,或许
能找到答案!”
@[toc]
数字类型(Number)
a=1 #整数类型
b=1.2 #浮点数类型
c=True #布尔类型
d=2+1j #复数类型
print(type(a), type(b), type(c), type(d))
print(isinstance(a, int), isinstance(b, float), isinstance(c, bool), isinstance(c, int),isinstance(d, complex))
#用type()和isinstance()判断数据类型
#输出:<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
#输出:True True True True True
注意:
- 复数类型书写规范:基本格式为 实部 + 虚部j,但当虚部为1或-1时,不能省略1和-1
- isinstance 和 type 区别: type() 只认 "具体类型",不考虑继承; isinstance() 会认 "家族关系",子类算父类的一种。 例:苹果(子类)用 type() 看只是苹果,用 isinstance() 看既是是苹果也是水果(父类)。
- Python中的常见继承关系:Python3 中,bool 是 int 的子类,True 和 False 可以和数字相加, True== 1、False== 0 会返回 True,但可以通过 is 来判断类型。
- 用
is
比较整数和True会触发SyntaxWarning,因应比较值而非身份,且源于Python 2用0/1表布尔值的历史,推荐使用"=="
- 用
字符串类型(Str)
hello = "Hello,World!"
print(hello + hello) # 拼接 输出:Hello,World!Hello,World!
print(hello * 2) # 重复 输出:Hello,World!Hello,World!
print(hello[1:-1:2]) # 切片 输出:el,ol
print("This ""is ""Python!") # 自动拼接 输出:This is Python!
print("hello,\nworld!") # 转义生效 输出:hello,
#world!
print(r"hello,\nworld!") # 原始字符串(转义无效) 输出:hello,\nworld!
print ("已更新字符串 : ", hello[:6] + 'Runoob!') #更新字符串 输出:已更新字符串 : Hello,Runoob!
print ("我叫 %s 今年 %d 岁!" % ('小明', 10)) #字符串格式化 输出:我叫 小明 今年 10 岁!
注意:
- 对字符串的切片规则:字符串切片用
[start:end:step]
,遵循左闭右开(含start,不含end);索引从左0开始、从右-1开始;步长正负定方向,缺省为1。 - 字符串的格式化:同C语言的规则,字符串用“%s”,整数用“%d”,浮点数用“%f”
元组(Tuple)
num1 = (1, 2, 3, 4, 5)
num2 = (6, 7, 8, 9, 0)
num3 = (1,) # 单元素元组(必须加逗号)
num4 = (1)
num5 = () # 空元组
print(num1) # 输出完整元组 输出:(1, 2, 3, 4, 5)
print(type(num3)) # 查看类型 输出:<class 'tuple'>
print(type(num4)) # 查看类型 输出:<class 'int'>
print(num1[0:3]) # 切片访问 输出:(1, 2, 3)
del num1 # 删除元组(不能删除元素)
num2[1]="g" # 不支持更改元素,因为元组是不可变数据类型
#元组推导式
#(表达式 for 元素 in 可迭代对象 if 条件)
a = (x for x in range(1,10))
注意:
- 元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用
列表(List)
color = ["red", "blue", "black", "green", "yellow", "white"] print(color[0]) # 访问第一个元素 输出:red print(color[-1]) # 访问最后一个元素 输出:white print(color[0:4]) # 切片访问 输出:['red', 'blue', 'black', 'green'] color[2] = "pink" # 更新元素,因为列表为可变数据变量 color.append("brown") # 添加元素 del color[2] # 删除元素 print(color) # 更新后的列表 输出:['red', 'blue', 'green', 'yellow', 'white', 'brown']
列表操作符
num1 = [1, 2, 3, 4, 5] num2 = [6, 7, 8, 9, 0] hi = ["hi"] print(len(num1)) # 长度 输出:5 print(num1 + num2) # 拼接 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 0] print(hi * 3) # 重复 输出:['hi', 'hi', 'hi'] print(3 in num1) # 成员判断 输出:True for x in num1: print(x, end=" ") # 遍历 输出:1 2 3 4 5 print()
嵌套列表
a = [1, 2, 3] b = [4, 5, 6] n = [a, b] print(n) # 输出完整嵌套列表 输出:[[1, 2, 3], [4, 5, 6]] print(n[0][1]) # 访问嵌套元素 输出:2
列表比较
import operator print(operator.eq(a, b)) # 等于 输出:False print(operator.lt(a, b)) # 小于 输出:True print(operator.le(a, b)) # 小于等于 输出:True print(operator.gt(a, b)) # 大于 输出:False print(operator.ge(a, b)) # 大于等于 输出:False print(operator.ne(a, b)) # 不等于 输出:True
### 字典(Dictionary)
```python
letter = {1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
print(letter) # 输出完整字典 输出:{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}
print("len: ", len(letter)) # 字典长度 输出:len: 5
print(letter[1]) # 访问键对应的值 输出:a
letter[2] = "f" # 修改值
letter[6] = "g" # 添加新键值对
print(letter) # 输出更新后的字典 输出:{1: 'a', 2: 'f', 3: 'c', 4: 'd', 5: 'e', 6: 'g'}
for key in letter:
print(key,end=" ") # 遍历字典的键
for value in letter.values():
print(value,end=" ") # 遍历字典的值
for key, value in letter.items():
print(f"{key}: {value}",end="")# 遍历字典的键值对
square_dict = {num: num * num for num in range(1, 6)}
print(square_dict) # 用字典推导式生成一个数字到其平方的字典
del letter[1] # 删除键值对
letter.clear() # 清空字典
注意:
- 字典的键具有两个特性:
- 一是不允许同一个键重复出现,若重复赋值,后一个值会覆盖前一个;
- 二是键必须为不可变类型(如数字、字符串、元组),不能是列表等可变类型。
集合(Set)
num1 = {1, 2, 3, 4, 5, 6} num2 = {7, 8, 9, 0, 1, 2}
集合运算
print(num1 | num2) # 并集 输出:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} print(num1 & num2) # 交集 输出:{1, 2} print(num1 - num2) # 差集 输出:{3, 4, 5, 6} print(num1 ^ num2) # 对称差集 输出:{0, 3, 4, 5, 6, 7, 8, 9}
元素操作
num1.add(45) # 添加元素 num1.update({4, 5, 6})# 批量添加元素 num1.remove(4) # 删除元素 num1.discard(3) num1.discard(6) print(num1) # 批量移除元素(不存在的元素不报错) frozen_num = frozenset({1, 2, 3}) print(frozen_num) # 冻结集合,可作为字典的键等场景使用 print(len(num1)) # 集合大小 输出:6 num1.clear() # 清空集合 print(1 in num2) # 存在判断 输出:True
### 布尔类型(Bool)
```python
# 布尔值和类型
a = True
b = False
print(type(a)) # <class 'bool'>
print(type(b)) # <class 'bool'>
# 布尔类型的整数表现
print(int(True)) # 1
print(int(False)) # 0
# 使用 bool() 函数进行转换
print(bool(0)) # False
print(bool(42)) # True
print(bool('')) # False
print(bool('Python')) # True
print(bool([])) # False
print(bool([1, 2, 3])) # True
# 布尔逻辑运算
print(True and False) # False
print(True or False) # True
print(not True) # False
# 布尔比较运算
print(5 > 3) # True
print(2 == 2) # True
print(7 < 4) # False
# 布尔值在控制流中的应用
if True:
print("This will always print")
if not False:
print("This will also always print")
x = 10
if x:
print("x is non-zero and thus True in a boolean context")
注意:
- 视为
True
:非零数字、非空字符串/列表/元组等 - 视为
False
:0、空字符串、空列表、空元组等
最后的话
看完所有数据类型的用法,是不是发现‘可变 / 不可变’‘继承关系’这些细节特别重要?来分享
一下你的收获吧 —— 比如你最容易混淆的两种数据类型是什么?或者你有哪些自己总结的
‘避坑小技巧’?评论区交流起来,一起把 Python 基础打扎实!”