第7章-输入输出与运算符


第7章 输入输出与运算符

上一章写的程序有个毛病:数据都"写死"在代码里——age = 18 就永远是 18,想换个数字还得改代码。真正的程序不是这样的,它得跟人打交道:问你名字,你敲进去,它再回话。今天学的东西,就是让程序"开口说话"和"听人说话"的两件工具,外加让程序"算东西"的一批运算符。学完这章,你能写出第一个会聊天的程序。

print:程序说话的方式

程序把结果展示给人看,靠的就是 print(打印)。最常用的玩法有三种:

  1. 打印一个东西print(变量)print("文字")
  2. 一次打印多个print(a, b, c),中间用逗号隔开,输出时自动用空格隔开
  3. 末尾不换行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" + 1TypeError——字符串和数字不能直接相加。
  • 转换要紧跟输入:推荐一行搞定 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 / 33.333...10 // 33。前者结果总是小数,后者一定砍掉余数。
  • 不能除以 010 / 0ZeroDivisionError。写除法时想想"除数会不会是 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 < 60and 两边各是一个完整比较。Python 其实支持连写 18 < age < 60,但新手建议先分开写,读起来清楚。
  • not 后面要有完整的条件:not age > 18 意思是"age 不大于 18",和 age <= 18 等价。

随堂练习

  1. 练习一(自我介绍):输入姓名和年龄,输出「大家好,我叫 X,今年 X 岁」。要求用 f-string 写输出。 提示:两步走——input 收进来(年龄记得转成 int),再 print(f"...")

  2. 练习二(温度转换):输入摄氏度,输出华氏度。公式:华氏 = 摄氏 * 9 / 5 + 32。 提示:摄氏温度可能是小数(比如 36.5),用 float() 转换更稳妥。输出建议保留一位小数:print(f"{f:.1f}"):.1f 表示保留 1 位小数,先会抄,后面慢慢懂)。

  3. 练习三(整数除法):输入两个整数,输出商和余数。比如输入 10 和 3,输出「10 ÷ 3 = 3 余 1」。 提示:商用 //,余数用 %,都是整数运算,不用转换浮点数。

  4. 练习四(进阶:年龄判断三连):输入年龄,用比较和逻辑运算符输出三个结果:是否成年(>=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 就是个空架子。今天把 === 分清楚,明天能少踩一个大坑。