Python初学9——函数的定义与使用

目录

一、函数的定义与使用

1.1 函数的理解与定义

1.1.1 理解

1.1.2 定义( def、return )

1.1.3 举例

1.2 函数的使用及调用过程

1.3 函数的参数传递

1.3.1 可选参数传递(可选参数放在后)

1.3.2 可变参数传递( *b )

1.3.3 名称方式传递参数

1.4 函数的返回值

1.5 局部变量和全局变量

1.5.1 规则1( global )

1.5.2 规则2

1.6 lambda函数

二、“七段数码管显示时间”实例

步骤1:绘制一个七段数码管

步骤2:将一串数字和字母,绘制成数码管

步骤3:获得当前系统时间,绘制对应的数码管

总结


一、函数的定义与使用

1.1 函数的理解与定义

1.1.1 理解

函数是一段具有特定功能、可重复使用的语句组,函数主要是为了降低编程难度和代码复用。

1.1.2 定义( def、return )

def <函数名>(<参数(0个或多个)>) :

    <函数体>

    return <返回值>

  • 函数定义时,所指定的参数是一种占位符。参数是输入,函数体是处理,返回值是输出
  • 函数定义后,若不调用该函数,则该函数不会被执行

1.1.3 举例

案例:计算n!

图1-1

1.2 函数的使用及调用过程

函数定义出来后,只有对其进行调用,该函数才会被执行。

  • 调用时要给出实际具体的参数,实际参数将替换函数定义中的参数。
  • 函数调用后,会得到返回值
图1-2

1.3 函数的参数传递

1.3.1 可选参数传递(可选参数放在后)

  • 函数定义时,可以为某些参数指定默认值,构成可选参数。
  • 所有的可选参数,必须放在非可选参数(必选参数)之后。

def <函数名>(<非可选参数>, <可选参数>) :

    <函数体>

    return <返回值>

举例:

图1-3
图1-4

1.3.2 可变参数传递( *b )

可变参数是指不确定参数的总数量。

def <函数名>(<参数>, *b) :

    <函数体>

    return <返回值>

举例:

图1-5

1.3.3 名称方式传递参数

举例:

图1-6

1.4 函数的返回值

  • return关键字用来传递返回值,可以传递一个返回值,也可以传递多个返回值。
  • 函数定义时,可以有一个返回值,多个返回值,也可以没有返回值。
  • 函数定义时,可以有return,也可以没有return。

举例:

图1-7

1.5 局部变量和全局变量

局部变量:只在函数定义内部使用的变量。全局变量:整个程序使用的变量。

1.5.1 规则1( global )

  1. 局部变量与全局变量是不同的变量
  2. 局部变量是函数内部的占位符,与全局变量可能重名但不同
  3. 函数运算结束后,局部变量被释放掉不再存在
  4. 可以使用 global 关键字在函数内部声明变量为全局变量

举例:

图1-8
图1-9

1.5.2 规则2

  1. 某组合数据类型变量,在函数内部未创建却直接使用,同时该组合数据类型变量的名字又等同于一个全局变量,那么,这个函数就是在处理这个全局变量。

举例:

图1-10
图1-11

1.6 lambda函数

lambda函数返回函数名作为结果。

  • lambda函数是一种匿名函数,即没有函数名的函数。
  • 使用 lambda 关键字定义,函数名是返回结果。
  • lambda函数用于定义简单的、能够在一行内表示的函数。

函数定义:

<函数名> = lambda <参数>:<表达式>

注:lambda函数主要用作一些特定函数或方法的参数,有其固定的使用方式,应谨慎使用 lambda函数。一般情况下,建议使用 def定义的普通函数。

举例:

图1-12

二、“七段数码管显示时间”实例

步骤1:绘制一个七段数码管

用turtle库绘制数码管,海龟爬行顺序可以按下图所示。

图2-1
import turtle, time
'''
    功能:  绘制空白,用来增加数码管之间的间隔
    参数:  无
    返回值:无
'''
def drawGap():
    turtle.penup()
    turtle.forward(5)


''' 
    功能:  绘制一个线段,并右转90度
    参数:  draw:真值则画笔落下画线段,假值则画笔抬起画空线
    返回值:无
'''
def drawLine(draw):
    drawGap()
    turtle.pendown() if draw else turtle.penup() # 依据draw的值操作画笔是否落下
    turtle.forward(40)                           # 画笔前进一个线段的长度
    drawGap()
    turtle.right(90)                             # 海龟右转90度,为下一个线段的绘制做好准备


