python保留sqrt_python:"因式分解"引出的知识盲点

33d747037ba767c5c23b156e0e60625a.png6月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分)

宋顺南老师讲座例题

f2d28c1130b42f02aa9b018f91160960.png

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上的详解:

2214e147ec14efc7944692a67a09d08e.png

这些细节平时是不关注的,只有有需求的时候才会去寻找答案。

例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”不够,所以一直以来都认为我的“配置”不适合搞竞赛。如果前面的这段话你能听懂,说明你还是很厉害的。14e62e214ed3afff4790f65350ead23c.png好了,铺垫结束。该说重点了。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有很多细节,

对于没有通过阅读书籍系统学习初学者来说,

很容易忽略,

最好认认真真的拿一本书来学习。

行走路上

466ff245913533f25ffbd767d00cb3a1.png

信息技术教学的路很长,

行走路上与您一路同行!

● 感谢访问,欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值