目录
一、函数的定义与使用
1.1 函数的理解与定义
1.1.1 理解
函数是一段具有特定功能、可重复使用的语句组,函数主要是为了降低编程难度和代码复用。
1.1.2 定义( def、return )
def <函数名>(<参数(0个或多个)>) :
<函数体>
return <返回值>
- 函数定义时,所指定的参数是一种占位符。参数是输入,函数体是处理,返回值是输出
- 函数定义后,若不调用该函数,则该函数不会被执行
1.1.3 举例
案例:计算n!
1.2 函数的使用及调用过程
函数定义出来后,只有对其进行调用,该函数才会被执行。
- 调用时要给出实际具体的参数,实际参数将替换函数定义中的参数。
- 函数调用后,会得到返回值
1.3 函数的参数传递
1.3.1 可选参数传递(可选参数放在后)
- 函数定义时,可以为某些参数指定默认值,构成可选参数。
- 所有的可选参数,必须放在非可选参数(必选参数)之后。
def <函数名>(<非可选参数>, <可选参数>) :
<函数体>
return <返回值>
举例:
1.3.2 可变参数传递( *b )
可变参数是指不确定参数的总数量。
def <函数名>(<参数>, *b) :
<函数体>
return <返回值>
举例:
1.3.3 名称方式传递参数
举例:
1.4 函数的返回值
- return关键字用来传递返回值,可以传递一个返回值,也可以传递多个返回值。
- 函数定义时,可以有一个返回值,多个返回值,也可以没有返回值。
- 函数定义时,可以有return,也可以没有return。
举例:
1.5 局部变量和全局变量
局部变量:只在函数定义内部使用的变量。全局变量:整个程序使用的变量。
1.5.1 规则1( global )
- 局部变量与全局变量是不同的变量
- 局部变量是函数内部的占位符,与全局变量可能重名但不同
- 函数运算结束后,局部变量被释放掉不再存在
- 可以使用 global 关键字在函数内部声明变量为全局变量
举例:
1.5.2 规则2
- 某组合数据类型变量,在函数内部未创建却直接使用,同时该组合数据类型变量的名字又等同于一个全局变量,那么,这个函数就是在处理这个全局变量。
举例:
1.6 lambda函数
lambda函数返回函数名作为结果。
- lambda函数是一种匿名函数,即没有函数名的函数。
- 使用 lambda 关键字定义,函数名是返回结果。
- lambda函数用于定义简单的、能够在一行内表示的函数。
函数定义:
<函数名> = lambda <参数>:<表达式>
注:lambda函数主要用作一些特定函数或方法的参数,有其固定的使用方式,应谨慎使用 lambda函数。一般情况下,建议使用 def定义的普通函数。
举例:
二、“七段数码管显示时间”实例
步骤1:绘制一个七段数码管
用turtle库绘制数码管,海龟爬行顺序可以按下图所示。
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()
最终运行效果:
总结
- 模块化思维:确定模块接口,封装功能
- 规则化思维:抽象过程为规则,计算机根据参数自动选择执行
- 化繁为简:将大功能拆分为小功能的组合,分而治之
- 数码管绘制扩展方向;带小数点、刷新时间倒计时、更高级的十四段数码管