第6章-变量与数据类型


第6章 变量与数据类型

前几天你都在跟电脑"外围"打交道:文件放哪、命令怎么敲、Python 环境怎么搭。从今天起要动真格的了——写程序。程序干的第一件正事,是帮电脑把东西记住:记住你今年 18 岁,记住你的名字,记住今天的温度。

电脑靠什么记?你可以把它想成一个带格子的本子:每个格子能存一个数、一句话,格子外面还得贴个标签,不然翻到后面就认不出这是谁的成绩了。这个"贴了标签的格子",就是变量(variable)。整个 Python 生涯里你每天都会跟它见面。

变量:一个贴了名字的盒子

变量的用法就三件事:起名字、放东西、随时取

放东西的动作叫赋值,写法是 =

# 定义一个变量:名字叫 age,往里放整数 18
age = 18
print(age)        # 18

# 盒子可以换内容
age = 19
print(age)        # 19(盒子里的值被换掉了)

# 变量可以被取出来参与运算
age = age + 1
print(age)        # 20(先取出 19,加 1,再放回去)

# 一个变量赋值给另一个变量
name = "小明"
your_name = name   # 把 name 盒子里的值复制给 your_name
print(your_name)   # 小明

注意这里的 = 不是数学里的"等于",它的意思是"把右边的值放进左边的盒子"。数学里 x = x + 1 是错的,程序里却完全合法——"把 x 里的值取出来加 1,再放回 x"。所以写的时候记住:变量名在左,数据在右。写成 18 = age 会直接报错,因为左边必须是一个名字。

为什么它叫"变"量?因为盒子里装的东西可以变:今天装 18,明天装 20,程序运行到一半也能换。这一点看着不起眼,却是后面写程序的地基——同一个变量,在不同时刻装不同的值,程序才有"活着"的感觉。

还有两件事容易犯迷糊:

  • 用变量之前必须先赋值。标签都没贴就喊"把那个盒子拿过来",电脑自然不认识,报 NameError(见文末速查表)。
  • 同一个名字,后面赋的值会覆盖前面的。程序从上往下执行,最后一次赋值才作数。

盒子里装的东西分四类

能往盒子里放的东西,Python 把它们分成了几类,最常用的是这四种:

类型名 大白话 例子 一句话说明
int(integer) 整数 18-30 没有小数点的数字
float(浮点数) 小数 3.149.9-0.5 带小数点的数字,在电脑里存法像"小数点会浮动",所以叫浮点
str(string) 字符串 "你好"'abc' 一串文字,必须用引号包起来
bool(boolean) 布尔 TrueFalse 只有两个值,真和假,专门用来判断

其中两种类型要特别留意:

  • 字符串:单引号 ' 双引号 " 都能用,但必须成对"你好' 这种混写直接语法报错。
  • 布尔:只有 TrueFalse 两个值,首字母必须大写,写成 true 会报 NameError。它俩不是文字,不能加引号——加了引号就变成字符串了。

想知道类型?type() 一句话的事

有时候你不确定一个东西是什么类型,用 type() 问它:把变量放进去,它回答"这是个什么类型"。输出长这样:

age = 18                 # 整数 int
price = 9.9              # 小数 float
name = "小明"             # 字符串 str
is_student = True        # 布尔 bool

print(age)               # 18
print(price)             # 9.9
print(name)              # 小明
print(is_student)        # True

# 用 type() 查看类型
print(type(age))         # <class 'int'>
print(type(price))       # <class 'float'>
print(type(name))        # <class 'str'>
print(type(is_student))  # <class 'bool'>

<class 'int'> 翻译成人话就是"这是一个 int 类的值",你只要认得后半截的 intfloatstrbool 就够了。

刚接触时你可能觉得类型有什么好查的,自己写的还能不知道?还真会不知道——尤其明天学了 input 之后,数据是从用户那里进来的,你不查就说不准它是文字还是数字。

这里其实埋了个隐患:"18"18 长得一样,但一个是文字一个是数字。文字版 18 没法做算术,"18" + 2 会报 TypeError(明天细讲)。要算数,就得先把文字版变成数字版——这就轮到类型转换了。

