美文网首页 Python语言程序设计
第5周函数和代码复用-Python语言程序设计(学习笔记)

第5周函数和代码复用-Python语言程序设计(学习笔记)

作者: 努力奋斗的durian | 来源:发表于2018-04-19 11:01 被阅读61次

    文章原创,最近更新:2018-04-19

    1.辅学内容
    2.函数的定义与使用
    3.实例7:七段数码管绘制
    4.4.代码复用与函数递归
    5.模块4:PyInstaller库的使用
    6.实例8:科赫雪花小包裹
    7.所有的代码汇总
    原链接 语言程序设计北京理工大学

    1.辅学内容

    1.1前课复习

    1.2本课概要

    1.3练习与作业

    2.函数的定义与使用

    2.1单元开篇

    2.2函数的理解和定义

    2.3函数的使用及调用过程

    2.4函数的参数传递

    2.5函数的返回值

    2.6局部变量和全局变量

    2.7lambda函数

    2.8单元小结

    3.实例7:七段数码管绘制

    3.1"七段数码管绘制"问题分析

    3.2"七段数码管绘制"实例讲解(上)

    • 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段划线组成。



    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)

    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"七段数码管绘制"实例讲解(下)

    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"七段数码管绘制"举一反三

    4.代码复用与函数递归

    4.1单元开篇

    4.2代码复用与模块化设计

    4.3函数递归的理解

    4.4函数递归的调用过程

    4.5函数递归实例解析


    第一个参数n个圆盘移动的数量,第二个参数是原柱子,第三个参数是目的柱子,第四个参数是中间柱子.假设的过程n个圆盘从A柱子的圆盘全部搬到C柱子.
    步骤理解:
    步骤一:n个圆盘上的n-1个圆盘,先从A搬到B,对于A而言.
    步骤二:就剩下最后一个圆盘,将最后一个圆盘直接搬到C.
    步骤三:再将B柱子的n-1个圆盘,全部挪到C柱子上,这样就实现了A柱子向C柱子的搬运过程.


    我们可以看到,第一个T(2,A,C,B)就是在执行第一步操作,T(1,A,B,C)就是在执行第二步操作,T(2,B,A,C)就是在执行第三步操作。
    即便是N大于3,也可以用这个图的架构来解释,只不过是分支多了而已。

    如果你细心,你会发现,当我们把最大的那块移动到C后,我们就可以当它不存在了,也就是我们需要移动的只是中间的n-1个,这样总数量就少了一个,然后继续进行操作,把他们除了最后一块其他全部重新全都移动到A(第一步),最后一块移动到C(第二步),这样就又少了一个,我们需要移动的只剩下n-2个。如此循环。

    如果你还是无法理解,建议看多几次上图。

    4.6单元小结

    5.模块4:PyInstaller库的使用

    5.1PyInstaller库基本介绍


    用可执行文件的方式执行一段程序.而不是直接用源代码.


    5.1PyInstaller库使用说明


    _pycache/build这两个文件可以安全的删除,dist文件打开,就可以看到与文件同名的exe文件.这个文件就是打包之后生成的文件.用鼠标双击这个exe文件可以执行这个文件的功能.



    建议不要使用-D,--onedir,默认值,生成dist文件夹
    而使用-F,--onefile,在dist文件夹中只生成独立的打包文件.
    -i<图标文件名.ico>指定打包程序使用的图标(icon)文件,是更改打包程序的图标.

    6.实例8:科赫雪花小包裹

    6.1"科赫雪花小包裹"问题分析

    6.2"科赫雪花小包裹"实例讲解(上)

    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()
    
    

    6.3"科赫雪花小包裹"实例讲解(下)


    打包方法:
    1、准备条件
    1)py文件,比如我使用的文件名称为了简单点命名为11.py
    2)ico格式的图片,比如我使用的图片名称为了简单点命名为xuehua.ico
    3)放在当前的目录下,比如我的cmd当前的目录是在Administrator文件夹.所以我将1)、2)放在Administrator文件夹。
    2、方法
    在cmd环境中输入:
    pyinstaller -i xuehua.ico -F 11.py


    打包成功后会显示completed successfully.

    在Administrator文件夹打开dist文件,则exe是我们所要求打包好的文件.

    将其他产生的文件夹如pycache、build进行删除。

    6.4"科赫雪花小包裹"举一反三

    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()
    

    相关文章

      网友评论

        本文标题:第5周函数和代码复用-Python语言程序设计(学习笔记)

        本文链接:https://www.haomeiwen.com/subject/shxjkftx.html