py编程基础及导论 1_第1页
py编程基础及导论 1_第2页
py编程基础及导论 1_第3页
py编程基础及导论 1_第4页
py编程基础及导论 1_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AI生成AI生成第7章跨学科编程案例共6个课时

[理论课]L14跨学科案例(素数与概率)教学课题跨学科编程案例——素数探究(判断素数/孪生素数/哥德巴赫猜想)与概率游戏(掷骰子/蒙提霍尔问题)教学对象师范专业本科生(零基础)教学时数2学时(90分钟)对应教材第7章§7.1素数探究、§7.2概率游戏教学目标•掌握素数判断算法,理解优化的数学原理(只需检查到平方根)。•能够用编程验证孪生素数猜想和哥德巴赫猜想。•了解随机数生成,掌握random模块的基本用法。•通过编程模拟概率实验(掷骰子、蒙提霍尔问题),体会蒙特卡洛方法的思想。•感受编程在数学探究中的独特价值——用计算验证猜想。教学重点与难点重点•素数判断函数is_prime(n)的编写与优化。•孪生素数与哥德巴赫猜想的编程验证方法。•random模块:randint()、random()、choice()。•蒙特卡洛模拟的基本思想(大量重复实验统计频率)。•蒙提霍尔问题的编程模拟与直觉纠正。难点•素数判断的优化:为什么只需检查到sqrt(n)。•哥德巴赫猜想的穷举验证逻辑。•蒙提霍尔问题的反直觉结论及其编程验证。•理解"频率趋近概率"的大数定律思想。教学过程

课程导入——编程作为数学探究工具(约5分钟)

回顾前几章学过的数据类型和函数,提出新视角:编程不仅是"计算工具",更是"探究工具"。通过编程可以验证数学猜想、模拟随机实验、可视化数学概念。引出本节课两大主题:素数(数论)和概率(统计),展示数学与编程的深度融合。

素数判断算法(约15分钟)

复习素数定义:大于1的自然数,只有1和它本身两个因数。编写基础版本:foriinrange(2,n):逐一检查。讲解优化原理:若n=a×b且a≤b,则a≤sqrt(n),因此只需检查到sqrt(n)。进一步优化:跳过偶数(除2外偶数都不是素数)。编写优化版is_prime(n)函数。测试验证:输出100以内的所有素数。

孪生素数与素数计数(约10分钟)

介绍孪生素数概念:差为2的素数对(如3和5、11和13)。编程查找指定范围内的孪生素数。统计1000以内的素数个数,与素数定理π(n)≈n/ln(n)对比验证。编写find_twins(limit)函数和count_primes(limit)函数。

哥德巴赫猜想验证(约10分钟)

介绍哥德巴赫猜想:任一大于2的偶数都可以表示为两个素数之和。编程验证:对于给定的偶数,找到所有满足条件的素数对。遍历1000以内所有偶数进行验证(注意:程序能验证,不能证明)。讨论计算验证与数学证明的区别,培养学生的科学思维。

随机数与掷骰子模拟(约15分钟)

介绍random模块:importrandom,random.randint(a,b)、random.random()、random.choice(seq)。模拟掷骰子实验:掷两个骰子10000次,统计各点数之和的频率分布,与理论概率对比。讲解蒙特卡洛方法的思想——用大量随机实验近似计算概率。

蒙提霍尔问题——编程纠正直觉(约25分钟)

介绍蒙提霍尔问题(三门问题):三扇门后有一辆车和两只山羊,选一扇门后主持人打开另一扇有山羊的门,问是否换门。大多数人直觉认为换不换概率一样(50%),但实际换门胜率2/3。详细分析推理过程,然后用编程模拟验证:不换门vs换门,各模拟10000次,统计胜率。结果:不换门约33%,换门约67%。讨论:为什么编程模拟能纠正直觉错误?引出"计算思维"——用计算实验检验假设。

课堂小结(约10分钟)

总结本节课的跨学科融合:编程作为数学探究的工具,验证猜想(素数、哥德巴赫)、模拟实验(概率、蒙特卡洛)。强调"计算思维"的核心:将复杂问题分解、用抽象建模、用自动化验证。预告下节课:凯撒密码与分形图形。

代码示例importrandom

#=====素数部分=====

defis_prime(n):

"""判断n是否为素数(优化版)"""

ifn<2:

returnFalse

ifn==2:

returnTrue

ifn%2==0:

returnFalse

foriinrange(3,int(n**0.5)+1,2):

ifn%i==0:

returnFalse

returnTrue

#输出100以内所有素数

primes=[nforninrange(2,101)ifis_prime(n)]

print(f"100以内素数({len(primes)}个):{primes}")

#孪生素数

twins=[(p,p+2)forpinprimesifis_prime(p+2)]

print(f"孪生素数对:{twins}")

#哥德巴赫猜想验证

defgoldbach(n):

"""验证偶数n能否表示为两个素数之和"""

