第7章 输入输出与运算符
上一章写的程序有个毛病:数据都"写死"在代码里——
age = 18就永远是 18,想换个数字还得改代码。真正的程序不是这样的,它得跟人打交道:问你名字,你敲进去,它再回话。今天学的东西,就是让程序"开口说话"和"听人说话"的两件工具,外加让程序"算东西"的一批运算符。学完这章,你能写出第一个会聊天的程序。
print:程序说话的方式
程序把结果展示给人看,靠的就是 print(打印)。最常用的玩法有三种:
- 打印一个东西:
print(变量)或print("文字") - 一次打印多个:
print(a, b, c),中间用逗号隔开,输出时自动用空格隔开 - 末尾不换行:
print(内容, end=""),默认打印完会换行,用end可以改掉(明天循环打印会用到)
name = "小明"
age = 18
print("你好") # 你好
print(name) # 小明
print(name, age) # 小明 18(逗号隔开,自动空一格)
print(name, age, "岁") # 小明 18 岁
print("今天天气不错") # 今天天气不错
# end="" 表示打印完不换行(后面内容接着打)
print("A", end="")
print("B") # AB(两行合成一行了)
# 一行 print 用逗号连接,注意会有一个空格
print(1, 2, 3) # 1 2 3
几个容易出问题的地方:
- 打印文字必须加引号:
print(你好)会报NameError——Python 以为"你好"是个变量名。只有字符串才加引号,数字、布尔不加。 - 逗号拼接和加号拼接是两码事:
print(a, b)是"并排放两个值";print("a" + "b")是"把字符串接成一段"。数字不能直接用+拼进字符串里(下面会讲)。 end=""里是两个双引号:end=后面必须跟着内容,什么都不想加就写end="",表示"空字符串"。
input:程序听人说话
print 是往外说,input(输入)是往里听:程序跑到 input 会停下来等你敲键盘,敲完按回车,敲的内容作为"返回值"交给程序。
# 第一步:收(input)
name = input("请输入你的名字:")
# 第二步:用(这里只打印,不需要转换)
print("你好," + name)
# 重点演示:input 返回的是字符串!
age = input("请输入你的年龄:")
print(type(age)) # <class 'str'>(敲 18 也是字符串 "18"!)
# 要想算数,必须先转换
age = int(age) # 转成整数
print(f"明年你就 {age + 1} 岁了")
input("提示文字") 里的提示文字会先显示在屏幕上,比如 请输入名字:。
这一节最要紧的一句话:不管用户敲的是什么,input 返回的一定是字符串。敲 18 得到的是字符串 "18",不是数字 18。这可能是整个 Python 入门阶段被踩得最狠的一个坑,明天、后天、大后天你还会反复遇见它。
所以标准套路是:收进来 → 转类型 → 再使用。这里有几个点要注意:
- 忘了转换就做运算会报错:
"18" + 1报TypeError——字符串和数字不能直接相加。 - 转换要紧跟输入:推荐一行搞定
age = int(input("请输入年龄:")),或者分两步age = input(...)再age = int(age),别转完不存回去。 - 提示文字别漏引号:
input(请输入年龄:)漏了引号,Python 会把提示内容当成变量名,报NameError。
f-string:最省事的输出方式
想把"文字 + 变量的值"拼成一句话,有两条路:
- 加号拼接:
"你好," + name,只能字符串加字符串,数字得先转成str(),麻烦还容易错。 - f-string(推荐):在字符串前面加一个小写
f,要放变量的地方用{}包起来,Python 自动往里填值,数字、文字都能填,还能直接在花括号里写表达式(比如age + 1)。
name = "小明"
age = 18
height = 1.75
# f-string 基本用法:{} 里放变量
print(f"我叫{name},今年{age}岁") # 我叫小明,今年18岁
# {} 里能放表达式,直接算
print(f"明年我{age + 1}岁") # 明年我19岁
print(f"我的身高是{height}米") # 我的身高是1.75米
# 加号拼接做同样的事,对比一下谁方便
print("我叫" + name + ",今年" + str(age) + "岁") # 同上,但又要 str() 又要 +
你可以把 f-string 想成在字符串里开了个"插槽":f"..." 里的 {} 就是插槽,程序运行时把变量的值"插"进去。这是 Python 输出最常用的写法,今天开始就固定用它。
什么时候还用到加号拼接?几乎没有。老代码里可能见到,你认识就行,自己写统一用 f-string。
三个细节:
f必须紧贴引号:f"...",写成"f..."就错了。- 花括号要成对:
f"今年{age}岁"里{和}必须配对,多一个少一个都会报错。 - 引号冲突:字符串里用双引号包,里面的文字想表示引号就用单引号:
f"他说:'你好'"。
算术运算符:算数的工具
加减乘除,外加三个 Python 特有的,一共七个:
| 运算符 | 意思 | 例子 | 结果 | 说明 |
|---|---|---|---|---|
+ |
加 | 10 + 3 |
13 |
|
- |
减 | 10 - 3 |
7 |
|
* |
乘 | 10 * 3 |
30 |
注意星号不是 × |
/ |
除 | 10 / 3 |
3.333... |
结果一定是小数(float) |
// |
整除(取商) | 10 // 3 |
3 |
只留整数部分,去掉余数 |
% |
取余 | 10 % 3 |
1 |
整除后剩下多少,奇偶判断就靠它 |
** |
幂(乘方) | 2 ** 3 |
8 |
2 的 3 次方 |
a = 10
b = 3
print(a + b) # 13
print(a - b) # 7
print(a * b) # 30
print(a / b) # 3.3333333333333335(除法的结果总是小数)
print(a // b) # 3(整除,取商)
print(a % b) # 1(取余数)
print(a ** b) # 1000(10 的 3 次方)
# 混合运算:和数学一样,先乘除后加减,括号优先
print(2 + 3 * 4) # 14(先算 3*4)
print((2 + 3) * 4) # 20(括号优先)
# 负数也能用
print(-7 // 2) # -4(整除是向下取整,先了解即可)
print(-7 % 2) # 1
// 和 % 什么时候用?分东西的时候:10 个苹果分给 3 个人,10 // 3 是每人 3 个,10 % 3 是剩 1 个。一个除法拆成"商和余数"两个工具,特别实用——明天判断奇偶数就是 数 % 2。
几个坑:
/和//别搞混:10 / 3是3.333...,10 // 3是3。前者结果总是小数,后者一定砍掉余数。- 不能除以 0:
10 / 0报ZeroDivisionError。写除法时想想"除数会不会是 0"(第10章计算器会处理)。 - 幂是
**不是^:2 ** 3才是 8;^在 Python 里是别的意思(位运算),新手不要用。
比较运算符:比大小的工具
比较运算符用来比大小、判相等,结果只有两个:True(成立)或 False(不成立)。它明天就是 if 判断的"门卫"——门卫先问你"满 18 了吗?"(比较),if 再决定放不放行。
| 运算符 | 意思 | 例子 | 结果 |
|---|---|---|---|
> |
大于 | 10 > 5 |
True |
< |
小于 | 10 < 5 |
False |
>= |
大于等于 | 5 >= 5 |
True |
<= |
小于等于 | 6 <= 5 |
False |
== |
等于(判断相等) | 3 == 3 |
True |
!= |
不等于 | 3 != 4 |
True |
print(10 > 5) # True
print(10 < 5) # False
print(10 >= 10) # True(大于或等于都算成立)
print(9 <= 10) # True
print(3 == 3) # True(两个等号才是"相等")
print(3 != 4) # True(3 不等于 4,成立)
print("abc" == "abc") # True(字符串也能比相等)
# 比较的结果可以直接存进变量
age = 18
is_adult = age >= 18
print(is_adult) # True(is_adult 是布尔变量)
这一节最大的坑,也是所有编程语言的经典坑:判断相等必须用两个等号 ==。一个等号 = 是赋值(放东西),两个等号才是比较(问是不是)。考试必考,写代码必错一次——错了就记住了。
还有两点:
- 比较结果就是布尔值:
10 > 5整个表达式的结果就是True,可以直接存进 bool 变量。 - 浮点数比相等要小心:
0.1 + 0.2 == 0.3结果是False(电脑里小数有精度误差)。新手阶段别用浮点数直接比相等,用>=/<=代替。
逻辑运算符:多个条件一起判断
逻辑运算符把多个条件合起来判断,一共三个:
| 运算符 | 大白话 | 规则 | 例子 | 结果 |
|---|---|---|---|---|
and |
并且 | 两个都成立才 True | age >= 18 and age <= 60 |
都要满足 |
or |
或者 | 有一个成立就 True | age < 18 or age > 60 |
满足其一即可 |
not |
取反 | 真的变假,假的变真 | not is_adult |
反着来 |
记法:and 是"全都要",or 是"有一个就行",not 是"反着说"。
age = 20
height = 1.8
# and:两个条件都满足才 True
print(age > 18 and age < 60) # True(20 既大于 18 又小于 60)
print(age > 18 and height > 2) # False(身高条件不满足)
# or:满足一个就 True
print(age < 18 or age > 60) # False(20 两个都不满足)
print(age < 18 or height > 1.7) # True(身高满足了)
# not:取反
print(not True) # False
print(not (age < 18)) # True("age<18"是 False,取反成 True)
# 组合使用:算优先级,and 比 or 更"紧"
print(True or False and False) # True(先算 False and False = False,再 True or False)
print((True or False) and False) # False(加括号改变优先级)
三个注意点:
and/or是小写英文,写成&&/||(那是别的语言)会报语法错误。- 比较和逻辑混着写时,先比较后逻辑:
age > 18 and age < 60里and两边各是一个完整比较。Python 其实支持连写18 < age < 60,但新手建议先分开写,读起来清楚。 not后面要有完整的条件:not age > 18意思是"age 不大于 18",和age <= 18等价。
随堂练习
-
练习一(自我介绍):输入姓名和年龄,输出「大家好,我叫 X,今年 X 岁」。要求用 f-string 写输出。 提示:两步走——
input收进来(年龄记得转成 int),再print(f"...")。 -
练习二(温度转换):输入摄氏度,输出华氏度。公式:
华氏 = 摄氏 * 9 / 5 + 32。 提示:摄氏温度可能是小数(比如 36.5),用float()转换更稳妥。输出建议保留一位小数:print(f"{f:.1f}")(:.1f表示保留 1 位小数,先会抄,后面慢慢懂)。 -
练习三(整数除法):输入两个整数,输出商和余数。比如输入 10 和 3,输出「10 ÷ 3 = 3 余 1」。 提示:商用
//,余数用%,都是整数运算,不用转换浮点数。 -
★ 练习四(进阶:年龄判断三连):输入年龄,用比较和逻辑运算符输出三个结果:是否成年(>=18)、是否青年(>=18 且 <60)、是否未成年(<18 用
not或直接比较都行)。 提示:每个问题就是一个比较或逻辑表达式,结果存成布尔变量再打印。全部用 f-string 输出。
卡住了?让 AI 搭把手
场景:写输入输出的程序,忘了 input 要不要转换类型
提示词:我是 Python 零基础学生,今天学 input 和 print。
请你解释为什么 input 返回的一定是字符串,并给我演示一个
"输入两个数,输出它们的和"的完整例子,代码加中文注释。
场景:温度转换卡住,或想检查自己的写法
提示词:我是 Python 零基础学生,我写了温度转换的程序:
摄氏温度转华氏度(华氏 = 摄氏 * 9 / 5 + 32)。
请帮我看我的代码哪里有问题,不要直接给我完整答案,
先用大白话指出错在哪一步,提示我改。
常见报错速查
| 报错信息 | 什么意思 | 怎么办 |
|---|---|---|
TypeError: can only concatenate str (not "int") to str |
字符串和数字直接 + 了,加不起来 |
用 f-string:f"{name}今年{age}岁",或先把数字 str(age) |
ValueError: invalid literal for int() with base 10: 'abc' |
想转整数,但输入的是字母或符号 | 确认 int() / float() 里是数字;先 print 看看输入了什么 |
NameError: name 'xxx' is not defined |
input("提示") 里提示文字漏了引号,或变量名拼错 |
提示文字必须加引号;检查变量名拼写 |
ZeroDivisionError: division by zero |
除以 0 了 | 检查除数变量会不会是 0,做除法前先判断 |
SyntaxError: unmatched ')' |
括号没配对 | 数一数每个 ( 都有对应的 ) |
收个尾
今天的核心其实就一句话:input 收进来的永远是字符串,要算数先转换;输出统一用 f-string;运算符分三拨——算术(+ - * / // % **)、比较(结果必为 True/False,相等用 ==)、逻辑(and 全都要、or 有一个就行、not 取反)。
明天学 if 条件判断,让程序学会"看情况办事":分数够 90 说优秀,够 60 说及格。你今天练的比较运算符和逻辑运算符,明天就是 if 的"门卫"——没有它们,if 就是个空架子。今天把 == 和 = 分清楚,明天能少踩一个大坑。