'''
    功能:  绘制一个七段数码管数字
    参数:  digit:选择范围为0、1、2、3、4、5、6、7、8、9、
                          'a'、'b'、'c'、'd'、'e'、'f'、
                          'A'、'B'、'C'、'D'、'E'、'F'
    返回值:无
'''
def drawDigit(digit):
    turtle.setheading(0)                                                                                      # 初始化海龟朝向x轴正半轴方向
    drawLine(True) if digit in [2,3,4,5,6,8,9,'a','b','d','e','f','A','B','D','E','F']   else drawLine(False) # 绘制线段1,并右转90度
    drawLine(True) if digit in [0,1,3,4,5,6,7,8,9,'a','b','d','A','B','D']               else drawLine(False) # 绘制线段2,并右转90度
    drawLine(True) if digit in [0,2,3,5,6,8,9,'b','c','d','e','B','C','D','E']           else drawLine(False) # 绘制线段3,并右转90度
    drawLine(True) if digit in [0,2,6,8,'a','b','c','d','e','f','A','B','C','D','E','F'] else drawLine(False) # 绘制线段4,并右转90度
    turtle.left(90)                                                                                           # 左转90度
    drawLine(True) if digit in [0,4,5,6,8,9,'a','b','c','e','f','A','B','C','E','F']     else drawLine(False) # 绘制线段5,并右转90度
    drawLine(True) if digit in [0,2,3,5,6,7,8,9,'a','c','e','f','A','C','E','F']         else drawLine(False) # 绘制线段6,并右转90度
    drawLine(True) if digit in [0,1,2,3,4,7,8,9,'a','d','A','D']                         else drawLine(False) # 绘制线段7,并右转90度
    turtle.setheading(0)                                                                                      # 初始化海龟朝向x轴正半轴方向
    turtle.penup()
    turtle.forward(20) # 为绘制下一个七段数码管做好准备

步骤2:将一串数字和字母,绘制成数码管

'''
    功能:  绘制一串七段数码管数字
    参数:  data:要绘制的字符串,字符串中每一个字符在以下范围内选择,
                  0、1、2、3、4、5、6、7、8、9、
                  a、b、c、d、e、f、
                  A、B、C、D、E、F
                  特别的,字符"+"将绘制汉字“年”,字符"-"将绘制汉字“月”,字符"="将绘制汉字“日”
    返回值:无
'''
def drawData(data):
    turtle.pencolor("red")
    for i in data:
        if i == "+":  # 绘制汉字“年”
            turtle.write('年',font=("Arial",36,"normal"))
            turtle.pencolor("green")
            turtle.forward(80)
        elif i == "-":  # 绘制汉字“月”
            turtle.write('月',font=("Arial",36,"normal"))
            turtle.pencolor("blue")
            turtle.forward(80)
        elif i == "=":  # 绘制汉字“日”
            turtle.write('日',font=("Arial",36,"normal"))
        else:
            #  通过eval()函数将数字两侧的引号去掉从而变为数字类型
            drawDigit(i) if i in ['a','b','c','d','e','f','A','B','C','D','E','F'] else drawDigit(eval(i))

步骤3:获得当前系统时间,绘制对应的数码管

  • 增加年月日的标记
  • 年月日的颜色不同
def main():
    turtle.setup(800,530,200,200) # 设置画布大小
    turtle.penup()                # 抬起画笔
    turtle.forward(-375)          # 设置画笔初始位置
    turtle.pensize(5)             # 设置画笔粗细
    drawData(time.strftime("%Y+%m-%d=", time.gmtime())) # 获取系统时间并转换为指定字符串,然后进行绘制
    turtle.hideturtle()
    turtle.done()

main()

最终运行效果:

图2-2

总结

  1. 模块化思维:确定模块接口,封装功能
  2. 规则化思维:抽象过程为规则,计算机根据参数自动选择执行
  3. 化繁为简:将大功能拆分为小功能的组合,分而治之
  4. 数码管绘制扩展方向;带小数点、刷新时间倒计时、更高级的十四段数码管
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觅道無涯-千知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值