6月17日学习笔记前天在“高中Python教学交流群”中,大家探讨了宋顺南老师给舟山教师培训时讲的四道题,重点是最后一道“因式分解”。我用了大约30分钟左右才解出来,方法和结果都不是很理想。看了吴老师和刘老师的方法之后,让我打开眼界。在这个过程中我发现几个知识盲点,
对于初学者尤其是学习不够系统的初学者来说有一定的借鉴价值。先来看一下那四道题,我先逐一给出代码,然后再重点说“因式分解”。
例1:编写一个程序,输入正方形的边长a,输出它的周长和面积(保留两位小数)。要求:1.程序开始运行后,输入一个数字作为边长;2.程序会根据输入的数字给出周长和面积,并且注明是周长、面积。评分细则:1.有输入语句;(2分) 2.有输出语句;(2分) 3.有类型转化语句;(2分) 4.有计算语句;(2分) 5.程序符合题目要求;(2分)
宋顺南老师讲座例题
a=eval(input('请输入一个正数:'))#print('周长=',round(a*4,2))print('周长=%.2f'%(a*4))#print('面积=',round(a*a,2))print('面积=%.2f'%(a*a))
round()函数保留小数位数是我第一次教学时在网上搜到,相比%..2f的方法我更喜欢它,但是测试的时候发现这种方法
有时候会把0省掉,就不能完全达到保留两位小数的要求了。大家可以用一些数据做一下比较。
例2:Turtle绘画 要求:绘制一个奥迪商标,四环全黑。如下图:
评分细则:1.导入库文件正确;(2分) 2.有抬笔、落笔命令;(2分) 3.有行进到某个点的命令;(3分) 4.有画圆工具;(2分) 5.有颜色工具;(2分) 6.坐标计算正确;(3分) 7.运行正常;(4分) 8.完成任务;(2分)
宋顺南老师讲座例题

import turtleturtle.pencolor('black')turtle.pensize(3)turtle.penup()turtle.goto(-100,0)for i in range(4): turtle.pendown() turtle.circle(50) turtle.penup() turtle.fd(80)这道题的考点比较多,
思维上的关键点抬笔、落笔和移位,知识上主要是turtle画笔和坐标的操作。其中
circle()的参数是指半径是我以前没有留意的,此外circle()的参数可以有两个(这还是从学生那得知的,详见Python:《Python应用实例欣赏》第4课520特辑),例如
circle(50,180)表示画一个半径为50像素的半圆。进一步查了一下发现csdn上的详解:

例3:要求:鸡兔同笼问题。已知鸡兔总头数为25,腿总数为80,求鸡兔各有几只?评分细则:1.有循环,并且基本正确(4分) 2.有分支,并且基本正确(4分) 3.有输出,并且指明鸡兔数量(4) 4.运行结果正确(4分)
宋顺南老师讲座例题
for i in range(0,26,1): j=i*2+(25-i)*4 if j==80: print(f'鸡有{i}只,兔有{25-i}只')经典的不能再经典的枚举例题了。
基础循环嵌套分支+数学建模,看似很简单的数学题,写出程序还是会难倒一些人的,
关键在循环和分支的配合,没有一定编程经验的初学者很难写出程序来。
f‘str{var}str’这种用法我喜欢,但是目前还
不知道如何在这里实现保留小数位数。
4: 要求:用户从键盘输入小于1000的整数,对其进行因式分解。例如:10=2*5,60=2*2*3*5。 评分细则:
宋顺南老师讲座例题
import math#n=int(input('请输入一个整数'))f=open('t.txt','w')#t.txt记录测试结果用for n in range(1,1001):#为了检验1-1000的所有数增设的循环 k=int(math.sqrt(n))#为了减少判断次数,也可以用int(n**0.5) i=2 flag=0#标记是否hi第一次求因子,为了正确输出* flag2=0#标记n是否是素数,为了正确输出最后一个因子 while i<=k: if n%i==0: if flag==1: print(f'*{i}',end='')#end=''不换行输出 f.write('*'+str(i))#输出到文件 else: print(f'{n}={i}',end='') f.write(str(n)+'='+str(i))#输出到恩建 flag=1 flag2=1 n=n/i i=2 else: i+=1 flag2=0 if flag==0: print('没有因子')#输出到屏幕 f.write('没有因子')#输出到文件 elif flag2==0 and n!=1: print(f'*{int(n)}',end='') f.write('*'+str(int(n))) print() f.write('\n')#输出到文件,判断不同数时每个数的因数表达式一行f.close()#关闭文件这个题真的很难,先说一下我的基本思路。
1、从2开始至n**0.5逐个试因子。
2、如果发现因子:
1)如果发现第一个因子i,则输出i;否则,则输出*i;
2)将n缩小为n/i;
3)返回1,直至i>n**0.5
3、如果没有任何因子则输出提示,否则将最后一个n值不为1的数输出。
以上思路并不是一次形成的,是在实践中不断测试发现问题,然后不断完善的。这是我写代码的习惯,一次性将问题想到为我做不到,或许是因为我的“内存”太小,或许我的“CPU”不够,所以一直以来都认为我的“配置”不适合搞竞赛。如果前面的这段话你能听懂,说明你还是很厉害的。
好了,铺垫结束。该说重点了。1、
for i in range(10)中的i值不可以在循环体中修改,可用while来实现。
for i in range(2,k+1): if n%i==0: …… n=n/i i=2 else: i+=1上面这种期望修改i值的方法是做不到的,
因为i值来自range(),而range()的值不可以修改。姑且就这么简单理解就好,详细的可以去查一下官方文档。
这个发现是我调试代码时试出来的。在以前的学习中从来没有关注过这个细节。
2、n=6/2=3.0,n为float类型
f.write('*'+str(int(n)))
上面这行代码大家看着可能会很奇怪,为什么要int(n),n输入的时候不是已经int了吗?当我看到运行结果有小数时我也是这么想的。后来看吴老师的代码,才知道n=n/i进行了除法运算,将n改为float类型。可以通过n=n//i解决。//是整除运算,可以避免这个问题。这也是我以前从没注意到的细节。
3、列表操作
从代码和思路中可以看出,我的代码关注的一个难点是格式化输出
上,例如20=2*2*5这种格式。
从代码中的注释能够看出来,如果没有格式要求这还可以简化很多。
但如果用
python的特色——列表,一切都会如此简单
。
n=m=int(input('请输入一个整数:'))l=[]for i in range(2,int(n**0.5)+1): while n%i==0: l.append(i) n//=iprint(m,'=',"*".join(map(str,l)))上面是吴老师的代码,从代码中可以看出,吴老师的思路是:1、建立一个空列表用于记录因子。2、从2到n逐个作为除数除以n3、判断i是否是n的因子,如果是则记录。4、判断n//i的因子,直至i不再是因子为止。5、返回到2,重复2-4直至
int(n**0.5
)。6、将列表中的所有元素格式化输出。这里首先要
知道列表的作用,熟练掌握列表数据的添加、join()和map()两个函数才可以。可以看出
我遇到的难点,在这里根本就不是事儿。
掌握列表的操作是学习Python区别c或c++等语言的重点。
此外老师们还讨论了程序对应算法的效率问题,算法是我所不擅长的,有兴趣可以去看一下梁见斌老师的文章小心Python语言中for循环的一个坑。
感悟
Python有很多细节,
对于没有通过阅读书籍系统学习初学者来说,
很容易忽略,
最好认认真真的拿一本书来学习。
行走路上
| 信息技术教学的路很长, 行走路上与您一路同行! ● 感谢访问,欢迎交流 |

6575

被折叠的 条评论
为什么被折叠?



