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

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

七段数码管绘制实例讲解(下):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
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()

在这里插入图片描述

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

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

在这里插入图片描述

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值