【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记

文章目录

  • 第五周 函数和代码复用
    • 函数的定义与使用
    • 函数的参数传递
    • 函数的返回值
    • 局部变量和全局变量
    • lambda函数
    • 实例7:七段数码管的绘制
    • 代码复用与函数递归
    • 递归实例:汉诺塔问题
    • PyInstaller库
    • 实例8:科赫雪花绘制

  • 序:由于本树懒过于懒惰,即将于5月12日结课的北京理工大学《Python语言程序设计》还有很多没学,正好最近想进行一些网络内容积累,所以从我新学的内容开始,在此上传笔记~~

本文适用于有c/c++语言基础同学,侧重记录Python独有的内容,如果有错,欢迎指出!

第五周 函数和代码复用

函数的定义与使用

  • 函数的定义
    【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第1张图片
    【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第2张图片
    【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第3张图片
  • 函数的使用及调用过程

【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第4张图片

函数的参数传递

【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第5张图片
这一点同c++,例子:
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第6张图片
可变数量的参数,即不确定参数总数量的参数传递
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第7张图片
例子:n的阶乘与后面参数都相乘的结果返回(max和min函数用此法写的)

【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第8张图片
注意:可变参数只能放在函数参数的最后
参数传递有两种方式,不仅可以按顺序(位置)还可以按名称方式传递
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第9张图片

函数的返回值

注意:函数可以返回多个结果
例子:
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第10张图片

局部变量和全局变量

全局和局部变量即使名字相同,也是不同变量,因此,如果要在函数内使用外部的全局变量,要使用保留字global
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第11张图片
对于组合数据类型,其根本来说是一个指针,所以若函数内未创建同名局部变量,则可以直接使用外部定义的组合数据类型的全局变量,也就是通过指针修改外部全局变量了
对比:
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第12张图片
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第13张图片
说明如果同名组合数据类型在函数内被真实创建那么它就是局部变量,函数运行结束就释放了,不影响全局变量(指针)

总结:
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第14张图片

lambda函数

是一种没有名字的简单函数的紧凑表达形式
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第15张图片
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第16张图片
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第17张图片
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第18张图片

实例7:七段数码管的绘制

基于turtle绘图体系

#七段数码管的绘制
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,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('20200430')
    turtle.hideturtle()
    turtle.done()
main()

第二版
import time库,用time.strftime(’%Y-%m=%d+’,time.gmtime() 返回所需格式的年月日:2020-04-30

#V2
#获取当前的年月日并画出来
import turtle,time
#用于给每一段之间留一点空白空间
def drawGap():
    turtle.penup()
    turtle.fd(5)
#画直线并右转90度函数
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,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,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.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()

代码复用与函数递归

函数,对象是对代码复用的两种主要形式
python进阶语法中可以面向对象编程
模块化设计:分而治之
模块内部紧耦合,模块之间松耦合
每个递归函数至少存在一个基例,但可能存在多个基例

  • 递归:函数内调用自身方法
    【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第19张图片
    【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第20张图片
    递归的实现:函数+分支语句 禁止套娃
    【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第21张图片

递归实例:汉诺塔问题

【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第22张图片
表达出来递归链条(只关心n和n-1的关系)和基例即可
函数的四个参数:(搬运的数量,源柱子,目的柱子,中间的过度柱子)
基例是n==1
分支是先把n-1个圆盘从a柱子搬到中间的柱子(用目标柱子作为过渡)
然后再把a柱子中剩的最后一个柱子搬到目标柱子
然后把n-1个圆盘从中间柱子搬运到目标柱子上
用print打印搬运过程
【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第23张图片

PyInstaller库

将python源代码变成.exe的可执行文件,使得其在另一台没有python解释器的电脑可以直接运行
是第三方库,使用前需要额外安装,用pip指令安装
步骤:在cmd中

  • pip install pyinstaller
    如果出现以下提示,按提示操作即可
    【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第24张图片
    python -m pip install --upgrade pip
  • cd到源文件所在文件夹下
  • pyinstaller (-i myico.ico) -F 源文件名.py
  • 在源文件夹下的dist文件夹内即是exe文件

【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第25张图片

实例8:科赫雪花绘制

【第五周】Python函数用法(可变/选参数传递,局部变量,返回值)、lambda函数、PyInstaller库——北理工Python慕课笔记_第26张图片
希望给出阶数n,绘制n阶的科赫曲线

#科赫雪花绘制
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.hideturle()
    
main()

你可能感兴趣的:(Python慕课)