类型转换:把文字版 18 变成数字版 18

Python 给了三个现成的转换工具:

工具 作用 例子 结果
int(东西) 转成整数 int("18") 18
float(东西) 转成小数 float("9.9") 9.9
str(东西) 转成字符串 str(18) "18"

看个完整的例子:

# 问类型
print(type(123))         # <class 'int'>
print(type(12.5))        # <class 'float'>
print(type("123"))       # <class 'str'>(加了引号就是文字!)

# 类型转换
a = "18"                 # 字符串版 18
b = int(a)               # 转成整数版 18
print(a, type(a))        # 18 <class 'str'>
print(b, type(b))        # 18 <class 'int'>

# 整数转字符串,可以和文字拼在一起(第7章会细讲拼接)
print("我今年 " + str(18) + " 岁")   # 我今年 18 岁

# 注意:不是所有文字都能转数字
# print(int("你好"))     # 会报 ValueError,文字不是数字转不了

转换的写法汇总成一张表,以后照着用:

想转成 写法 例子 结果
整数 int(东西) int("18")int(3.9) 183
小数 float(东西) float("9.9")float(2) 9.92.0
字符串 str(东西) str(18)str(3.5) "18""3.5"

三个坑提前说:

  • 转不动的会报错int("你好")int("abc") 都会报 ValueError。只有长得像数字的字符串("18""3.5")才转得了。
  • float 转 int 会砍掉小数int(3.9) 结果是 3,直接舍去小数部分,不是四舍五入。
  • 转换完别忘存起来int("18") 只算出结果,没存住。要 age = int("18") 才把结果放回盒子,不然用的时候还是原来的字符串。

为什么今天就要学这个?明天 input 收进来的数字其实是"文字版数字",不转就没法算数。先认识工具,明天就派上用场。

给盒子起名字的三条铁律

贴标签也不是乱贴的,Python 有规定,三条铁律:

  1. 只能由字母、数字、下划线(_)组成,不能有空格、不能有 -、不能有 @ 这类特殊符号。
  2. 不能以数字开头2name 不行,name2 可以。
  3. 不能跟 Python 的关键字重名ifforwhileprint 这些名字是 Python 自己用的,你抢了会出乱子。
# 合法命名
student_name = "小明"     # 有下划线,OK
name2 = "小红"            # 数字在中间/结尾,OK
_age = 18                # 下划线开头,OK

# 非法命名(试试看会怎样)
# 2name = "小明"         # SyntaxError:数字不能开头
# my name = "小明"       # SyntaxError:不能有空格
# my-name = "小明"       # SyntaxError:不能有 -
# if = 18                # SyntaxError:关键字不能当名字

# 见名知意(好习惯)
user_age = 20            # 一看就知道是"用户年龄"
total_score = 98.5       # 一看就知道是"总分"

铁律之外还有几条提醒:

  • 大小写是两回事Namename 是两个不同的变量,Python 区分大小写。
  • 别用关键字和内置函数名print = 1 能"骗过"Python 不报错,但之后 print(...) 就废了,整个程序全乱。新手别去试。
  • 中文也能当变量名(Python 3 支持),但不推荐——团队协作和大多数项目都用英文,从今天起养成习惯。

另外有一条不强制但强烈建议的规矩:见名知意。存学生姓名的变量叫 student_name,别叫 sn;存价格的叫 price,别叫 p。代码是写给人看的,几个月后你自己回来看,名字起得好,一眼就懂。

注释:写给未来自己的便签

程序写多了你会发现,最需要解释的不是电脑,是——尤其是几个月后的你自己。注释就是写给"人"看、电脑直接忽略的文字,用 # 开头,写什么都行,不影响运行:

# 这是一条注释,Python 会跳过它
age = 18    # 行尾也能写注释,说明这行代码的意思

# 整段注释也常用 # 一行一行写
# 作者:小明
# 日期:2025-01-01
# 功能:打印个人信息

