📦 变量与数据类型:给程序装上"记忆"
🕐 预计用时:2-3 小时 | 🎯 今日目标:掌握变量、四大基本数据类型、类型转换
📖 今日目录
1. 变量是什么?——贴了标签的盒子
变量就像贴了标签的盒子,每个盒子里装着不同的东西
📦 最简单的比喻
想象你有一堆盒子,每个盒子上贴了一张标签。你可以在盒子里放任何东西——数字、文字、真假值……
变量 = 标签名,盒子里面的东西 = 值。
# 这就是变量!name = "小明" # 标签"name"的盒子里装了文字"小明"age = 18 # 标签"age"的盒子里装了数字18height = 1.75 # 标签"height"的盒子里装了小数1.75is_student = True # 标签"is_student"的盒子里装了"是"
💡 赋值符号 = 不是"等于"!在 Python 里,= 的意思是"把右边的东西放进左边的盒子里"。age = 18 读作"把 18 装进 age 这个盒子",而不是"age 等于 18"。真正的"等于"在 Python 里用 ==(两个等号),后面会学到。
🔧 变量的基本操作
# 创建变量name = "小明"age = 18# 使用变量print(name) # 输出: 小明print(age) # 输出: 18# 变量可以重新赋值(盒子里的东西可以换)age = 19 # 把盒子里的 18 换成了 19print(age) # 输出: 19# 变量可以参与计算price = 10quantity = 3total = price * quantityprint(total) # 输出: 30
🎯 一句话记住变量:变量就是给一块数据取个名字,方便后面反复使用。就像你不会每次都说"住在XX路XX号的那个人",而是直接叫"小明"。
📐 变量的"拆箱"过程
x = 10 # 第一步:创建盒子,标签写"x",放进 10y = x # 第二步:把 x 盒子里的东西复制一份,放进 y 盒子x = 20 # 第三步:把 x 盒子里的东西换成 20print(x) # 输出: 20print(y) # 输出: 10 (y 不受影响!因为它是复制的)
🤔 为什么 y 还是 10?因为 y = x 是"复制",不是"共享"。就像你把一本书复印了一份给朋友——你后来在自己的书上涂了笔记,朋友那份还是干净的。
2. Python 四大基本数据类型
数据类型就像给东西分类——不同类的东西有不同的用法
Python 里的数据有不同类型,就像现实世界里东西有不同的种类。今天我们认识四个最基本的"种类":
| | | |
|---|
| int | | 18 |
| float | | 1.75 |
| str | | "hello" |
| bool | | True |
🔢 整数(int)——数得清的东西
age = 18score = 100temperature = -10count = 0# 整数可以做各种数学运算print(10 + 3) # 加法: 13print(10 - 3) # 减法: 7print(10 * 3) # 乘法: 30print(10 / 3) # 除法: 3.3333...(结果是浮点数!)print(10 // 3) # 整除: 3(只取整数部分)print(10 % 3) # 取余: 1(10 除以 3 余 1)print(10 ** 3) # 幂运算: 1000(10的3次方)
💡 注意! 整数除以整数(/)结果会自动变成浮点数。10 / 2 的结果是 5.0,不是 5。想要整数结果?用 //(整除):10 // 2 = 5
📐 浮点数(float)——带小数点的数
height = 1.75weight = 65.5pi = 3.14159price = 9.99# 浮点数也可以做运算print(1.5 + 2.3) # 3.8print(3.0 * 2.0) # 6.0print(0.1 + 0.2) # 0.30000000000000004 🤯
⚠️ 经典的 0.1 + 0.2 问题!0.1 + 0.2 的结果不是 0.3,而是 0.30000000000000004。这不是 Python 的 bug,而是计算机存储小数的方式导致的精度问题。就像你用 10 进制无法精确表示 1/3(0.3333...)一样,计算机用 2 进制无法精确表示 0.1。不用担心!日常使用中,可以用 round() 函数来处理:round(0.1 + 0.2, 1) → 0.3
📝 字符串(str)——文字的世界
name = "小明"greeting = '你好'message = "Hello, World!"# 字符串可以用 + 号拼接first_name = "张"last_name = "三"full_name = first_name + last_nameprint(full_name) # 输出: 张三# 字符串可以用 * 号重复line = "-" * 20print(line) # 输出: --------------------
🎈 字符串的三种引号:"双引号" — 最常用'单引号' — 和双引号一样"""三引号""" — 可以换行的长文本选哪个?看心情!但要注意:引号必须配对,不能 "hello'。
✅ 布尔值(bool)——非黑即白
is_student = True # 是学生is_raining = False # 没下雨has_money = True # 有钱# 布尔值常用于条件判断print(10 > 5) # True(10 大于 5 吗?是的)print(3 == 5) # False(3 等于 5 吗?不是)print(10 != 3) # True(10 不等于 3 吗?是的)print("hello" == "hello") # Trueprint(True and False) # False(两个都是True才为True)print(True or False) # True(有一个True就为True)print(not True) # False(取反)
💡 布尔值的大小写很重要!✅ True — 首字母大写✅ False — 首字母大写❌ true — 这不是布尔值,只是一个普通的变量名!❌ TRUE — 这也不是!Python 区分大小写。
3. type() 函数:给数据"验明正身"
用 type() 函数查看变量到底是什么类型
有时候你不确定一个变量是什么类型,Python 提供了 type() 函数来帮你"验明正身":
# 查看各种数据的类型print(type(42)) # <class 'int'> → 整数print(type(3.14)) # <class 'float'> → 浮点数print(type("hello")) # <class 'str'> → 字符串print(type(True)) # <class 'bool'> → 布尔值# 也可以查看变量的类型name = "小明"age = 18print(type(name)) # <class 'str'>print(type(age)) # <class 'int'>
🎯 什么时候用 type()?当你发现程序结果不对劲的时候,第一步就是用 type() 检查变量类型。比如:print("年龄:" + age) 报错了?用 type(age) 一看——原来是 int,不是 str!
🔍 isinstance():更优雅的类型检查
# isinstance() 可以判断变量是否属于某个类型age = 18print(isinstance(age, int)) # Trueprint(isinstance(age, str)) # Falsename = "小明"print(isinstance(name, str)) # True
💡 type() 和 isinstance() 的区别:type(x) == int — 严格匹配,x 必须是 intisinstance(x, int) — 宽松匹配,x 是 int 或 int 的子类都行新手用 type() 就够了,等你学到面向对象再深入了解 isinstance()。
4. 变量命名规范
好的变量名就像好的路标——一看就知道通向哪里
给变量起名是有讲究的,不能随便乱来:
✅ 命名规则(必须遵守)
| | |
|---|
| my_name | my-name |
| name1 | 1name |
| my_class | class |
| name | |
🎨 命名风格(推荐遵守)
# ✅ 蛇形命名(snake_case):单词之间用下划线连接user_name = "小明" # 好!清晰明了student_age = 18 # 好!total_price = 99.9 # 好!# ❌ 不推荐的命名userName = "小明" # 驼峰命名(JavaScript 风格,Python 不推荐)UserName = "小明" # 帕斯卡命名(Java 风格,Python 不推荐)a = "小明" # 太短!谁知道 a 是什么?abcdefghijklmnopqrstuvwxyz = "小明" # 太长!打字累死人
💡 蛇形命名是 Python 的"官方推荐"。Python 的设计哲学是"做一件事应该有且仅有一种显而易见的方式",在变量命名上,这种方式就是 snake_case(蛇形命名)。
🚫 Python 关键字(不能用作变量名)
# 这些是 Python 的"保留字",不能拿来当变量名import keywordprint(keyword.kwlist)# 输出(Python 3.13):# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',# 'break', 'class', 'continue', 'def', 'del', 'elif', 'else',# 'except', 'finally', 'for', 'from', 'global', 'if', 'import',# 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise',# 'return', 'try', 'while', 'with', 'yield']
💡 好名字 vs 坏名字
# ❌ 坏名字:看不出含义a = 18b = "小明"c = True# ✅ 好名字:一看就懂age = 18student_name = "小明"is_enrolled = True# ❌ 坏名字:太模糊data = [1, 2, 3]temp = "hello"# ✅ 好名字:精确描述student_scores = [1, 2, 3]welcome_message = "hello"
🎯 起名口诀:一看就懂,不用猜。age 比 a 好,student_count 比 sc 好。宁可长一点,也不要让人看不懂。
5. 类型转换:数据的"变形术"
类型转换就像把不同形状的积木互相变换
不同类型的数据之间可以互相转换,就像把水倒进不同形状的杯子里:
🔄 四种转换函数
| | | |
|---|
int() | | int(3.7) | 3 |
float() | | float(5) | 5.0 |
str() | | str(100) | "100" |
bool() | | bool(0) | False |
🔢 int() 转换详解
# 浮点数 → 整数(砍掉小数部分)print(int(3.7)) # 3(不是 4!直接砍,不四舍五入)print(int(3.2)) # 3print(int(-2.9)) # -2# 字符串 → 整数(字符串必须长得像数字)print(int("42")) # 42print(int("-10")) # -10# ❌ 这些会报错!# int("hello") # ValueError!"hello" 不像数字# int("3.14") # ValueError!带小数点的字符串不能直接转 int# int("") # ValueError!空字符串不行
📐 float() 转换详解
# 整数 → 浮点数print(float(5)) # 5.0print(float(0)) # 0.0# 字符串 → 浮点数print(float("3.14")) # 3.14print(float("100")) # 100.0print(float("-2.5")) # -2.5
📝 str() 转换详解
# 任何类型都可以转为字符串print(str(42)) # "42"print(str(3.14)) # "3.14"print(str(True)) # "True"print(str(None)) # "None"# 实际应用:拼接数字和文字age = 18print("我今年" + str(age) + "岁") # 我今年18岁# 如果不转换:print("我今年" + age + "岁") → 报错!
⚠️ 最常见的错误!
age = 18print("年龄:" + age) # ❌ TypeError! 字符串不能和数字拼接print("年龄:" + str(age)) # ✅ 正确!先转成字符串
✅ bool() 转换详解
# 以下值转为 bool 是 False(记住这些"假值"!)print(bool(0)) # False(数字0)print(bool(0.0)) # False(浮点0)print(bool("")) # False(空字符串)print(bool(None)) # False(None 表示"没有")# 其他所有值都是 Trueprint(bool(1)) # Trueprint(bool(-5)) # True(负数也是True!)print(bool("hello")) # Trueprint(bool(" ")) # True(空格也是字符,不是空字符串)
💡 bool() 的记忆口诀:"零空无假"0(零)、""(空字符串)、None(无)→ False其他所有东西 → True
6. 动态类型:Python 的"自由灵魂"
🎭 什么是动态类型?
有些语言(如 Java、C++)要求你提前声明变量的类型,就像你去酒店入住必须先登记身份证:
// Java 风格(静态类型,需要声明类型)int age = 18; // 必须说清楚 age 是整数String name = "小明"; // 必须说清楚 name 是字符串// age = "hello"; // ❌ 报错!age 已经被定义为整数,不能放字符串
Python 是动态类型语言,不需要声明类型,就像你去朋友家串门——随便坐,不用登记:
# Python 风格(动态类型,不需要声明类型)age = 18 # age 现在是整数print(type(age)) # <class 'int'>age = "十八岁" # 没问题!age 现在变成了字符串print(type(age)) # <class 'str'>age = 18.5 # 又变了!现在是浮点数print(type(age)) # <class 'float'>
🎯 动态类型的优缺点:✅ 优点:灵活方便,写起来快❌ 缺点:容易犯错(你可能不小心把数字变成了字符串)所以养成用 type() 检查变量的习惯很重要!
7. input() 函数:让程序听你说话
🎤 input() 是什么?
input() 让程序暂停运行,等待用户输入内容。
就像你问朋友一个问题,然后等他回答:
# 最简单的用法name = input("请输入你的名字: ")print("你好," + name + "!")
运行效果:
请输入你的名字: 小明 ← 这里你输入"小明"然后按回车你好,小明! ← 程序输出
⚠️ 重要:input() 返回的永远是字符串!
# input() 返回的类型是 str(字符串),不是数字!age = input("请输入你的年龄: ")print(type(age)) # <class 'str'> ← 是字符串,不是整数!# 如果要做数学运算,需要手动转换age = int(input("请输入你的年龄: ")) # 用 int() 转换print(type(age)) # <class 'int''> ← 现在是整数了print("明年你", age + 1, "岁") # 可以做数学运算了
⚠️ 最常见的坑!
num = input("输入一个数字: ") # 用户输入 10print(num + 5) # ❌ TypeError! 字符串 "10" 不能和数字 5 相加print(int(num) + 5) # ✅ 正确!先转换再运算
🎈 input() 的工作流程:1. 显示括号里的提示文字2. 程序暂停,等你输入3. 你输入内容,按回车4. 你输入的内容(作为字符串)被存到变量里Day 4 会更详细地讲解 input() 的各种用法!
8. 今日练习
🏋️ 练习 1:自我介绍(升级版)
创建 day02_practice.py,用变量存储信息,然后打印自我介绍:
# 用变量存储个人信息name = "小明"age = 18height = 1.75is_student = True# 打印自我介绍print("=== 自我介绍 ===")print("姓名:", name)print("年龄:", age)print("身高:", height, "米")print("是学生吗:", is_student)print("类型检查:", type(name), type(age), type(height), type(is_student))
🏋️ 练习 2:温度转换器
把华氏温度转换为摄氏温度(公式:摄氏 = (华氏 - 32) × 5/9):
# 温度转换fahrenheit = 98.6celsius = (fahrenheit - 32) * 5 / 9print(fahrenheit, "华氏度 =", round(celsius, 1), "摄氏度")
🏋️ 练习 3:购物计算器
# 购物小票item = "Python入门书"price = 49.9quantity = 2total = price * quantitydiscount = 0.8 # 八折final_price = total * discountprint("商品:", item)print("单价:", price, "元")print("数量:", quantity, "本")print("总价:", total, "元")print("折扣:", discount)print("实付:", round(final_price, 2), "元")
🏋️ 练习 4:布尔值大冒险
# 预测下面每行输出什么,然后运行验证print(bool(0)) # ?print(bool(1)) # ?print(bool(-1)) # ?print(bool("")) # ?print(bool("0")) # ?print(bool("False")) # ?print(bool(None)) # ?print(bool([])) # ?print(bool([1, 2])) # ?
🏋️ 练习 5:变量交换
# 交换两个变量的值(Python 的魔法写法!)a = 10b = 20print("交换前: a =", a, ", b =", b)# 方法一:用临时变量(传统方法)temp = aa = bb = tempprint("交换后: a =", a, ", b =", b)# 方法二:Python 的一行交换(酷!)a, b = b, aprint("再交换: a =", a, ", b =", b)
9. 今日小结
📋 今天你学到了什么?
🧠 自检清单
⬜ 知道什么是变量,理解 = 是赋值不是等于
⬜ 能说出 Python 四大基本数据类型及各自特点
⬜ 会用 type() 查看变量类型
⬜ 知道变量命名要用蛇形命名 snake_case
⬜ 能用 int(), float(), str(), bool() 做类型转换
⬜ 记住 bool() 的口诀:"零空无假"
⬜ 知道 input() 返回的是字符串
⬜ 知道 0.1 + 0.2 != 0.3 是精度问题,不是 bug
🎯 Day 3 预告
明天我们将学习 字符串的进阶操作——切片、格式化、常用方法……让你的文字处理能力飞起来!✂️
🌟 彩蛋:Python 的"类型彩蛋"
# Python 的 True 和 False 其实是数字!print(True + True) # 2(True 是 1)print(True + False) # 1(False 是 0)print(True * 10) # 10# 所以你可以用 True 做数学题(虽然没什么用)print(True + True + True + False + True) # 4
✨ 冷知识:在 Python 里,True 就是 1,False 就是 0。所以布尔值其实是一种特殊的整数!这就像"开关"——开(1)和关(0),本质上就是数字。
📅 Day 2 完成!你的程序现在能"记住"东西了。明天见! 🚀