《Python的四则运算》是本单元的第二课,本课依然存在许多“坑”。请各位老师放心,这些坑我已经帮你踩过了。如果您对我的教材研读笔记有任何意见或建议,请在文章底部留言O(∩_∩)O~
关注我,后续更新更精彩!
PS:因无教参,本文包含大量主观臆测、吐槽、恶搞及自作主张的教材内容修订。正能量不足者请谨慎阅读!
课题名内容框架结构教材解读&吐槽&建议说一说学一学Python——“运算高手”一般数学计算整除与取余神奇的变量做一做第1题第(1)小题第(2)小题第2题试一试
《第9课 Python的四则运算》
教学建议
《Python编程入门》这一单元每课的知识容量都挺大,建议每课按照学情酌情划分课时。本课“做一做”的题目建议放在相应知识点探究、交流、讲解答疑完成后作为拓展习题处理,也可作为知识点间的过渡问题使用。
Python能帮我们做些什么?
萌芽的问题其实也是大多数学生心中的疑问。在上一课中,学生完成了所有编程语言的入门第一课“Hello,world!”,学会了使用print()
函数打印各种图形。自然会产生“Python还能做些什么?”的疑问。作为回应,本课教学内容安排了Python语言基础应用之——“数学计算”。
从“说一说”部分的内容看,教材的编写意图可能是想通过“人算”与“Python机算”的对比来凸显Python在数学计算方面的优势,营造问题情境,激发学生学习兴趣。毕竟学生无论心算还是笔算肯定都没有机器快嘛。正所谓:没有对比,就没有伤害!
注意,坑来啦!!!
第一,我们的学生是学过Scratch和WPS表格的,这两款软件也是可以快速、准确的完成计算任务的。
教学建议
既然以往所学知识也可以用来快速解决此类问题且无法突显python的优势,何不放弃使用人机竞赛的问题情境营造方式,转而从回顾上节课所学内容入手。在教师带领学生回顾完Python的启动、“Hello,world!"程序、
print("1234+5678")
与print(1234+5678)
的差异后,再抛出本课“说一说”的计算问题。经过回顾温习的前期铺垫,如果学生不是故意捣乱肯定会回答使用Python来计算,并能够在自主探究中综合运用上一课“做一做”中运行程序print(1234+5678)
得到的经验以及在WPS表格中学到的运算符知识来解决问题。
第二,小数(浮点数)运算结果的准确性问题。“说一说”中四个数学算式使用Python计算结果如下图所示。第二个算式,148.08除12.34的结果应该是12。而用print(148.08/12.34)
得到的结果却是12.000000000000002。
如果真用这段程序和学生比赛或做范例演示,场面一定会极度尴尬。而且学生自主探究时遇到这样的计算结果也会因为与已有数学经验出现认知冲突而感到困惑。想到这里,我脑补出这样的场景……
教学建议
是时候表演真正的技术啦!下面展示Python 3.7.4中小数(浮点)运算的正确姿势。
这段代码学生不理解不要紧,只要计算结果正确,能让学生对Python重拾信心就可以。还可以由此拓展并简单介绍一下Python语言的特性——模块。
使用decimal模块用于浮点数可以确保数据精度,小学阶段了解即可不必深究!
“学一学”是本课的重头戏,它共2块内容:
Python——“运算高手”
神奇的变量
本小节可以分为“一般数学计算”和“整除与取余”两大板块处理。
"Hello,world!")
回顾已经敲过的python程序,师生不仅共同经历了计算翻车和重拾信心,还使用Python处理了多种类型的数据。
整数:1234、5678、4321、875839、9587467、6354261、95768
小数(浮点数):148.08、12.34
字符串:"Hello,world!"、"1234+5678"、"148.08"、"12.34"、
教学建议
通过回顾写过的程序代码,并从中划出Python能够处理的数据类型,这样做比直接罗列效果好的多。毕竟,这些整数、小数(浮点数)、字符串学生都用过。
37页至38页列举的数据类型中整数和小数里的例子,所有数据均未曾在前面的代码中出现过。就这样半路冒出来,着实有些突兀!
关于字符串,38页列举的字符串的例子全部使用中文双引号包裹。亲,在python中字符串两端用中文双引号是会报错的!这一点在上一课的“试一试”里已经上机验证过。此处的排版失误如果得不到及时更正,将会成为处理字符串时的“隐患”!当然,你也可以让学生自己动手从教材里挑错O(∩_∩)O~
字符串的意思就是“一串字符”,比如“Hello,Charlie”是一个字符串,“How are you?”也是一个字符串。Python要求字符串必须使用引号括起来,使用单引号也行,使用双引号也行——只要两边的引号能配对即可。
——《疯狂Python讲义》第21页“2.4 字符串入门”
另外,阿尔法还在这里补了一句“一定不要忘记给字符串添加双引号哦!”。阿尔法的话虽然没有错误,但还是有些问题。字符串使用双引号是c/c++等编程语言的传统做法,而Python是个特立独行的语言。Python不但取缔了大括号,还打破了字符串只能用英文双引号的限制。在Python中,字符串用一对英文单引号包裹也行,用一对英文双引号也可以。亲,在Python3.7.4里字符串'Hello,world!'
也是合法的吆!
程序代码2.1的前四行,除了在进行“小数与小数的乘法运算”时继续翻车外,还有一个问题会使学生出现认知冲突。代码print(8/2)
和print(8.0/2)
的运算结果均为4.0。因为,按照学生已有的数学知识,前者的结果应该是4。
那么问题来了!教材中小数(浮点)运算为何会频频翻车?print(8/2)
和print(8.0/2)
为什么都会得到结果4.0?是太阳风暴影响了地球磁场继而干扰了程序运行,还是计算机之父冯·诺依曼显灵恶搞,还是电脑抽风了?
其实,我们使用的编程语言大多都有小数(浮点)运算不准确的问题。追根寻源,这与计算机内部浮点数的表示方法有关。不论是依然坚挺的老牌编程语言C++(下图),还是神坛新贵Python都有这种问题。
然而每种编程语言都会有自己的解决方案,比如前面我们使用的Python中的decimal模块。
from decimal
解决了Python小数(浮点)运算翻车,我们再来说一下除法问题。
在Python 2.x中“/”除法运算符和C/C++中的除法运算是一样的。如果“/”两侧都是整数,那就是整除运算。但只要“/”两边有一侧是小数(浮点),那就是一般除法。
在Python 3.x中无论“/”除法运算符两侧是整数还是小数(浮点数)都会进行一般除法。也就是说,即使是整数除整数也会进行一般除法运算,并且运算结果是小数(浮点数)形式。所以,print(8/2)
和print(8.0/2)
的计算结果都是4.0。虽然会发生认知冲突,但Python 3.x做除法运算时就是这么处理的!编者选择这两个算式放在这里,也许就是想说明此问题。
程序代码2.1的后两行,学生第一次在程序中涉及对字符串运算。程序的实际输出结果可能超出学生的心理预期,但这有助于学生加深对Python中字符串操作的认识。
教学建议
Python对整数、小数(浮点数)、字符串等数据类型的处理规则是在设计这门编程语言时就定好的。学生在探究过程中发现的所有与数据处理有关的经验都是“公理”,并不需要让学生通过大量的训练集去归纳、总结规律。加之Python的数学运算操作符又与在WPS表格中学到的经验相吻合,此处可以放手让学生去尝试,并总结Python处理数据的“规律”。
关于“先算括号,再算括号外”、“先算乘除,后算加减”的顺序问题,课本没有提供相关例程。此处,可以让学生自己设计程序去上机验证,也可以使用“做一做”第一题的第一小题验证。毕竟,实践是检验真理的唯一标准,源代码是最好的文档!
教学建议
可以使用“7个苹果平均分给3个人,每人分多少个?还剩多少个?”或类似的问题来过渡。因为像这种必须用整除和取余来解决的问题,学生用前面学习的一般数学计算是无法解决的。由此,可以顺理成章的引出“整除与取余”。
学生已经在二年级下学期学习过《有余数的除法》,知道什么是商,什么是余数。那么我们就可以引导学生使用已有数学知识解决分苹果问题。
这样做的好处是可以避免学生误认为,整除是对商的小数部分四舍五入以保留整数部分。
教学建议
“做一做”第一题第二小题可在此处用作随堂练习。
教材在引入“变量”这一概念时,编者试图通过“制造与预期不符的输出结果”来营造问题情境。怎奈这段程序不给力啊!咋看都不像能输出a
!
你品,你细品,你细细地品!
即使删掉a=3.1415926
这行,程序也不会输出a
!别问为什么,上一课我们已经在“试一试”里试过了。要想让程序输出a
可以这样修改程序:
"a")
或者用变量
"a"
有没有更优雅的例子可以用来引入“变量”呢?
教学建议
“神奇的变量”中,教材举例并不十分合适。改用下面的例子效果更佳!
问题:老师想用下面这行程序输出Hello
,能成功吗?
print(Hello)
第8课的经验已经告诉我们,这段程序直接运行是会报错的。
>>> print(Hello)
Traceback (most recent call last):
File "", line 1, in
NameError: name 'Hello' is not defined
此时,学生的第一反应应该是:运用第8课所学,在小括号内添加双引号“"”。这样即可完美输出Hello
。
"Hello")
这时候老师可以继续追问,还有没有其他方法?待学生无招可用之时,祭出下面的骚操作。然后在学生疑惑的目光中趁热打铁引入“变量”的概念。
"Hello"
此时的Hello
已经不是一个字符串,而是一个变量,是一个用于存放数据的“容器”。Hello="Hello"
将字符串"Hello"存入变量Hello
中。print(Hello)
则将变量Hello
中存放的数据(字符串"Hello")打印了出来。如果此时学生感觉不好理解,可以让学生动手把字符串"Hello"改为"Hello,World!"或其他内容试一试。
"Hello,World!"
教学建议
注意,本课只是简单一提“变量名常用a、b、c等字母表示”,后续并未详细介绍变量的命名规则。此处埋下的“雷”,会在学生写程序定义变量时成为“安全隐患”。那怎么拓展延伸到变量的命名规则呢?请接着往下看。
在学生理解了“变量是什么?”、“变量怎么用?”后,不妨回到第8课“试一试”的第一题。程序print("Hello,World!")
去掉双引号后,如何改造才能得到预期的运行结果?
如果学生照猫画虎写出下面的程序。
"Hello,World!"
那运行时一定是会报错滴!为很么呢?因为他没有遵循Python的变量名命名规则!为啥会犯错?教材没讲呗!
"Hello,World!"
由此即可拓展介绍Python中的变量名命名规则。
Python需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名字)。Python语言的标识符必须以字母、下划线()开头,后面可以跟任意数目的字母、数字和下划线()。此处的字母并不局限于26个英文字母,可以包含中文字符、日文字符等。
由于Python3支持UTF-8字符集,因此Python3的标识符可以使用UTF-8所能表示的多种语言的字符。Python语言是区分大小写的,因此abc和Abc是两个不同的标识符。
——《疯狂Python讲义》第16页2.2.3“变量的命名规则”
在上面的程序中Hello,World!
并不是合法的变量名,因为它包含了不应该使用的逗号和感叹号!所以,程序无情的报错了!至于是否介绍见名知意、驼峰命名法之类的编程规范,大家还是视学情灵活处理吧!
对变量a、b的操作很好理解。分别为变量a、b赋值5、6.5,然后使用print()
函数输出。对变量c的操作就让人很难理解,天晓得编者想往里放的是变量apple
的值,还是字符串"apple"
啊!如果是字符串,那加上英文双引号啊!我认为这是排版失误,你觉得呢?
简单,就是把算式12+32×2-(25+7)÷4使用Python的数学运算操作符改写为12+32*2-(25+7)/4
然后放到print()
函数里。
12+
需要注意的是:前面学生没有遇到过小括号套小括号的情况,可能会有点蒙【晕】
题面在输出描述上不够明确,也可能是我理解能力太弱。反正我看了半天没弄明白题目的要求,是每个人能分到的钱数和最后剩余的钱数放在一行用空格分隔输出,还是用两行分别输出?
如果是用两行分别输出。
方案一:
200//
方案二:
200//
如果是放在一行,用一个空格分隔输出。
这需要用到后面“试一试”出现的print(算式1,算式2)
输出方式。我想这应该不是编者的本意。毕竟在此处我们默认学生只会用print(算式)
这种输出型形式。
方案一:
200//
方案二:
200//
"我"
虽然学生在作这道题时是第一次接触变量的四则运算(有点突兀哈),但从教学效果看问题不大!基本上都能正确预判程序结果。如果有学生理解不了print(a+b+c)
这样的程序,可以让学生把变量里存放的字符串替换进去,把print(a+b+c)
变成print("我"+"爱看"+"电视")
。这样就好理解了。
这道题问题很大!虽然新印次(2019年6月第31次印刷)已经修改了题面,但仍然有问题。
我们先看2018年8月第28次印刷的第一版新教材,题面是这样的:
已知:甲、乙、丙3人的年龄各不相同。甲的年龄是12岁,乙的年龄比丙的年龄大9岁,甲的年龄是乙年龄的2倍。补全程序,分别用a、b、c表示甲、乙、丙3人的年龄,求出乙、丙的年龄b、c。
12
“甲的年龄是12岁”,这个不用说,第1行已经替我们搞定了。“乙的年龄比丙的年龄大9岁”,学生可能看到这就直接在第2行填上了b=c+9
。
12
这样可以吗?对错暂且不论,接着往下看。“甲的年龄是乙年龄的2倍”,已知甲的年龄是12岁,这是要求乙年龄的节奏啊!显然,我们用“乙的年龄比丙的年龄大9岁”这条信息来补全第2行程序是错误的,应该用它来计算丙的年龄。应该把第2行程序改为b=a/2
,第三行改为c=b-9
。
12
我们执行一下这段程序
12
结果有些出乎意料!首先,为啥年龄输出是小数呢?其次,年龄-3.0是什么鬼?
Python除法结果是小数的问题,前面已经解释过了。甲的年龄是乙年龄的2倍,那么甲的年龄一定是偶数!so,我们还是用整除吧!丙的年龄输出小数是因为b是小数。Python中小数减整数,结果还是小数!
12
执行修改后的程序
12
第一个问题解决了,可人的年龄怎么可能是负数呢?难道丙是鬼啊!既然建国以后的动物不能成精,那鬼也是不存在的!为了解决这个BUG,2019年6月第31次印刷的教材修改了题面:
已知:甲、乙、丙3人的年龄各不相同。甲的年龄是12岁,乙的年龄比丙的年龄大9岁,甲的年龄是丙年龄的2倍。补全程序,分别用a、b、c表示甲、乙、丙3人的年龄,求出乙、丙的年龄b、c。
12
我们来分析一下:
“乙的年龄比丙的年龄大9岁”,那么把丙的年龄加9就可以得到乙的年龄啦!马上动手补全第2行程序:
12
“甲的年龄是丙年龄的2倍”,那么甲的年龄除以2(二话不说,上整除“//”)就可以得到丙的年龄(6岁)。
12
大功告成O(∩_∩)O~
可是逻辑没错,python报错啊!
>
python的变量不用定义,但也要先赋值再使用。第2行b=c+9
,c还没赋值你就用,肯定报错啊!
教学建议
如果你用的是新印次,建议把程序的第2、3行位置调换一下,变成:
12
完整程序如下
12
执行结果
12
如果是你用的是老印次(毕竟我们也是循环教材),那就把“甲的年龄是乙年龄的2倍”改成“乙的年龄是甲年龄的2倍”。即:
已知:甲、乙、丙3人的年龄各不相同。甲的年龄是12岁,乙的年龄比丙的年龄大9岁,乙的年龄是甲年龄的2倍。补全程序,分别用a、b、c表示甲、乙、丙3人的年龄,求出乙、丙的年龄b、c。
补全后的程序:
12
执行结果
12
关注随心,取关随缘。
请相信,一切满怀信任的等待都是值得的!