和程序对话
4 道练习题·预计 50 分钟·做对一题解锁下一段
前言
学到这里,咱们在前面三章认识了 Python,学会了用 print() 输出,还学了字符串、整数、浮点数这几种基本的数据类型。
不知道各位童鞋有没有这样的感觉:教程里的例子,一个个都看得懂,可一合上教程,让自己从头写个小程序,却不知道该从哪一行写起。
这很正常,每一个学过编程的人都经历过这个阶段。
因为,看懂和会写之间,只隔着一件事:动手。
这就跟学游泳一样,在岸上把动作要领背得再熟,下了水照样要呛几口水。写程序也是这样,例子看十遍,还不如自己敲一遍。敲错了、报错了,再自己改对,这才算真正学会了。
所以从这一章开始,我们会穿插一些「实战」。实战章不急着学新语法,而是用刚学过的知识,做一个真正能用的小东西:记账本。一开始它会很简陋,但那是你亲手写出来的。往后每学完几章,我们就回到这里,给它添一点新本事。
写的过程中,漏个括号、打成中文引号、忘了转换类型,这些都是家常便饭,千万别因为这个就觉得自己不适合学编程。报错并不是在笑话你,它其实是在告诉你,下一步该改哪里。卡住了也没关系,回头再读一遍、再敲一遍,很多时候,第二遍就通了。
学这一章之前,需要先会第 2 章的 print()、字符串、整数、浮点数、类型转换和 f-string,这一章几乎每一节都会用到它们。哪里卡住了,就回到 第 2 章 对应的小节看一看。
目录
这一章会学到:
- 一、让程序开口问你——用
input()读取用户的输入 - 二、12 加 30,怎么等于 1230?——
input()返回的永远是字符串,要用int()转换 - 三、花了 12.5 元怎么记?——用
float()处理小数,用:.2f显示金额 - 四、不报错,结果却是错的——认识最难发现的一类 bug
- 五、常见坑
- 六、自己查一次文档——用
help()看函数的说明书 - 七、记账本 v0
- 八、小结与回看
学完这一章,你会写出记账本的第一个版本:它会问你买了什么、花了多少钱,再帮你把账算清楚。
一、让程序开口问你
到现在为止,咱们写的程序,数据都是提前写死在代码里的。
比如想算一算今天花了多少钱,只能这样写:
breakfast = 8
lunch = 25
print(f'今天一共花了 {breakfast + lunch} 元')输出的结果:
今天一共花了 33 元今天的账,这样算是算出来了。可是明天早饭花了 10 块呢?难道每天都要打开代码,把数字改一遍?
其实,记账这件事本来应该反过来:程序问我们「花了多少」,我们回答,程序帮着算。这一章就来做这件事:让程序在运行的时候,向使用它的人要数据。
这就是记账本的第一步。
第一次用 input()
那么,怎么让程序开口问人呢?Python 里,让程序停下来等人输入的函数,叫 input() 。先拿问名字来试一试:
name = input('你叫什么名字?')
print(f'你好,{name}')输出的结果:
你叫什么名字?两点水
你好,两点水这两行代码是怎么工作的呢?input() 括号里的文字是提示语。程序先把提示语显示出来,然后停下来等。你输入内容、按下回车,输入的内容就成了 input() 的结果,在这里被存进了变量 name 。下一行再把 name 放进问候语里,打印出来。
在自己电脑上运行时,程序会停在「你叫什么名字?」后面,光标一闪一闪地等你打字。
可是在网页里,没法这样边运行边打字。所以带 input() 的代码下面,会多出一个「程序输入」框:运行之前,先把要输入的内容填进去,每行一个值。程序每调用一次 input() ,就按顺序从框里取走一行。输出区会像终端一样,把这一行显示在提示语的后面。
试着把框里的「两点水」改成你自己的名字,再运行一次。
要是框里什么都没填,又会怎么样呢?程序会报 EOFError ,意思是「想读输入,但已经没有内容可读了」。遇到它,去框里补上一行就好。
名字能问了,下一节就让记账本问点正经的:今天花了多少钱。
二、12 加 30,怎么等于 1230?
上一节,程序已经能问名字了。照着同样的写法,记账本也可以问一问花了多少钱。先记两笔试试:
a = input('第一笔:')
b = input('第二笔:')
print(a + b)输出的结果:
第一笔:12
第二笔:30
123012 加 30,怎么等于 1230 ?
这个结果是不是有点眼熟?第 2 章讲类型转换的时候,'100' + '300' 得到的是 100300 。两个字符串相加,并不是算加法,而是把它们拼在一起。
这样一来,问题就变成了:a 和 b 是字符串吗?我们输入的明明是数字啊。
是不是字符串,光靠猜是猜不出来的。用 type() 看一下就知道了:
a = input('第一笔:')
print(type(a))输出的结果:
第一笔:12
<class 'str'><class 'str'> 说明,a 确实是字符串。所以答案很明确:input() 返回的永远是字符串。不管你输入的是 12、12.5 还是「奶茶」,它都原样交给你一串文字。这串文字是不是数字,要由我们自己来判断,再动手转换。
那怎么转换呢?用第 2 章学过的 int() ,把它们变成整数再相加:
a = input('第一笔:')
b = input('第二笔:')
print(int(a) + int(b))输出的结果:
第一笔:12
第二笔:30
42这次对了。
不过,这样写的话,每次用到 a 、b 都得套一层 int() 。其实也可以在读进来的那一刻就转好,后面用起来就不用再操心了:
a = int(input('第一笔:'))
b = int(input('第二笔:'))
print(f'合计:{a + b} 元')输出的结果:
第一笔:12
第二笔:30
合计:42 元int(input('第一笔:')) 这种一层套一层的写法,要从里往外读:先执行 input() ,拿到字符串 '12' ;再把它交给 int() ,变成整数 12 。
整数的花销算对了。先做一道练习,把两笔花销加起来,巩固一下。然后下一节再来看看:要是花了 12.5 元,又该怎么记?
编辑器里已经用 input() 读进了两笔花销。请把它们转成整数相加,打印出合计,格式是:
合计:42 元「程序输入」框里预填了 12 和 30,运行后完整的输出应该是:
第一笔:12
第二笔:30
合计:42 元检查答案时还会换几组别的数字,所以要真的去算,不能直接写死 42。
「运行」使用上面的输入;「检查答案」会依次使用题目给定的 3 组输入。
推荐一个,全网最全最友好的中文 AI 编程指南: coding.stormzhang.ai