• 【第五周】函数和代码复用


    1.第5周课程导学
    前课复习:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    本课概要
    在这里插入图片描述
    在这里插入图片描述
    5.1 函数的定义与使用
    在这里插入图片描述
    函数的理解和定义:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    函数的使用及调用过程

    在这里插入图片描述
    在这里插入图片描述
    我们要理解函数的定义和函数的调用,定义代码不被执行,而调用的时候通过给定实际参数,替换定义中的形式参数,获得
    运算结果

    函数的参数传递:
    在这里插入图片描述
    在这里插入图片描述
    非可选参数:这些可以提供参数也可以不提供参数的,这样的参数就叫可选参数。python中要求在设定或定义函数
    的时候,所有的可选参数必须放在非可选参数之后。非可选参数也叫必选参数,也就是你调用这个函数的时候
    必须要有这个参数,必须要有就要放在前面,你要先给它值,而可以有可以没有的让它放在后面,这是一种约定。

    在这里插入图片描述

    如果你给出了第二个参数m,那么我们就用你给的实际值,如果你不给第二个参数m,我们就把m设为1去进行下面的运算。可选的一定要放到必须的参数后面

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    *首先你先定义那些确定要给的参数放在前面,然后最后增加一个b,来表达不确定的参数。当然你可以用c a都可以,但是我们这里简单叫b,这个b是一个你自己可以定义的变量名字。b表示可变参数,多少个参数都可以

    在这里插入图片描述
    函数的返回值:

    在这里插入图片描述
    在这里插入图片描述
    元组类型:小括号,中间用逗号隔开的几个元素
    列表类型:方括号,中间用逗号隔开的几个元素

    在这里插入图片描述

    局部变量和全局变量:
    在这里插入图片描述
    局部是函数内部使用的变量,而函数外部整个程序使用的变量叫全局变量。
    在这里插入图片描述
    在这里插入图片描述
    全局变量和局部变量,即使名字是相同的,它们也是不同变量。
    在这里插入图片描述
    能不能在程序的中间使用外部变量呢?当然可以,那就要使用一个保留字global。global保留字用来在函数内部中,声明这个变量它是全局变量而不是局部变量。

    通过global保留字在函数内部声明使用全局变量,这样一个函数内部就可以处理外部的全局变量
    在这里插入图片描述
    在这里插入图片描述
    如果我们在一个函数定义中,使用了一个组合数据类型,而这个组合数据类型。比如列表ls,它是没有在函数内部被真实创建,它本身的名字又等同于一个全局变量。那么这段函数就是在处理这个全局变量

    在这里插入图片描述
    这段代码告诉我们,如果一个组合数据类型,在函数中它被真实创建了,那么它就是这个函数的局部变量,所以如果是局部变量,那么在函数运行之后,这个变量就会被释放,它就不存在了。它跟外部的全局变量ls是不同的变量。那如果这个组合数据类型在函数内部没有被真实的创建,它的名字又与全局变量名字相同,那它就是个全局变量。

    其实组合数据类型在python中,是由指针来体现的,所以函数中如果没有真实创建组合数据类型,它使用的变量是使用的指针,而指针指的是外部的全局变量,所以你去修改这个指针对应的内容,就修改了全局变量

    在这里插入图片描述

    组合数据类型比如像列表这种,如果局部变量,也就是在函数内部的变量,使用中没有真实创建这个数据类型,那么它用的就是全局变量的同名的那个变量;如果在函数内部你真实创建了这个组合数据类型,那它就是局部变量

    lambda函数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在编写程序的过程中,哪怕是一行,建议使用def和return这种方式来定义,要谨慎使用lambda函数
    在这里插入图片描述
    单元小结:
    在这里插入图片描述
    可选参数和必选参数:可选参数要在必选参数的后面,并且可选参数在定义的时候要赋予初值。
    可变参数:可变参数要使用*b来表达用户输入的多个参数

    七段数码管绘制问题分析:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    如果draw是真值,比如说给一个true,那么我们就让当前的海龟画笔落下,如果不是,我们将海龟的画笔抬起来
    回到起点后,我们需要让当前的海龟再转回90度,也就是继续前进,turtle.left(90),让它再回到前进方向再进行三次右转,这样就绘制了七条线。但是在绘制过程中如果我们不加判断,那么你调用drawLine函数,并且赋值参数为True的话,那么每一个线都会被绘制出来,那么绘制的结果就是一个数字8,为了控制它我们定义一个函数叫drawDight,它表示的是根据参数digh来决定如何绘制对应的数字。这个参数是dight,它是一个数字,它的取值范围是0到9。然后我们判断当前你给的这个整数是几,如果你给的数字是8,那么你的每一条线段都要被真实绘制,如果你给的整数是0,那你的第一条线段就不需要被绘制

    如果是绘制第一条线,那么哪一个数字需要绘制第一条线呢,那显然如果是数字2、数字3、数字4,数字5,数字6,数字8,数字9,它都需要绘制中间这条线。那么我们只需要判断输入的数字,如果是2,3,4,5,6,8,9,我们就真实的画一条线,那么就调用drawLine函数并且赋值为True,如果输入的数字不是这几个数,我们也要画一条线,但是这条线需要它飞过去并不需要它真实绘制,那么就赋予参数False

    在这里插入图片描述
    在这里插入图片描述
    另外我们定义一个主函数main,去设置一些初始值和一些结束的一些辅助的代码信息。函数定义并不运行任何的代码,我们最后需要使用main的调用。调用主函数启动整个程序的运行

    # 七段数码管绘制
    import turtle
    
    
    def drawLine(draw):  # 绘制单段数码管
        turtle.pendown() if draw else turtle.penup()
        # 如果draw是真值,比如说给一个true,那么我们就让当前的海龟画笔落下,如果不是,我们将海龟的画笔抬起来
        turtle.fd(40)  # 行进一个40像素
        turtle.right(90)  # 让它转向90度
    
    
    def drawDight(dight):  # 根据数字绘制七段数码管
        drawLine(True) if dight in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)  # 如果是数字2,3,4,5,6,8,9就要真实的绘制这一条线
        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(20)
    
    
    def drawDate(date):  # 获取当前的日期
        for i in date:
            drawDight(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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    七段数码管绘制实例讲解(下):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    drawGap():绘制线中如果希望线之间有一些空白,我们可以增加一个drawGap函数。drawGap函数
    就是在绘制线之前和之后,分别增加一些小的像素作为间隔

    在这里插入图片描述
    turtle.write(‘内容’,font=(‘什么字体’),字体大小):作用是用画笔写出汉字字体

    在这里插入图片描述
    在这里插入图片描述

    # 七段数码管绘制
    import turtle, time
    
    
    def drawGap():
        turtle.penup()
        turtle.fd(5)
    
    
    def drawLine(draw):  # 绘制单段数码管
        drawGap()
        turtle.pendown() if draw else turtle.penup()
        # 如果draw是真值,比如说给一个true,那么我们就让当前的海龟画笔落下,如果不是,我们将海龟的画笔抬起来
        turtle.fd(40)  # 行进一个40像素
        drawGap()
        turtle.right(90)  # 让它转向90度
    
    
    def drawDight(dight):  # 根据数字绘制七段数码管
        drawLine(True) if dight in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)  # 如果是数字2,3,4,5,6,8,9就要真实的绘制这一条线
        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(20)
    
    
    def drawDate(date):  # 获取当前的日期
        turtle.pencolor("red")
        for i in date:
            if i == '-':
                turtle.write("年", font=("Arial", 30, "normal"))
                turtle.pencolor("green")  # 该函数用户设置画笔的颜色
                turtle.fd(40)
            elif i == "=":
                turtle.write("月", font=("Arial", 30, "normal"))
                turtle.fd(40)
            elif i == "+":
                turtle.write("日", font=("Arial", 30, "normal"))
                turtle.fd(40)
            else:
                drawDight(eval(i))
        # for i in date:
        #     drawDight(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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    在这里插入图片描述

    七段数码管绘制举一反三:
    在这里插入图片描述
    在这里插入图片描述

    5.3 代码复用与函数递归:
    单元开篇:
    在这里插入图片描述
    代码复用与模块化设计:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    函数是对代码的一种抽象
    在这里插入图片描述
    在这里插入图片描述
    函数递归的理解
    递归:在函数自身中,调用函数自身的方式就是递归
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    函数递归的调用过程:
    在这里插入图片描述
    在这里插入图片描述
    简单说递归的实现的主要方法就是函数加分支语句

    我们知道一段函数如果定义但不被调用,它是不被执行的。调用这段函数需要给它的参数赋初值
    递归的调用过程,它事实上就是函数的计算机运算过程

    函数递归实例解析:
    在这里插入图片描述

    s[::-1]:表示从最开始到最后采用-1的步长进行输出,而-1的步长就是指从后向前依次取出

    在这里插入图片描述
    如果函数不是空,调用rvs自身,对s的除首字符之外的进行反转。这个函数是可以将首字符之外的其它子串
    进行反转,反转之后我们将首字符放到最后面,就实现了整个字符串的反转。
    只要我们将递归链条找到,这段代码就写完了,写完之后,它的执行过程就能够实现字符串的反转

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    对于这个函数我们定义四个参数,第一个参数是圆盘的数量,第二个参数是源柱子,第三个参数是目的柱子,第四个参数是中间的过渡柱子

    在这里插入图片描述
    单元小结:
    在这里插入图片描述

    5.4 模块4:PyInstaller库的使用:
    PyInstaller库的使用:简单说我们希望用可执行文件的方式来执行一段程序,而不是直接用源代码
    在这里插入图片描述
    对于windows平台,简单说我们可以用pyinstaller,将python源代码,变成.exe的可执行文件,这样我们直接就可以运行程序,而不需要再去安装python的解释器,也不需要去对另外一台计算机做相关的环境限制了,

    在这里插入图片描述
    在这里插入图片描述
    通过这样的命令将一个源文件打包生成可执行文件
    在这里插入图片描述

    找到源代码,在源代码所在目录下,通过windows的命令行,记住一定要使用命令行,不要使用IDLE
    环境下的交互编程环境。因为pyinstaller是命令行的执行程序,不是python下面的执行指令

    在这里插入图片描述
    在这里插入图片描述

    这里边需要一个图标文件叫curve.ico,其实以.ico为扩展名的图标文件有很多个,我们可以在网络
    上,利用百度去找到一个图标文件,并且下载保存,改成你所希望要的任何的图标文件的名称

    这样就实现了对源代码的打包操作。这里还要强调一点,只有在打包过程的计算机中,需要安装pyinstaller
    打包之后的程序,如果你发给你的朋友,或者放在其它的计算机上,它是可以直接执行,不需要安装python环境,也不需要安装pyinstaller

    实例8 科赫雪花小包裹问题分析:
    在这里插入图片描述
    分形几何:简单说可以理解为这个东西的整体与它的局部具有很相似的特点
    在这里插入图片描述

    科赫曲线也叫雪花曲线
    在这里插入图片描述
    在这里插入图片描述
    一个阶段也叫做一阶,对于一条直线,它的一阶变成4条直线的组合,如果二阶,4条直线会每一个再变成4条直线。
    用同一个操作来反复的对其中的曲线或直线进行不断迭代,就构成了科赫曲线的实现过程

    科赫雪花小包裹实例讲解(上):在这里插入图片描述

    size表示每一个直线的长度
    n 表示希望绘制的阶数n

    如果n不等于0我们的每一阶跟它的上一阶之间存在怎样的绘制关系呢?其实科赫雪花或者科赫曲线它做的事情是将一条直线切分成三段,那么中间这一段去掉,然后我们让中间绘制一个凸起的三角形。如果再进一阶是把其中每一个线段做下一次的科赫曲线的绘制。如此我们就可以对第n阶科赫曲线和第n-1阶科赫曲线形成一个递归链条

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    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
        koch(400, level)
        turtle.right(120)
        koch(400, level)
        turtle.right(120)
        koch(400, level)
        turtle.hideturtle()
        turtle.done()
    
    
    main()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    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)
    
    
    koch(400, 3)
    turtle.done()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    科赫雪花小包裹实例讲解(下):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    科赫雪花小包裹举一反三:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    CopyOnWriteArrayList源码分析
    MyBatis调用SqlServer存储过程
    HT for Web (Hightopo) 使用心得(7)- 3D场景环境配置(阴影,灯光,环境光)
    Beego框架学习
    Linux操作系统-线程池
    seleninum 基础及简单实践
    Linux ALSA驱动之Control设备创建流程源码分析(5.18)
    7. dws 层建设(大宽表)
    OpenCV(四十一):图像分割-分水岭法
    【软考 系统架构设计师】数据库系统① 数据库系统的体系结构
  • 原文地址:https://blog.csdn.net/qq_44636569/article/details/125448507