文章原创,最近更新:2018-04-19
1.辅学内容
2.函数的定义与使用
3.实例7:七段数码管绘制
4.4.代码复用与函数递归
5.模块4:PyInstaller库的使用
6.实例8:科赫雪花小包裹
7.所有的代码汇总
原链接 语言程序设计北京理工大学
1.辅学内容
1.1前课复习
![](https://img.haomeiwen.com/i9945523/6faeebcf89fb3979.png)
![](https://img.haomeiwen.com/i9945523/799654d0721f01bc.png)
![](https://img.haomeiwen.com/i9945523/940517ca08346f2e.png)
![](https://img.haomeiwen.com/i9945523/67a6f33a435fff70.png)
![](https://img.haomeiwen.com/i9945523/fd21385047a07735.png)
![](https://img.haomeiwen.com/i9945523/891c0d19da560b5a.png)
![](https://img.haomeiwen.com/i9945523/030d62a67c39c0b4.png)
![](https://img.haomeiwen.com/i9945523/83522cc9b66bb493.png)
![](https://img.haomeiwen.com/i9945523/2b9c789435c46017.png)
1.2本课概要
![](https://img.haomeiwen.com/i9945523/d0451e4ce9c8b5b4.png)
![](https://img.haomeiwen.com/i9945523/7aa00ce3e6228044.png)
1.3练习与作业
![](https://img.haomeiwen.com/i9945523/bc0e49139ba809f0.png)
2.函数的定义与使用
2.1单元开篇
![](https://img.haomeiwen.com/i9945523/b90745f82e2cd969.png)
2.2函数的理解和定义
![](https://img.haomeiwen.com/i9945523/6b6c0ea96b061ff1.png)
![](https://img.haomeiwen.com/i9945523/61f14fb5df32c94f.png)
![](https://img.haomeiwen.com/i9945523/ae2314958feefb26.png)
![](https://img.haomeiwen.com/i9945523/32863e169ca21f38.png)
![](https://img.haomeiwen.com/i9945523/cc76be3d43642f8f.png)
2.3函数的使用及调用过程
![](https://img.haomeiwen.com/i9945523/e7c9974a54f9ec60.png)
![](https://img.haomeiwen.com/i9945523/c262afe8ff981d7a.png)
2.4函数的参数传递
![](https://img.haomeiwen.com/i9945523/2a740754d114e1a3.png)
![](https://img.haomeiwen.com/i9945523/6a2ee9fc9e9b8fed.png)
![](https://img.haomeiwen.com/i9945523/9f5d64e5e5d32874.png)
![](https://img.haomeiwen.com/i9945523/0293262c1a251e17.png)
![](https://img.haomeiwen.com/i9945523/66a63830194b8b98.png)
![](https://img.haomeiwen.com/i9945523/03eccc10b8736c71.png)
2.5函数的返回值
![](https://img.haomeiwen.com/i9945523/4cc4204c73cd0d06.png)
![](https://img.haomeiwen.com/i9945523/c7dc06aa6471ac17.png)
2.6局部变量和全局变量
![](https://img.haomeiwen.com/i9945523/df0d2b48f3fb83d2.png)
![](https://img.haomeiwen.com/i9945523/3fc3bf2095a30a26.png)
![](https://img.haomeiwen.com/i9945523/2e4a2c324a975c05.png)
![](https://img.haomeiwen.com/i9945523/a4b2c02395c38edb.png)
![](https://img.haomeiwen.com/i9945523/9ae5283a41ceee7d.png)
![](https://img.haomeiwen.com/i9945523/af3c7800f1ceda5b.png)
![](https://img.haomeiwen.com/i9945523/fa69013a535cb273.png)
![](https://img.haomeiwen.com/i9945523/cf1adc293d99235f.png)
2.7lambda函数
![](https://img.haomeiwen.com/i9945523/93e336f8770b6833.png)
![](https://img.haomeiwen.com/i9945523/9ca8d7613baf3207.png)
![](https://img.haomeiwen.com/i9945523/29124c1033d3c058.png)
![](https://img.haomeiwen.com/i9945523/ca40c378d002267d.png)
2.8单元小结
![](https://img.haomeiwen.com/i9945523/a26eac44104038ec.png)
3.实例7:七段数码管绘制
3.1"七段数码管绘制"问题分析
![](https://img.haomeiwen.com/i9945523/d0a4e9a9d0eac9aa.png)
![](https://img.haomeiwen.com/i9945523/8f598b738f914694.png)
![](https://img.haomeiwen.com/i9945523/0bdb751292cae1ca.png)
3.2"七段数码管绘制"实例讲解(上)
![](https://img.haomeiwen.com/i9945523/4bba9ccb923854d8.png)
![](https://img.haomeiwen.com/i9945523/ce569d14e5c9fe81.png)
![](https://img.haomeiwen.com/i9945523/b9d3d0afb6e646fc.png)
-
drawLine()函数决定了自定义函数是否,画笔落下还是飞过.如果是落下(True),则向前走40,然后向右转.如果是飞过去(False),只是无痕迹,但会向右转40.
True显示的结果:
False显示的结果:
-
drawDigit()函数分析
a、一个数字可以分别拆分为7段划线,分别为1、2、3、4、5、6、7段划线。以下所有的数字均按1-7段划线的顺序进行画图,比如0由2、3、4、5、6、7段划线组成。
![](https://img.haomeiwen.com/i9945523/649ad53f7b630d11.png)
b、第一段数字
drawLine(True) if digit in [2,3,4,5,6,7,8,9] else drawLine(False),是第1段划线,通过以上截图,可以观察得出0-9与之相关的数字有2,3,4,5,6,7,8,9。
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False) ,是第2段,通过以上截图,可以观察得出0-9与之相关的数字有0,1,3,4,5,6,7,8,9。
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False),是第3段,通过以上截图,可以观察得出0-9与之相关的数字有0,2,3,5,6,8,9。
drawLine(True) if digit in [0,2,6,8] else drawLine(False),是第4段,通过以上截图,可以观察得出0-9与之相关的数字有0,2,6,8。
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False),是第5段,通过以上截图,可以观察得出0-9与之相关的数字有0,4,5,6,8,9。
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False),是第6段,通过以上截图,可以观察得出0-9与之相关的数字有0,2,3,5,6,7,8,9。
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False),是第6段,通过以上截图,可以观察得出0-9与之相关的数字有0,1,2,3,4,7,8,9。
turtle.left(180),是逆时针旋转180.旋转之前是箭头在1段与2段的交界点,箭头方向是指向起点.
turtle.penup()
turtle.fd(20)
![](https://img.haomeiwen.com/i9945523/5d73379b44151e16.png)
import turtle
def drawLine(draw):
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawDigit(digit):
drawLine(True) if digit in [2,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date):
for i in date:
drawDigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate("20181010")
turtle.hideturtle()
turtle.done()
main()
3.2"七段数码管绘制"实例讲解(下)
![](https://img.haomeiwen.com/i9945523/9b2a12ea5f60294f.png)
![](https://img.haomeiwen.com/i9945523/8517e3833b158570.png)
![](https://img.haomeiwen.com/i9945523/8c59e38b7e0023ad.png)
![](https://img.haomeiwen.com/i9945523/ddcadf3b9dc2b03b.png)
![](https://img.haomeiwen.com/i9945523/093730a9dfb69e9a.png)
![](https://img.haomeiwen.com/i9945523/16805e35104de834.png)
![](https://img.haomeiwen.com/i9945523/41291720b24ddf04.png)
import turtle
import time
def drawGap():
turtle.penup()
turtle.fd(5)
def drawLine(draw):
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(digit):
drawLine(True) if digit in [2,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date):
turtle.pencolor("red")
for i in date:
if i =="-":
turtle.write("年",font=("Arial",18,"normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i =="=":
turtle.write("月",font=("Arial",18,"normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i =="+":
turtle.write("日",font=("Arial",18,"normal"))
else:
drawDigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate(time.strftime("%Y-%m=%d+",time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
3.3"七段数码管绘制"举一反三
![](https://img.haomeiwen.com/i9945523/2f7b85631cf14128.png)
![](https://img.haomeiwen.com/i9945523/eb35c765ae06d7ee.png)
![](https://img.haomeiwen.com/i9945523/a38414b10c283e29.png)
4.代码复用与函数递归
4.1单元开篇
![](https://img.haomeiwen.com/i9945523/47b71fa17dcbecb5.png)
4.2代码复用与模块化设计
![](https://img.haomeiwen.com/i9945523/0abf76cb6a7f9e1b.png)
![](https://img.haomeiwen.com/i9945523/92574b2f0f365238.png)
![](https://img.haomeiwen.com/i9945523/54029d6435488b2f.png)
![](https://img.haomeiwen.com/i9945523/8d94a5345f409344.png)
4.3函数递归的理解
![](https://img.haomeiwen.com/i9945523/32cabc22c82c6eb1.png)
![](https://img.haomeiwen.com/i9945523/24898d694663b727.png)
![](https://img.haomeiwen.com/i9945523/b271310d8b850226.png)
4.4函数递归的调用过程
![](https://img.haomeiwen.com/i9945523/2a3e2fcfba0078e1.png)
![](https://img.haomeiwen.com/i9945523/f00590c73f75ff36.png)
![](https://img.haomeiwen.com/i9945523/c218d4f7b6eb2d4c.png)
4.5函数递归实例解析
![](https://img.haomeiwen.com/i9945523/9063e578d41e6d46.png)
![](https://img.haomeiwen.com/i9945523/245d77e451d81a6a.png)
![](https://img.haomeiwen.com/i9945523/42ec4cc6532f2924.png)
![](https://img.haomeiwen.com/i9945523/0add9e79c46cb1ef.png)
![](https://img.haomeiwen.com/i9945523/915269001e8f63a9.png)
第一个参数n个圆盘移动的数量,第二个参数是原柱子,第三个参数是目的柱子,第四个参数是中间柱子.假设的过程n个圆盘从A柱子的圆盘全部搬到C柱子.
步骤理解:
步骤一:n个圆盘上的n-1个圆盘,先从A搬到B,对于A而言.
步骤二:就剩下最后一个圆盘,将最后一个圆盘直接搬到C.
步骤三:再将B柱子的n-1个圆盘,全部挪到C柱子上,这样就实现了A柱子向C柱子的搬运过程.
![](https://img.haomeiwen.com/i9945523/f7765d34f57c158c.jpg)
我们可以看到,第一个T(2,A,C,B)就是在执行第一步操作,T(1,A,B,C)就是在执行第二步操作,T(2,B,A,C)就是在执行第三步操作。
即便是N大于3,也可以用这个图的架构来解释,只不过是分支多了而已。
如果你细心,你会发现,当我们把最大的那块移动到C后,我们就可以当它不存在了,也就是我们需要移动的只是中间的n-1个,这样总数量就少了一个,然后继续进行操作,把他们除了最后一块其他全部重新全都移动到A(第一步),最后一块移动到C(第二步),这样就又少了一个,我们需要移动的只剩下n-2个。如此循环。
如果你还是无法理解,建议看多几次上图。
![](https://img.haomeiwen.com/i9945523/9b586bf58cb60ca1.png)
4.6单元小结
![](https://img.haomeiwen.com/i9945523/3b3c63bb2d6ac51e.png)
5.模块4:PyInstaller库的使用
5.1PyInstaller库基本介绍
![](https://img.haomeiwen.com/i9945523/2f620d3e16aa9b51.png)
用可执行文件的方式执行一段程序.而不是直接用源代码.
![](https://img.haomeiwen.com/i9945523/901bc39b6aab4544.png)
![](https://img.haomeiwen.com/i9945523/adc2565ba3abd39f.png)
5.1PyInstaller库使用说明
![](https://img.haomeiwen.com/i9945523/270f0f76903bc285.png)
![](https://img.haomeiwen.com/i9945523/d80f219c30b75031.png)
_pycache/build这两个文件可以安全的删除,dist文件打开,就可以看到与文件同名的exe文件.这个文件就是打包之后生成的文件.用鼠标双击这个exe文件可以执行这个文件的功能.
![](https://img.haomeiwen.com/i9945523/b654cca4a39b9070.png)
建议不要使用-D,--onedir,默认值,生成dist文件夹
而使用-F,--onefile,在dist文件夹中只生成独立的打包文件.
-i<图标文件名.ico>指定打包程序使用的图标(icon)文件,是更改打包程序的图标.
6.实例8:科赫雪花小包裹
6.1"科赫雪花小包裹"问题分析
![](https://img.haomeiwen.com/i9945523/9b5932c71f60955b.png)
![](https://img.haomeiwen.com/i9945523/339dfc7a460bd899.png)
![](https://img.haomeiwen.com/i9945523/98699c8d97cbca37.png)
6.2"科赫雪花小包裹"实例讲解(上)
![](https://img.haomeiwen.com/i9945523/2d1ba33db909ceba.png)
![](https://img.haomeiwen.com/i9945523/0a7e7adc40fd5e7e.png)
![](https://img.haomeiwen.com/i9945523/01f4258b240b1e17.png)
import turtle
def koch(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,500)
turtle.penup()
turtle.goto(-300,-50)
turtle.pendown()
turtle.pensize(2)
koch(600,3)
turtle.hideturtle()
turtle.done()
main()
![](https://img.haomeiwen.com/i9945523/88976ec0fb9c48e3.png)
![](https://img.haomeiwen.com/i9945523/770f9f87dd095204.png)
6.3"科赫雪花小包裹"实例讲解(下)
![](https://img.haomeiwen.com/i9945523/9ccc774b0e6d183b.png)
![](https://img.haomeiwen.com/i9945523/7f995296d54a8a62.png)
打包方法:
1、准备条件
1)py文件,比如我使用的文件名称为了简单点命名为11.py
2)ico格式的图片,比如我使用的图片名称为了简单点命名为xuehua.ico
3)放在当前的目录下,比如我的cmd当前的目录是在Administrator文件夹.所以我将1)、2)放在Administrator文件夹。
2、方法
在cmd环境中输入:
pyinstaller -i xuehua.ico -F 11.py
![](https://img.haomeiwen.com/i9945523/d23063b992fe9fbd.png)
打包成功后会显示completed successfully.
![](https://img.haomeiwen.com/i9945523/7c50b1c12de89645.png)
在Administrator文件夹打开dist文件,则exe是我们所要求打包好的文件.
![](https://img.haomeiwen.com/i9945523/bfff6165b12ff3d6.png)
将其他产生的文件夹如pycache、build进行删除。
6.4"科赫雪花小包裹"举一反三
![](https://img.haomeiwen.com/i9945523/a6fdc180894ec4b7.png)
![](https://img.haomeiwen.com/i9945523/b39bf4aaf9aa90c8.png)
![](https://img.haomeiwen.com/i9945523/5be31a25eaa0d72a.png)
7.所有的代码汇总
七段数码管版本一
#SevenDigitsDrawV1.py
import turtle
def drawLine(draw): #绘制单段数码管
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
turtle.right(90)
def drawDigit(digit): #根据数字绘制七段数码管
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date): #获得要输出的数字
for i in date:
drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20181010')
turtle.hideturtle()
turtle.done()
main()
七段数码管版本二
#SevenDigitsDrawV2.py
import turtle, time
def drawGap(): #绘制数码管间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw): #绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(d): #根据数字绘制七段数码管
drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date):
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年',font=("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月',font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == '+':
turtle.write('日',font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-350)
turtle.pensize(5)
# drawDate('2018-10=10+')
drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
科赫曲线绘制源代码
#KochDrawV1.py
import turtle
def koch(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(-300, -50)
turtle.pendown()
turtle.pensize(2)
koch(600,3) # 0阶科赫曲线长度,阶数
turtle.hideturtle()
main()
科赫雪花绘制源代码
#KochDrawV2.py
import turtle
def koch(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(600,600)
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()
网友评论