函数和代码的复用
一、函数的定义与使用
1.理解与定义
-函数是一段具有特定功能的、可重用的语句组
-函数的作用:降低编程难度和代码复用
2.使用及调用过程
def fact(n): #定义函数
s=1
for i in range(1,n+1):
s*=i
return s
fact(10) #调用函数
3.参数传递
①普通参数
②可选参数,赋初值
③可变参数
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
>>> fact(10,3,5,8)
435456000
4.返回值
5.局部变量和全局变量
6.lambda函数
-lambda函数是一种匿名函数,返回值是函数名,紧凑表达方式
<函数名>=lambda<参数>:<表达式>
>>> f=lambda x,y:x+y
>>> f(2,7)
9
>>> f=lambda:"lambda函数"
>>> print(f())
lambda函数
二、实例7:七段数码管绘制
1.分析
①绘制单个数字对应的数码管
②获得一串数字,绘制对应数码管
③获得当前系统时间,绘制对应数码管
2.实例讲解
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))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20201022')
turtle.hideturtle()
turtle.done
main()
获取当前系统时间:
import time
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): #date为日期,格式 '%Y-%m=%d+','-=+'分别对应年月日
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.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(time.strftime('%Y-%m=%d+',time.gmtime()))
turtle.hideturtle()
turtle.done
main()
三、代码复用与函数递归
1.代码复用与模块化设计
①可以使用函数或对象通过封装将功能进一步抽象
②模块化设计(分而治之)
-通过函数或对象封装将程序划分为模块及模块间的表达
-具体包括:主程序、子程序间的关系
-模块内部紧耦合,模块之间松耦合
- 紧耦合:两个部分之间交流很多,无法独立存在
- 松耦合:两个部分之间交流较少,可以独立存在
2.函数递归
递归的实现:函数+分支语句
①将字符串反转后输出
>>> s[::-1]
'54321'
#递归实现
>>> def rvs(s):
if s =="":
return s
else:
return rvs(s[1:])+s[0] #将首字符放到其余字符之后
>>> rvs("abcdefg")
'gfedcba'
>>> s="12345"
②汉诺塔
>>> def hanoi(n,src,dst,mid):
global count
if n==1:
print("{}:{}->{}".format(1,src,dst))
count+=1
else:
hanoi(n-1,src,mid,dst)
print("{}:{}->{}".format(n,src,dst))
count+=1
hanoi(n-1,mid,dst,src)
>>> hanoi(3,'A','B','C')
1:A->B
2:A->C
1:B->C
3:A->B
1:C->A
2:C->B
1:A->B
四、模块4:PyInstaller库的使用
1.PyInstaller是第三方库
-官方网站:http://www.pyinstaller.org
-安装第三方库需要使用pip工具
-在cmd命令行中输入
pip install pyinstaller
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/
2.使用pyinstaller
pyinstaller -F 文件名.py
① -h:查看帮助
② --clean:清理打包过程中的临时文件
③ -D,–onedir:默认生成dist文件夹
④ -F,–onfile:在dist文件夹中只生成独立的打包文件
⑤ -i <图标.ico>:指定打包程序使用的图标文件icon
五、实例8:科赫雪花小包裹
1.分析
①分形几何:具有迭代关系的几何图形(整体与局部具有很相似的特点)
②科赫曲线/雪花曲线:
2.三阶科赫雪花
#KochDrawV1.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 #三阶科赫雪花
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
main()