foriinrange(2,n//2+1):

ifis_prime(i)andis_prime(n-i):

print(f"{n}={i}+{n-i}")

returnTrue

returnFalse

print("验证100以内偶数的哥德巴赫猜想:")

forninrange(4,101,2):

goldbach(n)

#=====概率部分=====

#掷骰子模拟

defroll_dice_simulation(times=10000):

"""模拟掷两个骰子"""

counts={i:0foriinrange(2,13)}

for_inrange(times):

total=random.randint(1,6)+random.randint(1,6)

counts[total]+=1

fors,cincounts.items():

print(f"点数和{s:2d}:{c:5d}次"

f"频率{c/times:.3f}")

roll_dice_simulation()

#蒙提霍尔问题模拟

defmonty_hall(trials=10000,switch=True):

"""模拟蒙提霍尔问题"""

wins=0

for_inrange(trials):

doors=["山羊","山羊","汽车"]

random.shuffle(doors)

choice=random.randint(0,2)#参与者选一扇门

ifswitch:

#换门:选择不是自己最初选的、也不是主持人打开的那扇

remaining=[iforiinrange(3)

ifi!=choiceanddoors[i]!="汽车"]

open_door=remaining[0]

final=[iforiinrange(3)

ifi!=choiceandi!=open_door][0]

else:

final=choice

ifdoors[final]=="汽车":

wins+=1

returnwins/trials

print(f"不换门胜率:{monty_hall(switch=False):.3f}")

print(f"换门胜率:{monty_hall(switch=True):.3f}")课堂练习1.编写函数count_primes(start,end),统计[start,end]范围内的素数个数,并输出最大和最小的素数。2.模拟掷硬币1000次,统计正面和反面出现的次数和频率,观察是否接近50%。3.修改蒙提霍尔模拟:改为4扇门(1辆车、3只山羊),比较换门和不换门的胜率。课后作业1.编写程序:验证10000以内所有偶数的哥德巴赫猜想,输出无法验证的偶数(应该没有)。2.模拟"帕斯卡游戏":掷两枚骰子,如果点数和为7则赢。模拟10000次,统计胜率并与理论概率1/6对比。3.(探究题)梅森素数是形如2^n-1的素数。编写程序找出n在1~20范围内的所有梅森素数。教学反思本节课是"跨学科融合"的典型体现,也是培养学生"计算思维"的重要契机。素数判断的优化过程是很好的算法思维训练。蒙提霍尔问题能极大地激发学生的好奇心——编程模拟的结果与直觉矛盾,这种"认知冲突"是深度学习的催化剂。建议给学生充分的讨论时间,让他们先凭直觉投票,再用程序验证,形成深刻印象。对于师范生,可以引导他们思考如何将这些案例融入中学数学教学。──────────────────────────────────────────────────[理论课]L15跨学科案例(密码与分形)教学课题跨学科编程案例——二进制与进制转换、凯撒密码(加密/解密)、海龟绘图与分形(分形树/科赫雪花)教学对象师范专业本科生(零基础)教学时数2学时(90分钟)对应教材第7章§7.3凯撒密码、§7.4二进制、§7.5探索分形教学目标•理解二进制的基本概念,掌握进制转换方法(十进制↔二进制)。•理解凯撒密码的加密原理,能够编写加密与解密函数。•掌握turtle海龟绘图模块的基本用法。•理解分形的概念,能够用递归+海龟绘图绘制分形树和科赫雪花。•体会编程在信息安全和几何可视化中的魅力。教学重点与难点重点•二进制概念与进制转换(bin()、int(str,2)、手动算法)。•凯撒密码的加密与解密实现。•turtle模块基本命令:forward()、left()、right()、penup()、pendown()。•递归绘制分形的基本思路。难点•小数转二进制的算法。•凯撒密码中字符编码(ord()、chr())与模运算的结合。•分形树和科赫雪花的递归绘图逻辑——每层递归改变参数。•递归深度与绘图效果的关系。教学过程

课程导入——从密码到分形(约5分钟)

展示两张图片:一封加密信件和一张分形雪花。提出问题:计算机如何加密信息?如何绘制如此复杂的图形?引出本节课两大主题:凯撒密码(信息安全)和海龟绘图分形(几何可视化)。先简要过渡二进制——计算机一切数据的基础。

二进制与进制转换(约15分钟)

讲解二进制概念:计算机用0和1表示所有数据。展示十进制数与二进制数的对应关系。讲解进制转换方法:十进制转二进制(除2取余法)、二进制转十进制(按权展开)。Python内置方法:bin(n)、int("1010",2)。编写手动转换函数。简要介绍小数转二进制(乘2取整法)。十六进制hex()的简要提及。

凯撒密码——信息加密(约20分钟)

介绍凯撒密码历史背景:古罗马将军凯撒用于军事通信的加密方法。原理:每个字母向后移动固定位数(如+3:A→D,B→E,...,X→A循环)。讲解关键函数:ord(c)(字符→ASCII码)、chr(n)(ASCII码→字符)、模运算%26(处理字母循环)。编写加密函数caesar_encrypt(text,shift)和解密函数caesar_decrypt(text,shift)。注意只处理字母,保留其他字符不变。演示完整的加密→传输→解密流程。讨论:凯撒密码安全性如何?(只有26种可能,暴力破解很容易)引出现代加密的复杂性。

海龟绘图入门(约10分钟)

介绍turtle模块:Python内置的图形绘制库,模拟一只"海龟"在画布上爬行留下轨迹。基本命令:importturtle、turtle.forward(distance)、turtle.left(angle)、turtle.right(angle)、turtle.penup()、turtle.pendown()、turtle.color("red")、turtle.speed(0)。演示画正方形、正三角形、正五边形(发现规律:for循环+角度变化)。引导学生发现:正n边形的外角=360/n。

分形树——递归+海龟绘图(约15分钟)

介绍分形概念:自相似的结构——局部与整体相似(树枝分叉像整棵树、雪花边像小雪花)。讲解分形树的绘制思路:画一条主干,在末端分出两条较短的分枝(左偏和右偏),对每条分枝重复同样操作(递归)。每层递归:线长减半、角度固定、深度减1。基线条件:深度为0时画一条短线。编写draw_tree(length,depth)函数。运行展示不同递归深度的效果(depth=1~10)。

科赫雪花——分形几何经典(约15分钟)

介绍科赫雪花:将等边三角形的每条边替换为科赫曲线("∧"形折线),对每条新边重复操作。讲解科赫曲线的递归绘制:基线条件(depth=0):画一条直线;递归条件(depth>0):将线段分三等分,画"上凸"折线。编写koch(length,depth)函数。科赫雪花:画三条科赫曲线组成三角形。讨论分形的数学性质:科赫雪花面积有限但周长无限。

课堂小结(约10分钟)

总结三个跨学科案例:二进制(计算机科学基础)、凯撒密码(信息安全+字符串处理)、分形图形(数学+递归+可视化)。强调:这些案例展示了编程连接不同学科的桥梁作用。预告下节课:布朗运动与课程总结。

代码示例#=====二进制部分=====

#十进制转二进制

print(bin(42))#'0b101010'

#二进制转十进制

print(int("101010",2))#42

#手动转换函数

defdec_to_bin(n):

"""十进制转二进制字符串"""

ifn==0:

return"0"

result=""

whilen>0:

result=str(n%2)+result

n=n//2

returnresult

print(dec_to_bin(42))#"101010"

#=====凯撒密码部分=====

defcaesar_encrypt(text,shift):

"""凯撒密码加密"""

result=""

forcharintext:

if'a'<=char<='z':

result+=chr((ord(char)-ord('a')+shift)%26+ord('a'))

elif'A'<=char<='Z':

result+=chr((ord(char)-ord('A')+shift)%26+ord('A'))

else:

result+=char#非字母字符保持不变

returnresult

defcaesar_decrypt(text,shift):

"""凯撒密码解密(加密的逆操作)"""

returncaesar_encrypt(text,-shift)

#演示加密与解密

message="Hello,Python!"

encrypted=caesar_encrypt(message,3)

decrypted=caesar_decrypt(encrypted,3)

print(f"原文:{message}")

print(f"密文:{encrypted}")

print(f"解密:{decrypted}")

#=====海龟绘图部分=====

#画正多边形

importturtle

defdraw_polygon(sides,size=100):

"""画正多边形"""

angle=360/sides

for_inrange(sides):

turtle.forward(size)

turtle.left(angle)

#分形树

defdraw_tree(length,depth):

"""递归绘制分形树"""

ifdepth==0:

turtle.forward(length)

turtle.backward(length)

return

turtle.forward(length)

turtle.left(30)

draw_tree(length*0.7,depth-1)

turtle.right(60)

draw_tree(length*0.7,depth-1)

turtle.left(30)

turtle.backward(length)

#科赫曲线

defkoch(length,depth):

"""递归绘制科赫曲线"""

ifdepth==0:

turtle.forward(length)

else:

koch(length/3,depth-1)

turtle.left(60)

koch(length/3,depth-1)

turtle.right(120)

koch(length/3,depth-1)

turtle.left(60)

koch(length/3,depth-1)

#科赫雪花(三条科赫曲线)

defkoch_snowflake(length,depth):

"""绘制科赫雪花"""

for_inrange(3):

koch(length,depth)

turtle.right(120)课堂练习1.编写函数实现任意进制转换:输入十进制数n和目标进制base(2~16),返回对应进制字符串。2.修改凯撒密码函数,实现"暴力破解":给定一段密文,输出所有26种可能的明文。3.用海龟绘图绘制一个彩色螺旋线(每次前进后转角递增,颜色循环变化)。课后作业1.编写"凯撒密码交互程序":用户可以选择加密或解密,输入文本和偏移量,输出结果。2.用turtle模块绘制一个"谢尔宾斯基三角形"(提示:使用递归,基线条件画实心三角形,递归条件在三条边中点处缩小绘制)。3.(探究题)修改分形树的参数(角度、缩短比例、递归深度),观察不同参数组合的图形效果,保存三种你认为最美的参数组合。教学反思本节课内容丰富多彩,学生兴趣通常很高。凯撒密码建议让学生先手动加密一个单词,再运行程序验证,加深理解。ord()和chr()是新函数,需要重点讲解其配合模运算实现字母循环的巧妙之处。海龟绘图部分建议在课堂上实际运行,让学生看到图形逐步生成的过程,效果非常直观。分形树和科赫雪花的递归绘制逻辑较复杂,建议先用图示分析再编码。可以提醒学生:turtle绘图在JupyterNotebook中可能需要特殊处理(%matplotlibturtle),建议使用standalonePython运行。──────────────────────────────────────────────────[理论课]L16跨学科案例(布朗运动)与课程总结教学课题布朗运动模拟(醉龟漫步/醉龟军团/气体扩散)与全课程总结回顾教学对象师范专业本科生(零基础)教学时数2学时(90分钟)对应教材第7章§7.6布朗运动+全课程总结教学目标•理解布朗运动的物理背景和随机行走(RandomWalk)模型。•掌握用turtle模块模拟随机行走(醉龟漫步)。•能够模拟多粒子随机行走(醉龟军团),观察统计规律。•了解气体扩散模型,理解从微观随机运动到宏观扩散现象的联系。•系统回顾全课程知识体系,形成完整的Python编程知识框架。•明确后续学习方向和Python在实际教育/科研中的应用前景。教学重点与难点重点•随机行走模型的编程实现。•醉龟漫步:单粒子随机行走轨迹的可视化。•醉龟军团:多粒子随机行走的统计特征(距原点距离的平方与步数成正比)。•全课程知识体系的梳理与串联。难点•从单粒子到多粒子的模型扩展。•理解随机性中的统计规律性(大数定律)。•气体扩散模型的简化与模拟。教学过程

课程导入——从微观随机到宏观规律(约5分钟)

回顾上节课的分形图形,引出本节课主题:布朗运动——1827年植物学家布朗观察花粉在水中的无规则运动。看似随机的运动背后,蕴含着深刻的物理规律和数学之美。提出问题:如何用编程模拟这种随机运动?

醉龟漫步——单粒子随机行走(约15分钟)

介绍随机行走(RandomWalk)模型:每一步随机选择一个方向前进固定步长。用海龟绘图模拟:每步随机转角(0°/90°/180°/270°四选一,或任意角度)并前进。编写random_walk(steps)函数。运行展示不同步数(100步、500步、1000步)的轨迹。讨论:轨迹看起来像什么?(自然界中的路径、分子运动轨迹)。计算最终距原点的距离。

醉龟军团——多粒子随机行走(约15分钟)

将单粒子扩展为多粒子:模拟N只"醉龟"各走steps步,记录每只龟最终距原点的距离。统计平均距离。核心发现:平均距离的平方与步数成正比(<r²>=n×step²(2D情况系数调整))。这就是爱因斯坦1905年对布朗运动的数学解释。编写模拟程序,用表格记录实验结果,验证理论预测。讨论:个体随机,群体有规律——这是统计物理的核心思想。

气体扩散模型(约10分钟)

将布朗运动扩展为气体扩散模型:初始时所有粒子集中在中央,经过大量随机行走后,粒子分布趋向均匀。简要讨论扩散方程与随机行走的关系。用代码模拟:N个粒子从原点出发,各走steps步后统计各区域粒子数。展示"从有序到无序"的热力学第二定律的直观演示。

课程总复习——知识体系梳理(约20分钟)

系统回顾全课程知识体系,以思维导图形式展示:

第1-3章:基础篇——变量与数据类型、输入输出、运算符、选择结构(if/elif/else)、循环结构(for/while)。

第4章:进阶篇——嵌套循环、break/continue、循环模式(累加、计数、查找、最大最小值)。

第5章:数据结构篇——列表list(可变有序)、元组tuple(不可变有序)、字典dict(键值对)、字符串str(不可变有序)。

第6章:函数篇——函数定义与调用、形参实参、返回值、递归(阶乘、欧几里得算法、斐波那契)。

第7章:跨学科篇——素数探究、概率模拟、进制转换、凯撒密码、分形图形、布朗运动。

强调核心编程思想:顺序执行、选择判断、循环重复、函数封装、递归分治、数据抽象。

Python学习展望(约15分钟)

介绍Python在以下领域的应用前景:

教育技术:JupyterNotebook交互式教学、自动化批改、数据可视化辅助教学。

数据科学:pandas数据处理、matplotlib/seaborn可视化、统计分析。

人工智能:机器学习(scikit-learn)、深度学习(PyTorch/TensorFlow)。

自动化办公:批量处理文件、自动生成报表、爬取网页数据。

推荐学习资源:官方文档、菜鸟教程、LeetCode刷题、GitHub开源项目。鼓励学生持续学习,将编程融入自己的专业领域。

课程总结与寄语(约10分钟)

回顾本学期的学习历程:从第一节课的"Hello,World!"到今天的布朗运动模拟,同学们已经走过了从零基础到能独立编程的旅程。强调编程能力是师范生未来教学和科研的重要竞争力——能用编程处理教育数据、制作教学资源、开展教育研究。鼓励学生保持好奇心和实践精神,"编程是一项熟能生巧的技能,关键是多动手"。预告期末考试安排和课程设计要求。

代码示例importrandom

importturtle

#=====醉龟漫步=====

defrandom_walk(steps,step_size=20):

"""单粒子随机行走"""

turtle.speed(0)

turtle.penup()

turtle.goto(0,0)

turtle.pendown()

for_inrange(steps):

angle=random.choice([0,90,180,270])

turtle.setheading(angle)

turtle.forward(step_size)

x,y=turtle.position()

return(x**2+y**2)**0.5#返回最终距原点距离

#=====醉龟军团=====

defarmy_walk(num_turtles,steps,step_size=5):

"""多粒子随机行走——不用图形,纯计算"""

distances=[]

for_inrange(num_turtles):

x,y=0,0

for_inrange(steps):

direction=random.choice([(0,1),(0,-1),(1,0),(-1,0)])

x+=direction[0]*step_size

y+=direction[1]*step_size

dist=(x**2+y**2)**0.5

distances.append(dist)

returndistances

#实验验证:距离平方均值与步数成正比

fornin[100,400,900,1600]:

dists=army_walk(500,n,step_size=1)

mean_dist_sq=sum(d**2fordindists)/len(dists)

print(f"步数={n:4d},<r^2>={mean_dist_sq:.1f},比值={mean_dist_sq/n:.3f}")

#=====气体扩散模型=====

defgas_diffusion(num_particles=100,steps=200):

"""模拟气体扩散:统计粒子最终位置分布"""

final_positions=[]

for_inrange(num_particles):

x,y=0,0

for_inrange(steps):

x+=random.randint(-1,1)

y+=random.randint(-1,1)

final_positions.append((x,y))

#统计各区域粒子数

center=sum(1forx,yinfinal_positionsifabs(x)<10andabs(y)<10)

print(f"中心区域粒子数:{center}/{num_particles}")

returnfinal_positions

gas_diffusion()课堂练习1.修改醉龟漫步程序,让海龟每步随机选择0~360°的任意角度前进,观察轨迹形状与四方向版本的差异。2.模拟醉龟军团:让100只龟各走1000步,绘制最终距离的分布直方图(用文本或简单图形表示)。3.编写程序:比较不同步数下气体扩散的最终分布范围,验证"扩散范围与步数平方根成正比"的规律。课后作业1.编写"醉龟漫步"完整程序:用turtle绘制单粒子随机行走1000步的轨迹,并用红色标记起点、绿色标记终点,计算并显示最终距起点距离。2.综合实验:模拟200只醉龟各走不同步数(100、500、1000、2000),绘制"平均距离平方vs步数"的关系图(可用文本输出表格),验证<r²>∝n的规律。3.(课程总结作业)撰写一份500字的Python学习心得,内容包括:本学期最大的收获、遇到的最大困难及如何克服、对未来学习Python的规划。教学反思布朗运动是本课程最后一个跨学科案例,也是最能体现"编程作为科学探究工具"的案例。醉龟漫步的可视化效果直观有趣,能有效激发学生兴趣。醉龟军团的统计验证实验非常重要——它让学生亲身体验"从微观随机到宏观规律"的科学方法论,这是计算思维的核心。课程总结环节建议采用思维导图,帮助学生建立知识体系。作为本学期最后一节理论课,应营造积极向上的氛围,肯定学生的进步,激发持续学习的动力。可以展示一些优秀的往届学生作品或Python应用案例,让学生看到编程的广阔前景。──────────────────────────────────────────────────[实践课]P14素数探究与概率模拟实践课题素数判断、哥德巴赫猜想验证与蒙提霍尔问题模拟教学对象师范专业本科生(零基础)教学时数2学时(90分钟)实践环境计算机机房,预装Python3.x实践目标•掌握素数判断的优化算法(从试除法到改进方法)•理解哥德巴赫猜想的数学内容,能用程序验证其特定范围•理解蒙特卡洛模拟的基本思想,能用随机数解决概率问题•能够编程模拟蒙提霍尔(三门问题)并验证理论概率•体验数学与编程结合的乐趣,培养计算思维实践内容与步骤

知识回顾与数学导入(约10分钟)

教师简要回顾素数的定义和判断方法,介绍哥德巴赫猜想(任一大于2的偶数都可以写成两个素数之和)和蒙提霍尔问题(三门问题)的背景。讨论"计算机如何帮助验证数学猜想"和"用模拟方法研究概率"的思路。学生创建文件practice_p14.py。

素数判断与素数表生成(约20分钟)

编写is_prime(n)函数,从朴素试除法(检查2到n-1)到优化版(检查2到sqrt(n));编写prime_sieve(limit)函数,使用埃拉托斯特尼筛法生成小于limit的所有素数列表;测试找出1000以内的所有素数,统计个数。比较两种方法的运行效率。

哥德巴赫猜想验证(约20分钟)

编写goldbach(n)函数:给定一个大于2的偶数n,找出两个素数p和q使得p+q=n。策略:从2开始遍历,如果i和n-i都是素数则找到答案。编写验证程序:验证4到100之间的所有偶数是否都满足哥德巴赫猜想。如果某个偶数无法表示为两个素数之和,输出"发现反例"。记录验证结果。

蒙提霍尔问题模拟(约20分钟)

教师先通过理论分析,讲解"换门"和"不换门"的胜率分别是2/3和1/3。然后编写模拟程序:monty_hall_trial(switch=True)模拟一次游戏过程(随机选择门、主持人打开一个空门、根据策略决定是否换门、判断是否赢得奖品)。编写主程序重复模拟10000次,分别统计"换门"和"不换门"的胜率。用random.randint()或random.choice()生成随机选择。

概率模拟拓展(约10分钟)

编写一个简单的概率模拟:estimate_pi(trials)——用蒙特卡洛方法估算圆周率pi。思路:在单位正方形内随机撒点,统计落在内切圆中的比例,pi约等于4*(圆内点数/总点数)。使用random.random()生成0-1之间的随机坐标。测试不同试验次数(100,1000,10000,100000)下估算精度的变化。

任务完成与展示总结(约10分钟)

学生完成实践任务书中的综合任务。教师总结:数学问题如何转化为编程问题、随机模拟方法的原理和局限性。讨论:计算机验证能否代替数学证明?展示模拟结果,对比理论值。

实践任务书

任务:数学探索程序——素数与概率

请编写一个Python程序,完成以下数学探索任务:

1.使用埃拉托斯特尼筛法生成500以内的素数表,输出素数个数和前20个素数。

2.验证哥德巴赫猜想:对4到200之间的所有偶数,找出至少一组素数分解(p+q=n),全部验证通过则输出"哥德巴赫猜想在4~200范围内成立"。

3.模拟蒙提霍尔问题:各进行10000次"换门"和"不换门"游戏,输出两种策略的胜率(保留4位小数)。

4.蒙特卡洛法估算圆周率:分别用1000、10000、100000次试验估算pi值,输出估算值与真实值的误差百分比。

要求:

-需要导入random模块和math模块。

-每个任务之间用分隔线隔开,输出格式清晰。

-模拟部分使用random.seed(42)设置随机种子以保证结果可复现。

参考代码#P14实践课-数学探索程序

importrandom

importmath

random.seed(42)

print("===数学探索程序===")

print("---分隔线---")

#1.埃拉托斯特尼筛法

defprime_sieve(limit):

"""筛法生成小于limit的所有素数"""

is_prime=[True]*(limit+1)

is_prime[0]=is_prime[1]=False

foriinrange(2,int(limit**0.5)+1):

ifis_prime[i]:

forjinrange(i*i,limit+1,i):

is_prime[j]=False

return[iforiinrange(limit+1)ifis_prime[i]]

primes=prime_sieve(500)

print(f"500以内素数个数:{len(primes)}")

print(f"前20个素数:{primes[:20]}")

print("---分隔线---")

#2.哥德巴赫猜想验证

defis_prime(n):

ifn<2:returnFalse

foriinrange(2,int(n**0.5)+1):

ifn%i==0:returnFalse

returnTrue

all_pass=True

forninrange(4,201,2):

found=False

forpinrange(2,n//2+1):

ifis_prime(p)andis_prime(n-p):

found=True

break

ifnotfound:

print(f"反例:{n}无法分解为两个素数之和")

all_pass=False

ifall_pass:

print("哥德巴赫猜想在4~200范围内成立")

print("---分隔线---")

#3.蒙提霍尔问题模拟

defmonty_hall_trial(switch):

"""模拟一次蒙提霍尔游戏"""

doors=[0,0,1]#两个山羊(0),一个汽车(1)

random.shuffle(doors)

choice=random.randint(0,2)#参与者选择

#主持人打开一个空门

available=[iforiinrange(3)

ifi!=choiceanddoors[i]==0]

opened=random.choice(available)

ifswitch:

final=[3-choice-opened]#换到剩下那扇门

returndoors[final[0]]==1

else:

returndoors[choice]==1

N=10000

win_switch=sum(monty_hall_trial(True)for_inrange(N))

win_stay=sum(monty_hall_trial(False)for_inrange(N))

print(f"换门胜率:{win_switch/N:.4f}(理论值:0.6667)")

print(f"不换门胜率:{win_stay/N:.4f}(理论值:0.3333)")

print("---分隔线---")

#4.蒙特卡洛法估算圆周率

fortrialsin[1000,10000,100000]:

inside=sum(1for_inrange(trials)

ifrandom.random()**2+random.random()**2<=1)

pi_est=4*inside/trials

error=abs(pi_est-math.pi)/math.pi*100

print(f"试验{trials:>6}次:pi={pi_est:.6f},"

f"误差={error:.4f}%")评价标准评价维度优秀(90-100)良好(75-89)合格(60-74)筛法实现正确实现筛法,效率优化到位能实现筛法或优化试除法能用基本试除法生成素数哥德巴赫验证验证逻辑正确,能处理所有偶数验证逻辑基本正确能对部分偶数进行验证蒙提霍尔模拟游戏逻辑完整,两种策略均正确至少一种策略模拟正确能完成基本模拟框架蒙特卡洛估算估算值接近理论值,误差分析到位能完成基本估算能运行模拟程序代码规范结构清晰,注释完整,输出格式规范有注释,结构合理代码可运行拓展挑战

挑战任务:(1)将哥德巴赫验证扩展到更大的范围(如4~1000),并找出每个偶数有多少种不同的素数分解方式,统计分解方式最多的偶数。(2)将蒙提霍尔问题推广到"四门问题"(4扇门中1扇有奖品),分析换门和不换门的胜率各是多少,用模拟验证。

──────────────────────────────────────────────────[实践课]P15凯撒密码与海龟绘图实践课题二进制转换、凯撒密码加密解密与turtle分形树绘制教学对象师范专业本科生(零基础)教学时数2学时(90分钟)实践环境计算机机房,预装Python3.x实践目标•掌握十进制与二进制的相互转换算法•理解凯撒密码的加密原理,能编写加密和解密程序•掌握Pythonturtle模块的基本用法(前进、转向、画笔控制等)•能够使用递归和turtle模块绘制分形树等图形•体验编程在密码学和计算机图形学中的应用实践内容与步骤

知识回顾与导入(约5分钟)

教师简要回顾二进制、编码和turtle绘图的基础知识。介绍本节课的三个主题:进制转换、凯撒密码、分形绘图。学生创建文件practice_p15.py。

十进制与二进制转换(约15分钟)

手动实现进制转换函数:

(1)dec_to_bin(n)——将十进制正整数转换为二进制字符串(用"除2取余"法)。

(2)bin_to_dec(s)——将二进制字符串转换为十进制整数(用"按权展开"法)。

与Python内置函数bin()和int(s,2)的结果进行对比验证。

拓展:尝试实现dec_to_base(n,base)函数,支持转换为任意进制(2-16)。

凯撒密码实现(约20分钟)

编写caesar_encrypt(text,shift)函数:对英文字母进行移位加密,保持大小写,非字母字符不变。例如"Hello,World!"shift=3变为"Khoor,Zruog!"。编写caesar_decrypt(text,shift)函数:实现解密(移位取反)。编写caesar_brute_force(ciphertext)函数:暴力破解凯撒密码,输出所有25种可能的解密结果。测试加密和解密的正确性。

turtle基础绘图练习(约15分钟)

导入turtle模块,练习基本命令:forward()、backward()、left()、right()、penup()、pendown()、pencolor()、pensize()、speed()。绘制一个正方形和一个等边三角形。用循环绘制一个正六边形和一个由多个正方形组成的旋转图案。

递归分形树绘制(约25分钟)

编写draw_tree(t,length,depth)递归函数:绘制分形树。每次递归调用画一条线段,然后向左右各画一条较短的分支(缩短比例约0.7,角度约30度)。递归深度控制分支层数,depth=0时停止。通过改变颜色(根据深度从棕色渐变到绿色)和线宽(根据深度递减)使树更美观。教师展示不同深度(6-10层)的效果。

任务完成与展示总结(约10分钟)

学生完成实践任务书中的综合任务。教师展示优秀的分形树作品和凯撒密码程序。总结:进制转换的数学原理、凯撒密码在现代密码学中的地位、分形在自然界中的体现。

实践任务书

任务:密码与图形综合程序

请编写一个Python程序,完成以下三个模块:

模块一:进制转换器

1.实现dec_to_bin(n)和bin_to_dec(s)两个函数。

2.测试:将0~31的十进制数转为二进制并格式化输出(占8位,不足补0)。

模块二:凯撒密码工具

3.实现加密、解密和暴力破解三个函数。

4.加密一段英文文本(shift=5),再解密还原,验证正确性。

5.给定一段密文,用暴力破解列出所有可能的明文。

模块三:turtle分形树

6.使用递归绘制一棵深度为8的分形树,树枝颜色从棕色渐变到绿色,粗细随深度递减。

要求:

-turtle绘图部分放在if__name__=="__main__"的条件块中,避免导入时自动绘图。

-凯撒密码只处理英文字母,其他字符保持不变。

-输出格式清晰,模块之间有明确分隔。

参考代码#P15实践课-密码与图形综合程序

importturtle

#=====模块一:进制转换器=====

defdec_to_bin(n):

"""十进制转二进制字符串"""

ifn==0:

return"0"

result=""

whilen>0:

result=str(n%2)+result

n=n//2

returnresult

defbin_to_dec(s):

"""二进制字符串转十进制整数"""

returnsum(int(ch)*(2**i)

fori,chinenumerate(reversed(s)))

print("===进制转换:0~31===")

forninrange(32):

b=dec_to_bin(n).zfill(8)

print(f"{n:>2}->{b}")

print("---分隔线---")

#=====模块二:凯撒密码工具=====

defcaesar_encrypt(text,shift):

"""凯撒密码加密"""

result=[]

forchintext:

ifch.isupper():

result.append(chr((ord(ch)-65+shift)%26+65))

elifch.islower():

result.append(chr((ord(ch)-97+shift)%26+97))

else:

result.append(ch)

return"".join(result)

defcaesar_decrypt(text,shift):

"""凯撒密码解密"""

returncaesar_encrypt(text,-shift)

defcaesar_brute_force(ciphertext):

"""暴力破解凯撒密码"""

forshiftinrange(1,26):

print(f"shift={shift:>2}:{caesar_decrypt(ciphertext,shift)}")

original="Hello,PythonProgramming!"

encrypted=caesar_encrypt(original,5)

decrypted=caesar_decrypt(encrypted,5)

print("===凯撒密码工具===")

print(f"原文:{original}")

print(f"加密(shift=5):{encrypted}")

print(f"解密:{decrypted}")

print(f"验证:{'正确'ifdecrypted==originalelse'错误'}")

print("---暴力破解---")

caesar_brute_force(encrypted)

print("---分隔线---")

#=====模块三:turtle分形树=====

if__name__=="__main__":

defdraw_tree(t,length,depth):

"""递归绘制分形树"""

ifdepth==0:

return

#颜色从棕色过渡到绿色

ratio=depth/8

r=int(139*ratio+34*(1-ratio))

g=int(69*ratio+139*(1-ratio))

b=int(19*ratio+34*(1-ratio))

t.pencolor(r,g,b)

t.pensize(max(1,depth))

t.forward(length)

t.left(30)

draw_tree(t,length*0.7,depth-1)

t.right(60)

draw_tree(t,length*0.7,depth-1)

t.left(30)

t.backward(length)

screen=turtle.Screen()

screen.setup(800,600)

t=turtle.Turtle()

t.speed(0)

t.left(90)

t.penup()

t.goto(0,-250)

t.pendown()

draw_tree(t,120,8)

turtle.done()评价标准评价维度优秀(90-100)良好(75-89)合格(60-74)进制转换算法正确,能处理边界(0和负数),格式化输出算法正确,基本功能完成能实现基本转换凯撒密码加密解密暴力破解全部正确,大小写处理完善加密解密正确加密功能基本正确turtle绘图分形树递归正确,颜色渐变,图形美观分形树基本正确能绘制基本图形递归绘图递归逻辑清晰,参数调节合理能用递归绘图能模仿模板绘制代码规范三个模块结构清晰,if__name__使用正确有基本结构代码可运行拓展挑战

挑战任务:(1)改进凯撒密码为Vigenere密码(维吉尼亚密码),使用一个关键词进行多表加密,并实现解密功能。(2)在分形树基础上,尝试绘制科赫雪花(KochSnowflake)——将等边三角形的每条边进行递归分形。提示:每次递归将一条线段等分为三段,中间一段替换为等边三角形的两条边(不画底边)。

──────────────────────────────────────────────────[实践课]P16期末综合项目实践课题综合项目开发(学生自选主题)教学对象师范专业本科生(零基础)教学时数2学时(90分钟)实践环境计算机机房,预装Python3.x实践目标•综合运用本学期所学全部Python知识(变量、数据类型、控制结构、函数、递归等)•培养独立分析问题、设计方案、编写代码的能力•体验完整的软件开发流程:需求分析、设计、编码、测试•能够将实际问题抽象为计算模型并用程序求解•养成规范的编程习惯:代码注释、函数封装、模块化设计实践内容与步骤

项目说明与选题指导(约15分钟)

教师介绍期末综合项目的要求、评价标准和提交方式。详细讲解4个可选项目主题(见任务书),分析每个主题涉及的知识点和难度等级。学生根据自身兴趣和能力选择项目主题。教师鼓励学生选择有一定挑战性的项目,同时提醒量力而行。学生创建项目文件夹,规划文件结构。

需求分析与设计(约15分钟)

学生针对所选项目,完成需求分析:明确程序需要实现哪些功能、输入什么数据、输出什么结果。绘制简单的程序流程图或功能结构图。确定函数划分:每个功能封装为一个或多个函数,明确函数名、参数和返回值。教师巡视指导,帮助学生理清思路。

核心功能编码(约30分钟)

学生开始编码实现。建议步骤:先搭建程序框架(函数定义但暂不实现,用pass占位);然后逐个实现函数并单独测试;最后组装为完整程序。教师巡视指导,解答疑问。重点帮助学生:函数设计是否合理、数据结构选择是否恰当、边界情况是否考虑。

测试与调试(约15分钟)

学生对自己编写的程序进行全面测试:正常输入测试、边界情况测试、异常输入测试。发现bug后使用print语句或简单的断点调试。教师提供调试思路指导:如何缩小问题范围、如何用小数据集验证逻辑。

代码完善与文档撰写(约10分钟)

完善代码注释:为每个函数添加docstring,关键步骤添加行内注释。美化输出格式。整理项目文件结构。在文件开头添加项目说明(项目名称、作者、功能简介、使用方法)。

项目展示与总结(约5分钟)

教师选取3-4个具有代表性的项目进行快速展示(屏幕投影)。总结本学期课程的学习成果,鼓励学生继续深入学习Python。说明课后项目完善和提交要求(一周内提交完整代码)。

实践任务书

任务:期末综合项目(四选一)

请从以下四个项目主题中选择一个,独立完成开发。项目需综合运用本学期所学知识,体现完整的程序设计思路。

项目A:个人通讯录管理系统

用字典和列表实现一个命令行通讯录程序,功能包括:添加联系人(姓名、电话、邮箱、分组)、删除联系人、按姓名/电话搜索、按分组筛选、修改联系人信息、导入/导出数据(文本文件格式)、生日提醒(距生日天数)。至少使用5个自定义函数。

项目B:随机数学练习生成器

编写一个面向小学生的数学练习生成和批改系统,功能包括:随机生成加减乘除算术题(可调节数值范围和题目数量)、自动计算答案并批改、统计正确率和用时、错题收集与重做、保存练习记录到文件。至少使用4个自定义函数,运用字符串格式化美化输出。

项目C:数据分析小工具

编写一个文本数据分析工具,功能包括:从文件中读取数据(模拟数据可用列表定义)、计算基本统计量(均值、中位数、标准差)、数据筛选(条件过滤)、数据排序、生成简单的文本图表(如柱状图用字符*表示)、导出分析报告到文件。至少使用5个自定义函数。

项目D:图形创意工作室

使用turtle模块编写一个图形创作程序,功能包括:交互式选择绘制图案(正多边形、星形、螺旋线、分形树等,至少4种)、用户可自定义参数(边数、大小、颜色、层数等)、绘制过程有动画效果、保存作品为图片(使用getcanvas().postscript())。至少使用4个自定义函数,至少包含一个递归绘图。

通用要求:

-代码总量不少于100行(不含空行和纯注释行)。

-每个函数必须有docstring文档字符串。

-程序要有完整的主入口(if__name__=="__main__")。

-使用本课程所学的知识,不得使用超出课程范围的第三方库(turtle和标准库除外)。

-代码有详细的中文注释,输出格式美观清晰。

参考代码(以项目A为例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论