name = "小明"
print(name)   # 输出名字

三个小细节:

  • # 必须用英文的井号,中文全角的 不生效,会变成代码报错。
  • 注释不能写在字符串引号里面:"你好 # 这是注释" 里的 # 是文字的一部分,不是注释。
  • 注释要写"为什么",别把代码翻译一遍。age = 18 # 年龄age = 18 # 给 age 赋值 18 强——说人话、说目的。

随堂练习

先自己动手,卡住 5 分钟再问 AI。每道题做完,用 type() 验证一下变量类型。

  1. 练习一(我的名片):定义 4 个变量,分别存:你的名字(str)、年龄(int)、身高(float,比如 1.75)、是否是学生(bool)。然后写 4 条 print 把它们打印出来,再写 4 条 print(type(变量)) 查看类型。 提示:先想清楚每个值用什么类型,名字要加引号,数字不要加引号,是/否用 True / False

  2. 练习二(类型侦探):先猜下面这行代码输出什么,再运行看对不对:

python print(type(10), type(10.0), type("10"), type(True))

提示:10"10" 一个是数字一个是文字,类型不一样。

  1. 练习三(命名规则检查):下面哪些变量名合法?哪些会报错?说出原因。

python # 逐个判断:a1 / 1a / my_age / my age / _score / if / age-1

提示:对照三条铁律逐条检查:组成字符、是否数字开头、是否关键字。

  1. 练习四(进阶:交换两个变量的值):定义 a = 1b = 2,写代码把它们交换:交换后 a 是 2,b 是 1。 提示:需要一个"空盒子"当临时中转站:先把 a 的值放进临时变量,再把 ba,最后把临时变量给 b。就像两杯水要互换,得先找个空杯子。

  2. 练习五(进阶:自动换行的打印):不借助任何变量,用一行代码打印出 6 种类型:整数 100、小数 3.14、字符串"Python"、布尔 True,再用 type() 打印它们的类型。 提示:print(100, type(100)) 就是"打印值 + 打印类型"的组合,一次 print 里放两个参数,用逗号隔开。对比输出里 100 <class 'int'> 中间会自动空一格。

卡住了?让 AI 搭把手

场景定义变量时不确定类型或写完想检查
提示词我是 Python 零基础学生今天学了变量和 4 种数据类型intfloatstrbool)。
请你帮我写一个小程序定义 4 个变量分别保存我的名字年龄身高是否是学生
然后用 type() 打印出每个变量的类型代码要加中文注释每行注释解释它在干什么
场景:练习四的交换变量卡住了,想看思路
提示词:我是 Python 零基础学生,写了一个交换两个变量值的练习但卡住了。
不要直接给我完整代码,先用大白话告诉我交换的思路(为什么要用临时变量),
再让我自己写。如果我写错了,帮我指出错在哪里。

常见报错速查

报错信息 什么意思 怎么办
SyntaxError: invalid syntax 语法错误,一般语法写错了 检查引号是否成对、变量名是否合法(空格/数字开头/特殊符号)
NameError: name 'x' is not defined 变量 x 没定义就用了 检查变量名拼写(包括大小写),确认先赋值再使用
ValueError: invalid literal for int() 想转成整数,但内容不是数字 确认 int() 里放的是长得像数字的字符串
TypeError: 'int' object is not callable 你把变量名当函数用了 检查是不是给 printtype 这类内置名字重新赋值过
IndentationError: unexpected indent 缩进混乱(今天后面会学,先认识) 检查代码开头有没有多出来的空格

收个尾

今天这几件事——变量、四种类型、type()、类型转换、命名规则、注释——说白了就是一个"存东西"的能力。明天开始,程序就不只是存东西了,还要跟人打交道:问用户名字、收用户输入、再回话。你今天的类型转换,正是明天的第一个大坑:input 收进来的数字其实是字符串,不转就没法算。这个坑明天你会反复踩,踩熟了,你就真入门了。

临走问自己一个问题:"10"10 打印出来长得一模一样,怎么证明它俩不是同一个东西?(提示:今天的工具里有答案。)