5.1函数的定义和使用
- 函数的作用:降低编程难度和实现代码复用。
函数是一段代码的表示
def <函数名>(<参数0个或多个>) :
<函数体>
return <返回值>
例如:计算n的阶乘的函数
def fact(n):
s = 1
for i in range(1,n+1): #从1开始乘到n结束,不包括n+1
s *= i
return s
——函数定义时,所指定的参数时一种占位符
——函数定义后,不经过调用,不会被执行
——函数定义时,参数是输入,函数体处理,结果是输出
- 函数使用及调用过程
调用是运行函数代码的方式,对于1中的代码,调用时可写成fact(10)来计算10的阶乘。
——调用时要给出实际参数,实际参数替换定义中的参数,函数调用后得到返回值 - 函数的参数传递
——函数可以有参数,也可以没有参数,但必须保留括号
——函数定义时可以为某些参数指定默认值,构成可选参数
可选参数传递:
def <函数名>(<非可选参数>,<可选参数>):
<函数体>
return <返回值>
举例说明
#计算n!//m
def fact(n, m=1): # m为可选参数
s = 1
for i in range(1,n+1): #从1开始乘到n结束,不包括n+1
s *= i
return s//m
调用上述函数时,若直接fact(10),则m值为指定的默认值1,结果为阶乘整除1;若写成了fact(10,5),则结果为10的阶乘整除5.
可变参数传递:函数定义时可以设计可变数量参数,即不确定参数的总数量
def <函数名>(<参数>, *b)
<函数体>
return <返回值>
def fact(n, *b):
s = 1
for i in range(1, n+1):
s *=i
for item in b:
s *= item
return s
#fact(10,3)结果为10886400,即10的阶乘在乘以3
#fact(10,3,5,8)结果为435456000,10的阶乘乘以3,5,8后的结果
参数传递有两种方式:位置传递和名称传递,比如求阶乘参数中带有m=1的代码,调用时可以写成fact(10,5);fact(m=5,n=10)。
- 函数的返回值——函数可返回0个或多个结果
——return保留字用来传递返回值
——函数可以有返回值,也可以没有,可以有return,也可以没有
——return可以传递0个返回值,也可以传递任意多个返回值
函数调用时,参数可以按照位置或名称方式传递
def fact(n):
s = 1
for i in range(1,n+1):
s *= i
return s//m, n, m
#fact(10, 5) 结果(725760, 10, 5)元组类型,与列表类似,但列表是用[]
a,b,c = fact(10, 5)
print(a,b,c) #结果为725760 10 5
-
局部变量和全局变量
局部变量指函数体内部定义的变量,全局变量指函数体外的变量
——局部变量和全局变量是不同变量
局部变量是函数内部的占位符,与全局变量可能重名但不同;
与java和c语言类似,函数执行结束后,局部变量被释放;
独特之处在于能使用global保留字在函数内部使用全局变量——局部变量为组合数据类型且未创建,等同于全局变量
例如:
ls = ["F", "f"] #通过使用[]真实创建了一个全局变量列表ls
def func(a):
# ls = [] 若加上该行代码,ls是列表类型,真实创建,ls是局部变量
ls.append(a) #此处ls是列表类型,未真实创建,则等同于全局变量
return
func("C") #全局变量ls被修改
print(ls)
- lambda函数 ——lambda函数返回函数名作为结果
——lambda函数是一种匿名函数
——使用lambda保留字定义,函数名是返回结果
——lambda函数用于定义简单的、能够在一行内表示的函数
<函数名> = lambda <参数> : <表达式>
等价于
def <函数名>(<参数>):
<函数体>
return <返回值>
>>>f = lambda x,y : x+y
>>>f(10, 15)
>>> f = lambda : "lambda函数"
>>> print(f())
lambda函数一般不建议使用,常用def定义普通函数。
5.2实例7:七段数码管绘制
- 首先能够绘制一个数字的数码管
- 绘制多个数字的数码管
- 获取系统时间绘制出时间的数码管
import turtle
def drawGap(): #绘制数码管时产生间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw): #绘制每条线
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawaGap()
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,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180) #绘制完后方向向左,左转180度后将朝向右边,同第一个数码管绘制一样从头开始
turtle.penup() #画笔抬起
turtle.fd(20) #向前20像素,即多个数字之间的间隔为20像素
def drawDate(date): #获得要输出的数字
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.pencolor("blue")
# 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("20220303") #获取系统时间并将时间以数码管形式显示时 drawDate("2022-03=03+")即-号位置绘制年,=绘制月,+号绘制日.
#drawDate("2022-09=26+")
#drawDate(time.strftime("A%Y-%m=%d+",time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
规模化思维:确定模块接口,封装功能
规则化思维:抽象过程为规则,计算机自动执行
化繁为简:将大功能变为小功能组合,分而治之
应用问题扩展:
——绘制带小数点的七段数码管
#SevenDigitsDdrawV2.py
import turtle,time
def drawGap():
turtle.penup()
turtle.fd(5)
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,7,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.left(-90)
turtle.penup()
turtle.fd(40)
turtle.left(90)
turtle.fd(10)
turtle.pendown()
turtle.circle(2)
turtle.penup()
turtle.fd(30)
turtle.left(90)
turtle.fd(40)
turtle.right(90)
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()))
drawDate("1.4")
turtle.hideturtle()
turtle.done()
main()