一、什么是类型转换?
类型转换就是把数据从一种类型变成另一种类型。比如把字符串"123"变成整数123,或者把整数10变成浮点数10.0。
# 类型转换的例子num_str = "123"num_int = int(num_str) # 字符串 → 整数num_float = float(num_str) # 字符串 → 浮点数num_str2 = str(123) # 整数 → 字符串
二、为什么要类型转换?
场景1:用户输入都是字符串
# input()返回的一定是字符串age = input("请输入你的年龄:") # 输入18print(age + 1) # ❌ 报错!字符串不能和数字相加# 需要转换age = int(input("请输入你的年龄:"))print(f"明年你{age + 1}岁") # ✅ 正确
场景2:不同类型不能直接运算
price = "19.99"quantity = 3# total = price * quantity # ❌ 字符串不能和整数相乘# 转换后运算total = float(price) * quantityprint(f"总价:{total}") # 59.97
场景3:拼接字符串和数字
name = "小明"age = 18# print(name + "今年" + age + "岁") # ❌ 报错# 需要把age转成字符串print(name + "今年" + str(age) + "岁") # 小明今年18岁# 用f-string更方便print(f"{name}今年{age}岁")
三、常用类型转换函数
3.1 int() —— 转整数
# 字符串转整数print(int("123")) # 123print(int("-456")) # -456# print(int("3.14")) # ❌ 报错,不能直接转带小数点的字符串# 浮点数转整数(直接截断,不四舍五入)print(int(3.14)) # 3print(int(5.99)) # 5print(int(-2.7)) # -2# 布尔值转整数print(int(True)) # 1print(int(False)) # 0# 其他进制转十进制print(int("1010", 2)) # 10(二进制转十进制)print(int("FF", 16)) # 255(十六进制转十进制)print(int("77", 8)) # 63(八进制转十进制)
3.2 float() —— 转浮点数
# 字符串转浮点数print(float("3.14")) # 3.14print(float("123")) # 123.0print(float("-0.5")) # -0.5# print(float("abc")) # ❌ 报错,不能转非数字字符串# 整数转浮点数print(float(10)) # 10.0print(float(-3)) # -3.0# 布尔值转浮点数print(float(True)) # 1.0print(float(False)) # 0.0# 科学计数法print(float("1.23e-4")) # 0.000123
3.3 str() —— 转字符串
# 所有类型都能转字符串print(str(123)) # "123"print(str(3.14)) # "3.14"print(str(True)) # "True"print(str(False)) # "False"print(str(None)) # "None"print(str([1, 2, 3])) # "[1, 2, 3]"print(str({"a": 1})) # "{'a': 1}"# 拼接时必须转字符串age = 25message = "年龄:" + str(age) # 年龄:25print(message)
3.4 bool() —— 转布尔值
# 以下值转成Falseprint(bool(False)) # Falseprint(bool(None)) # Falseprint(bool(0)) # Falseprint(bool(0.0)) # Falseprint(bool("")) # False(空字符串)print(bool([])) # False(空列表)print(bool(())) # False(空元组)print(bool({})) # False(空字典)print(bool(set())) # False(空集合)# 其他所有值都转成Trueprint(bool(1)) # Trueprint(bool(-1)) # Trueprint(bool("abc")) # Trueprint(bool("False")) # True(非空字符串)print(bool([0])) # True(非空列表)print(bool(0.1)) # True# 实际应用:过滤空值data = ["apple", "", "banana", None, "orange", 0, False]filtered = [x for x in data ifbool(x)] # 等价于 if xprint(filtered) # ['apple', 'banana', 'orange']
3.5 list()、tuple()、set() —— 转容器
# 字符串转列表(每个字符变成元素)print(list("Hello")) # ['H', 'e', 'l', 'l', 'o']# 元组转列表print(list((1, 2, 3))) # [1, 2, 3]# 列表转元组print(tuple([1, 2, 3])) # (1, 2, 3)# 列表转集合(自动去重)print(set([1, 2, 2, 3, 3, 3])) # {1, 2, 3}# 字符串转集合print(set("hello")) # {'h', 'e', 'l', 'o'}(注意去重且无序)
四、自动类型转换
4.1 运算中的自动转换
# 整数和浮点数运算 → 自动转浮点数print(10 + 3.14) # 13.14 (float)print(5 * 2.0) # 10.0 (float)# 布尔值参与运算print(True + True) # 2(True当作1)print(True + False) # 1print(False * 10) # 0# 不同类型比较print(10 == 10.0) # True(值相等,自动比较值)print(10 == "10") # False(不同类型,不会自动转)
4.2 除法永远返回浮点数
print(10 / 2) # 5.0(即使能整除)print(9 / 3) # 3.0print(5 / 2) # 2.5
五、类型转换的常见错误
错误1:转换非数字字符串
# ❌ 错误num = int("abc") # ValueError: invalid literal for int()# ✅ 正确处理s = "abc"if s.isdigit(): num = int(s)else:print("不能转换为数字")
错误2:浮点数字符串转整数
# ❌ 错误num = int("3.14") # ValueError# ✅ 正确做法:先转float,再转intnum = int(float("3.14")) # 3
错误3:忘记转换用户输入
# ❌ 错误age = input("年龄:") # 返回字符串next_year = age + 1# 报错# ✅ 正确age = int(input("年龄:"))next_year = age + 1
错误4:None转字符串没问题,但转数字会报错
# ✅ None转字符串没问题print(str(None)) # "None"# ❌ None转数字报错print(int(None)) # TypeError
六、实战案例
案例1:简易计算器
defcalculator():"""简单的计算器"""print("=" * 30)print(" 简易计算器")print("=" * 30)# 获取用户输入(都是字符串) num1 = input("请输入第一个数字:") num2 = input("请输入第二个数字:") op = input("请输入运算符(+ - * /):")# 转换为数字try: a = float(num1) b = float(num2)except ValueError:print("❌ 输入的不是有效数字")return# 计算结果if op == "+": result = a + belif op == "-": result = a - belif op == "*": result = a * belif op == "/":if b == 0:print("❌ 除数不能为0")return result = a / belse:print("❌ 不支持的运算符")return# 输出结果(判断是否为整数,决定显示格式)if result.is_integer():print(f"{a}{op}{b} = {int(result)}")else:print(f"{a}{op}{b} = {result:.2f}")# 运行计算器# calculator()
案例2:数据类型检测器
defanalyze_value(value):"""分析数据的类型和转换可能"""print(f"\n原始值:{value}")print(f"原始类型:{type(value).__name__}")# 尝试各种转换 conversions = {}# 转字符串(总是成功) conversions["str"] = str(value)# 转整数try:ifisinstance(value, float) andnot value.is_integer(): conversions["int"] = "❌ 浮点数有小数部分"else: conversions["int"] = int(value)except (ValueError, TypeError): conversions["int"] = "❌ 不能转换"# 转浮点数try: conversions["float"] = float(value)except (ValueError, TypeError): conversions["float"] = "❌ 不能转换"# 转布尔值 conversions["bool"] = bool(value)# 输出结果print("转换结果:")for type_name, result in conversions.items():print(f" {type_name}: {result}")# 测试各种类型analyze_value(123)analyze_value(3.14)analyze_value("456")analyze_value("3.14")analyze_value("abc")analyze_value(True)analyze_value(None)analyze_value([])
案例3:学生成绩管理系统
defprocess_scores():"""处理学生成绩""" scores = []print("请输入学生成绩(输入q结束):")whileTrue: user_input = input()if user_input.lower() == 'q':break# 尝试转换输入为数字try: score = float(user_input)if0 <= score <= 100: scores.append(score)else:print("❌ 成绩应在0-100之间")except ValueError:print("❌ 请输入有效的数字")# 统计分析if scores:print("\n" + "=" * 40)print("成绩统计结果")print("=" * 40)# 基础统计 total = sum(scores) count = len(scores) average = total / count max_score = max(scores) min_score = min(scores)# 格式化输出print(f"总人数:{count}")print(f"总分:{total:.1f}")print(f"平均分:{average:.2f}")print(f"最高分:{max_score}")print(f"最低分:{min_score}")# 等级分布 levels = {'优秀(≥90)': 0,'良好(80-89)': 0,'中等(70-79)': 0,'及格(60-69)': 0,'不及格(<60)': 0 }for s in scores:if s >= 90: levels['优秀(≥90)'] += 1elif s >= 80: levels['良好(80-89)'] += 1elif s >= 70: levels['中等(70-79)'] += 1elif s >= 60: levels['及格(60-69)'] += 1else: levels['不及格(<60)'] += 1print("\n等级分布:")for level, count in levels.items():if count > 0:print(f" {level}: {count}人")else:print("没有输入任何有效成绩")# process_scores()
案例4:进制转换器
defconvert_base():"""进制转换器"""print("=" * 40)print(" 进制转换器")print("=" * 40)whileTrue:print("\n1. 其他进制转十进制")print("2. 十进制转其他进制")print("3. 退出") choice = input("请选择(1-3):")if choice == '3':print("再见!")breakif choice == '1':# 其他进制转十进制 num = input("请输入数字:") base = int(input("请输入原进制(2/8/16):"))try:if base == 2: result = int(num, 2)print(f"二进制 {num} = 十进制 {result}")elif base == 8: result = int(num, 8)print(f"八进制 {num} = 十进制 {result}")elif base == 16: result = int(num, 16)print(f"十六进制 {num} = 十进制 {result}")else:print("不支持的进制")except ValueError:print(f"❌ 不是有效的{base}进制数")elif choice == '2':# 十进制转其他进制try: num = int(input("请输入十进制数字:"))print(f"十进制 {num} = 二进制 {bin(num)[2:]}")print(f"十进制 {num} = 八进制 {oct(num)[2:]}")print(f"十进制 {num} = 十六进制 {hex(num)[2:].upper()}")except ValueError:print("❌ 请输入有效的整数")# convert_base()
案例5:数据清洗与类型转换
defclean_mixed_data(raw_data):""" 清洗混合类型数据 把字符串数字转成数字,保留其他类型 """ cleaned = []for item in raw_data:# 如果是字符串,尝试转数字ifisinstance(item, str):# 尝试转整数if item.isdigit() or (item.startswith('-') and item[1:].isdigit()): cleaned.append(int(item))# 尝试转浮点数else:try: cleaned.append(float(item))except ValueError:# 真的不是数字,保留原字符串 cleaned.append(item)# 其他类型直接保留else: cleaned.append(item)return cleaneddefanalyze_mixed_data(data):"""分析混合类型数据"""print("原始数据:", data)print("清洗后:", clean_mixed_data(data))# 统计各类型数量 types_count = {}for item in data: type_name = type(item).__name__ types_count[type_name] = types_count.get(type_name, 0) + 1print("\n类型分布:")for type_name, count in types_count.items():print(f" {type_name}: {count}个")# 测试test_data = ["123", # 字符串数字"3.14", # 字符串浮点数456, # 整数2.718, # 浮点数"-50", # 负数字符串"abc", # 纯字符串"0.5", # 小数True, # 布尔值None, # None"1e-3"# 科学计数法]analyze_mixed_data(test_data)
七、类型转换速查表
常用转换函数
| | | |
int(x) | | int(3.14) | 3 |
float(x) | | float("3.14") | 3.14 |
str(x) | | str(123) | "123" |
bool(x) | | bool("") | False |
list(x) | | list("abc") | ['a','b','c'] |
tuple(x) | | tuple([1,2]) | (1,2) |
set(x) | | set([1,1,2]) | {1,2} |
进制转换
| | | |
bin(x) | | bin(10) | '0b1010' |
oct(x) | | oct(10) | '0o12' |
hex(x) | | hex(255) | '0xff' |
int(x, base) | | int("FF", 16) | 255 |
ASCII转换
| | | |
ord(c) | | ord('A') | 65 |
chr(i) | | chr(65) | 'A' |
八、最佳实践与注意事项
1. 转换前检查
# 不好的做法num = int(input("数字:")) # 如果用户输入非数字,程序崩溃# 好的做法user_input = input("数字:")if user_input.replace('-', '', 1).replace('.', '', 1).isdigit(): num = float(user_input)else:print("请输入有效的数字")
2. 使用try-except处理异常
defsafe_convert(value, to_type):"""安全转换函数"""try:if to_type == int:returnint(value)elif to_type == float:returnfloat(value)elif to_type == str:returnstr(value)elif to_type == bool:returnbool(value)except (ValueError, TypeError):returnNone# 使用result = safe_convert("123", int)if result isnotNone:print(f"转换成功:{result}")else:print("转换失败")
3. 类型判断
# 判断类型defprocess_number(n):ifisinstance(n, int):print(f"整数:{n}")elifisinstance(n, float):print(f"浮点数:{n}")else:print("不是数字")# 判断是否可转换defcan_convert_to_int(value):try:int(value)returnTrueexcept (ValueError, TypeError):returnFalse
4. 格式化输出
# 不同格式要求price = 19.995print(f"{price:.2f}") # 19.99(保留2位小数)print(f"{price:.0f}") # 20(四舍五入取整)print(f"{int(price)}") # 19(直接截断)print(f"{round(price)}") # 20(四舍五入)
九、总结
类型转换三原则
- 1. 显式优于隐式:不要依赖自动转换,主动转换更清晰
记忆口诀
类型转换要记牢int转数截断小float转浮带小数str转啥都变文bool判断真与假转换失败用try字符串里藏数字int取整float包
常用场景速记
用户输入是字符串数字运算要转换字符串里取数字int()包一层浮点转整会截断四舍五入用round布尔判断很方便非空非零就是真