Python变量和数据类型:int、str、bool,一篇文章把数据类型讲透

上一篇文章我们写了一个猜数字游戏,用到了 input()if 判断。这篇文章专门讲 Python 的数据类型——你知道为什么 1 + "2" 会报错,而 1 + int("2") 就正常吗?看完这篇你就明白了。


一句话概括

这篇文章解决一个问题:搞清楚 Python 有哪些数据类型,以及它们之间怎么转换。


为什么需要数据类型?

计算机里的数据有很多种——数字、文字、真假判断。它们处理方式不同,存储占用的空间也不同。

Python 是动态类型语言,这意味着:

  • 你不需要提前声明变量的类型
  • Python 会根据你赋的值自动判断类型
  • 同一个变量可以赋不同类型的值(但不建议这么做)
x = 10       # int
x = "hello"  # 现在是 str

Python 内置的数据类型

Python 有很多内置数据类型,但最常用的就这几种:

类型 说明 示例
int 整数 10, -3, 0
float 小数 3.14, -0.5, 2.0
str 字符串 "hello", 'python'
bool 布尔值 True, False
list 列表 [1, 2, 3]
dict 字典 {"name": "小明"}

int:整数

整数就是没有小数点的数字。

a = 10       # 十进制
b = 0b1010   # 二进制,等于10
c = 0o12     # 八进制,等于10
d = 0xA      # 十六进制,等于10

平时写代码直接用十进制就行,上面这些了解即可。

整数的大小: Python 3 的 int 是** arbitrary-precision** 的,意思是没有大小限制。不管多大的数,Python 都能存——只要你的内存够用。

big_number = 10 ** 100  # 10的100次方
print(big_number)  # 可以正常打印

float:小数

小数在 Python 里叫 float(浮点数)。

pi = 3.14159
price = 19.9
negative = -0.5

注意事项:浮点数精度问题

a = 0.1 + 0.2
print(a)  # 输出 0.30000000000000004,不是 0.3!

这是因为浮点数在计算机里是用二进制存储的,有些十进制小数无法精确表示。

解决方案:如果需要精确计算,用 decimal 模块:

from decimal import Decimal

a = Decimal('0.1') + Decimal('0.2')
print(a)  # 输出 0.3

注意:字符串参数要加引号,不要写 Decimal(0.1),那样还是会引入浮点误差。


str:字符串

字符串就是用引号包起来的文本。

s1 = "Hello"
s2 = 'Python'
s3 = """这是
一个多行
字符串"""

字符串的基本操作

拼接:

first = "Hello"
second = "World"
print(first + " " + second)  # Hello World

重复:

print("-" * 20)  # --------------------

长度:

s = "Python"
print(len(s))  # 6

索引和切片:

s = "Python"
print(s[0])     # P(第一个字符)
print(s[-1])    # n(最后一个字符)
print(s[0:3])   # Pyt(从0到2,包括0不包括3)
print(s[::2])   # Pto(每隔一个取一个)
print(s[::-1])  # nohtyP(反转字符串)

注意:索引从 0 开始,不是从 1 开始。这是编程语言的惯例。

字符串常用方法

s = "  Hello, Python!  "

s.strip()       # "Hello, Python!"(去首尾空格)
s.lower()       # "  hello, python!  "(转小写)
s.upper()       # "  HELLO, PYTHON!  "(转大写)
s.replace("Python", "World")  # "  Hello, World!  "
s.split(",")    # ["  Hello", " Python!  "]
s.count("o")    # 2(统计某个字符出现次数)
s.find("Python") # 7(找位置,没找到返回-1)

判断类方法

s = "hello123"

s.isdigit()     # False(是否全是数字)
s.isalpha()     # False(是否全是字母)
s.isalnum()     # True(是否全是字母或数字)
s.startswith("hello")  # True(是否以某字符串开头)
s.endswith("3")        # True(是否以某字符串结尾)

bool:布尔值

布尔值只有两个:True(真)和 False(假)。

布尔值的来源:

布尔值通常来自比较运算:

