带刷新的时间倒计时效果,这个在思考过程中我自己能够明白该如何操作,但是不会写代码,所以查了一下。从下面链接的代码中学习到了reversed函数,该函数对于给定的序列(包括列表、元组、字符串以及 range(n) 区间),该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)。range(5)等价于range(0, 5)但是不包含5.
#QiDuanShuMaGuan.py
import turtle
def drawGap(): #设置每条线之间的间隔
turtle.penup() #画笔抬起
turtle.fd(5)
def drawLine(draw): #绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup() #根据参数draw判断画笔是放下还是抬起
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDights(dight): #根据数字绘制七段数码管
drawLine(True) if dight in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 6, 8] else drawLine(False)
turtle.left(90)
drawLine(True) if dight in [0, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if dight in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(15) #每个绘制的七段数码管之间的距离
def drawDate(date):
turtle.pencolor("red")
for i in reversed(range(date+1)): #reversed对于给定的序列(包括列表、元组、字符串以及 range(n) 区间),该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)。
num = str(i)
for n in num:
drawDights(eval(n)) #使用eval()函数去掉参数的外层引号
turtle.clear() #清空已经绘制的七段数码管,为下次绘制做好准备
s = len(num) #求num的长度,若输入为2位以上的数,则len(num)发生变化,不再是1
turtle.fd(-65*s) #回退到起始位置,每绘制一个七段数码管40,数码管间的间隔是15,drawGap前后各一个,是10,因此回退到起始位置需要-65
def main():
turtle.setup(500, 350, 20, 20) #设置窗口大小以及相对屏幕的位置
turtle.hideturtle() #隐藏画笔
temp = input("请设置倒计时时间:")
sp = input("请设置绘制速度大小:")
turtle.speed(eval(sp)) #设置绘制速度
turtle.penup()
turtle.fd(-200) #画笔默认在窗口中心,此处使画笔回退200个像素点
turtle.pensize(5)
drawDate(eval(temp))
print("倒计时结束".center(40//2, "-"))
turtle.done() #程序运行后不会立即退出
main()
https://blog.csdn.net/weixin_42927372/article/details/100181848
绘制高级的数码管
5.3代码复用与函数递归
5.3.1.代码复用与模块化设计
- 把代码当成资源进行抽象
- 模块化设计:紧耦合 松耦合两种模式
——紧耦合:两个部分之间交流很多,无法独立存在
——松耦合:两个部分之间交流较少,可以独立存在
模块内部紧耦合、模块之间松耦合
5.3.2.函数递归的理解
- 递归的关键特征:链条和基例
链条:计算过程存在递归链条,例如求n的阶乘公式,n!= n(n-1)!,n与(n-1)!构成链条
基例:存在一个或多个不需要再次递归的基例,例如0!=1是基例
二者缺一不可。 - 数学归纳法就是对递归的使用,递归是数学归纳法的思维在编程中的体现。
5.3.3函数递归调用过程
- 递归的实现
函数 + 分支语句
——递归本身是一个函数,需要函数定义方式描述
——函数内部,采用分支语句对输入参数进行判断,哪些是基例,哪些是链条
——基例和链条,分别编写对应代码 - 函数定义理解为模板,计算机对每一个赋予的参数运算时,会将函数的模板拷贝一份用实际参数区运算。
5.3.4.函数递归实例解析
- 将字符串s反转后输出
>>>s[::-1]
对字符串s从最开始到最后采用-1的步长输出,-1的步长就是指从后往前输出。
递归方式。
def rvs(s):
if s == "":
return s
else:
return rvs(s[1:])+s[0]
- 斐波那契数列
def f(n):
if n == 1 or n == 2:
return 1:
else:
return f(n-1) + f(n-2)
- 汉诺塔问题
count = 0
def hanoi(n,src,dst,mid): #src为原柱子,dst目标柱子,mid为中间柱子
global count #声明count为全局变量
if n == 1: #打印一个步骤,n=1为基例
print("{}:{}->{}".format(1,src,dst))
count += 1
else: #将n-1个圆盘移动到目标柱子,将最后第n个圆盘移动到目标柱子,最后再将n-1个圆盘移动到目标柱子。
hanoi(n-1,src,mid,dst) #将n-1个圆盘搬到中间柱子,目标柱子作为过渡
print("{}:{}->{}".format(n,src,dst))
count += 1
hanoi(n-1, mid, dst, src)#将n-1个圆盘从中间柱子上移动到目标柱子,原柱子作为过渡
5.4模块4:PyInstaller库的使用
-
将.py源代码转换成无需源代码的可执行文件
-
PyInstaller库是第三方库,使用前需要额外安装;IDLE不能安装,命令行模式下才能够安装。官方网站:http://www.pyinstaller.org;安装第三方库需要使用pip工具。pip install pyinstaller(命令行模式下输入该命令安装pyinstaller)
安装成功,如下图:
-
(cmd命令行) pyinstaller -F <文件名.py> 将文件转成.exe的可执行文件
-
Pyinstaller库的常用参数
参数 | 描述 |
---|---|
-h | 查看帮助 |
- -clean | 清理打包过程中的临时文件 |
-D,- -onedir | 默认值,生成dist文件夹,j尽量不要使用 |
-F, - -onefile | 在dist文件夹中只生成独立的打包文件 |
-i <图标文件名.ico> | 指定打包程序使用的图标(icon)文件 |
例如:pyinstaller -i curve.ico -F SevenDigitsDrawV2.py
执行exe文件时不需要安装Python环境及Pyinstaller
5.5科特雪花小实例
import turtle
def koch(size, n): #size指绘制的长度,n为绘制的阶数
if n == 0:
turtle.fd(size)
else:
for angle in [0,60, -120, 60]:
turtle.left(angle)
koch(size/3, n-1)
def main():
turtle.setup(800,400)#设置窗体大小
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
level = 3 #3阶科赫雪花,阶数
koch(400, level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
main()
cmd下可以通过一下代码将生成的可执行文件图标换成curve.ico的图标形状。
pyinstaller -i curve.ico -F KochDrawV1.py
绘制条件扩展
——修改分形几何绘制阶数
——修改科赫曲线的基本定义及旋转角度
——修改绘制科赫雪花的基础框架图形