第五章 函数和代码复用
一、函数的定义与使用
函数的定义
def 函数名(参数):
函数体
return 返回值
2.函数的参数传递
可选参数必须放在非可选参数后面 eg:def函数名(非可选参数也叫必选参数,可选参数): 比如递归函数def fact(n,m=1):
可变参数——def函数名(参数,*b):
3.函数的返回值
可以用return来传递返回值——return m,n
4.局部变量和全局变量
在函数定义的函数体中使用的变量是局部变量,即在函数体内部的为局部变量,在函数体外面的为全局变量。
使用规则1:局部变量是函数内部的占位符,与全局变量可能重名但不同; 函数运算结束后,局部变量将被释放,不再存在;
使用保留字global在函数体中间使用外部的全局变量,比如:
n,s = 10,100
def fact(n):
global s #声明此处s是全局变量
使用规则2:局部变量为组合数据类型且未创建,等同于全局变量。
5.lambda函数
——用于定义简单的、能够在一行内表示的函数
用法: 函数名=lambda 参数:表达式f=lambda x,y : x+y
二、实例七:七段数码管绘制
#SevenDigitsDrawV1.py
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,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): #获得要输出的数字
for i in date:
drawDigit(eval(i)) #通过eval()函数将数字变为整数
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20181010')
turtle.hideturtle()
turtle.done()
main()
三、代码复用与函数递归
1.代码复用与模块化设计
函数和对象是代码复用的两种主要形式。
模块化设计的核心——分而治之。
概念: 紧耦合(两个部分之间交流很多,无法独立存在) 分耦合(两个部分之间交流较少,可以独立存在) 模块内部紧耦合,模块之间分耦合
2.函数递归
有两个基本特征:
链条——计算过程存在递归链条
基例——存在一个或多个不需要再次递归的基例
实例解析-字符串反转
分析:要实现递归即 函数+分支结构(定义一个函数,在函数中要有分支),通过分支区分哪些是递归链条,哪些是递归基例 。
四、实例8:科赫雪花小包裹
#KochDrawV2.py
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 # 3阶科赫雪花,阶数
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
main()