print(10 > 3)    # True
print(10 == 3)   # False(注意是两个等号)
print(10 != 3)   # True(不等于)
print(3 <= 3)    # True(小于等于)

布尔值参与运算:

print(True + True)   # 2(True=1, False=0)
print(True + False)  # 1

类型转换

这是最重要的部分。

为什么要类型转换?

因为不同类型之间不能直接运算:

print(1 + "2")      # 报错!TypeError
print(str(1) + "2") # "12"(转成字符串再拼接)
print(1 + int("2")) # 3(转成整数再相加)

常用的类型转换

转整数 int()

int(3.14)      # 3(直接截断小数部分,不是四舍五入)
int("123")     # 123
int(True)      # 1
int("hello")   # 报错!ValueError

转小数 float()

float(3)       # 3.0
float("3.14")  # 3.14
float("123")   # 123.0
float(True)    # 1.0

转字符串 str()

str(123)       # "123"
str(3.14)      # "3.14"
str(True)      # "True"

转布尔值 bool()

这个比较特殊,以下情况转成 False

bool(0)        # False
bool(0.0)      # False
bool("")       # False(空字符串)
bool([])       # False(空列表)
bool(None)     # False
bool(False)    # False

除此之外都是 True:

bool(1)        # True
bool("hello")  # True
bool([1, 2])   # True

实战:类型转换计算器

写一个综合性的计算器,展示类型转换的用法:

print("=" * 30)
print("简易计算器")
print("=" * 30)

# 获取用户输入
num1 = input("请输入第一个数字:")
num2 = input("请输入第二个数字:")
operator = input("请输入运算符(+、-、*、/):")

# 转换类型
num1 = float(num1)  # 先转成小数,兼容整数和小数
num2 = float(num2)

# 根据运算符计算
if operator == "+":
    result = num1 + num2
elif operator == "-":
    result = num1 - num2
elif operator == "*":
    result = num1 * num2
elif operator == "/":
    if num2 == 0:
        print("错误:除数不能为0!")
        exit()
    result = num1 / num2
else:
    print("错误:不支持的运算符!")
    exit()

# 输出结果,如果是整数就转成int显示
if result == int(result):
    print(f"结果:{int(result)}")
else:
    print(f"结果:{result}")

运行示例:

==============================
简易计算器
==============================
请输入第一个数字:10
请输入第二个数字:3
请输入运算符(+、-、*、/):/
结果:3.3333333333333335

类型查询

有时候需要检查一个变量的类型,用 type() 函数:

x = 10
y = 3.14
z = "hello"
b = True

print(type(x))  # <class 'int'>
print(type(y))  # <class 'float'>
print(type(z))  # <class 'str'>
print(type(b))  # <class 'bool'>

isinstance() 判断是否是某种类型:

x = 10
print(isinstance(x, int))       # True
print(isinstance(x, (int, float)))  # True(int或float都行)

常见问题FAQ

Q1:"1 + 2"1 + 2 有什么区别?

print("1 + 2")      # 打印字符串 "1 + 2",原样输出
print(1 + 2)        # 打印数字 3

前者是字符串,后者是数学运算。


Q2:为什么 10 / 3 结果是小数?

Python 3 里,/ 总是返回浮点数:

print(10 / 3)    # 3.3333333333333335
print(10 // 3)   # 3(整除,向下取整)
print(10 % 3)    # 1(取余)

Q3:"hello"[10] 会报错吗?

会。索引超出范围会报 IndexError

s = "hello"
print(s[10])  # IndexError: string index out of range

Q4:字符串和数字比较会怎样?

print("10" > "9")  # False!字符串比较是按ASCII码比较的,"1"<"9"
print(10 > 9)      # True!数字比较就是数值比较

教训:字符串和数字比较没有意义,要比较就先转类型。


写在最后

数据类型是编程的基础中的基础。这篇文章讲了:

  • int / float:数字
  • str:字符串及其操作
  • bool:真假判断
  • 类型转换:int() / float() / str() / bool()

下一篇文章讲运算符——算术运算、比较运算、逻辑运算,一个计算器全搞定。


参考资料

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