函数和代码复用2

带刷新的时间倒计时效果,这个在思考过程中我自己能够明白该如何操作,但是不会写代码,所以查了一下。从下面链接的代码中学习到了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.代码复用与模块化设计

  1. 把代码当成资源进行抽象
  2. 模块化设计:紧耦合 松耦合两种模式
    ——紧耦合:两个部分之间交流很多,无法独立存在
    ——松耦合:两个部分之间交流较少,可以独立存在
    模块内部紧耦合、模块之间松耦合

5.3.2.函数递归的理解

  1. 递归的关键特征:链条和基例
    链条:计算过程存在递归链条,例如求n的阶乘公式,n!= n(n-1)!,n与(n-1)!构成链条
    基例:存在一个或多个不需要再次递归的基例,例如0!=1是基例
    二者缺一不可。
  2. 数学归纳法就是对递归的使用,递归是数学归纳法的思维在编程中的体现。

5.3.3函数递归调用过程

  1. 递归的实现
    函数 + 分支语句
    ——递归本身是一个函数,需要函数定义方式描述
    ——函数内部,采用分支语句对输入参数进行判断,哪些是基例,哪些是链条
    ——基例和链条,分别编写对应代码
  2. 函数定义理解为模板,计算机对每一个赋予的参数运算时,会将函数的模板拷贝一份用实际参数区运算。

5.3.4.函数递归实例解析

  1. 将字符串s反转后输出
    >>>s[::-1] 对字符串s从最开始到最后采用-1的步长输出,-1的步长就是指从后往前输出。
    递归方式。
def rvs(s):
  if s == "":
  	return s
  else:
  	return rvs(s[1:])+s[0]
  1. 斐波那契数列
def f(n):
	if n == 1 or n == 2:
		return 1:
	else:
		return f(n-1) + f(n-2)
  1. 汉诺塔问题
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库的使用

  1. 将.py源代码转换成无需源代码的可执行文件

  2. PyInstaller库是第三方库,使用前需要额外安装;IDLE不能安装,命令行模式下才能够安装。官方网站:http://www.pyinstaller.org;安装第三方库需要使用pip工具。pip install pyinstaller(命令行模式下输入该命令安装pyinstaller)
    安装成功,如下图:
    在这里插入图片描述

  3. (cmd命令行) pyinstaller -F <文件名.py> 将文件转成.exe的可执行文件

  4. 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

绘制条件扩展
——修改分形几何绘制阶数
——修改科赫曲线的基本定义及旋转角度
——修改绘制科赫雪花的基础框架图形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值