函数的定义与使用
- 函数定义时,参数是输入、函数是处理、结果是输出IPO
- 实参代替形参—调用;可以有参数,也可以没有参数,必须有括号
- 有默认值的可选参数在非可选参数之后
def fun(<非可选参>,<可选参>):
- 可变参数传递
#计算n!再乘未知个数的数
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,5,8) #10!*3*5*8
- 参数传递
def fact(n,m=1):
位置传递fact(10,5)
;名称传递fact(m=5,n=10)
- 函数返回值
可返回0或多个结果return s//m,n,m
返回形式(73223,10,5)元祖类型(,) - 局部和全局变量
局部变量是函数内部的占位符,函数结束后释放,基本数据类型无论是否重名都不同
使用global
保留字在函数内部使用全局变量
局部变量为组合数据类型且未真实创建,等同于全局变量ls
ls = ['s','dd']#使用[]真实创建一个全局变量列表ls
def func(a):
ls.append(a)
return
func("C");print(ls)
lambda函数[特殊]
lambda函数返回函数名作为结果,没有名字的函数(匿名函数)—一般用def
使用lambda
保留字定义简单的、在一行内表示的函数 <函数名>=lambda<参数>:<表达式>
f = lambda x , y : x + y
#>>>f(10,15)#得25
f = lambda : “lambda函数”
print(f())
实例7:七段数码管绘制
#sevenDigtial.py
import turtle as t
import time
def drawGap():#为了美观增加间隔
t.penup()
t.fd(5)
def drawLine(draw):
drawGap()
t.pendown() if draw else t.penup()
t.fd(40)
drawGap()
t.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)
t.left(90)#走完第四段回到起点头仍转向X轴正方,左手边转90海龟朝Y轴正向
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)#走完第七段方向为X负轴
t.left(180)#海龟转向X正轴
t.penup()
t.fd(20)#向右跳一段距离绘制下个数字
def drawDate(date):#date为日期格式"%Y-%m+%d="对应于-+=绘制年月日汉字t.write
t.pencolor("green")
for i in date:
#t.pencolor("green")此处设置red导致后续颜色设置失效
if i == '-':
t.write('年',font=("Arial",18,"normal"))#输出到年都为红色
t.pencolor("red")
t.fd(40)
elif i == '+':
t.write('月',font=("Arial",18,"normal"))
t.pencolor("blue")
t.fd(40)
elif i == '=':
t.write('日',font=("Arial",18,"normal"))
else:
drawDigit(eval(i))#字符串转数字并画出
def main():
t.setup(900,350,200,200)#画布大小,相对位置
t.penup()
t.fd(-400)#起点(300,0)
t.pensize(5)
drawDate(time.strftime("%Y-%m+%d=",time.gmtime()))#获取计算机格式时间并转换为固定格式
t.hideturtle()#绘制完毕隐藏turtle
t.done()
main()
模块化思维(确定模块接口封装功能);规则化思维(抽象过程为规则自动执行);化繁为简
代码复用与函数递归
- 函数和对象是代码复用的两种主要形式;函数在代码层面建立初步抽象;对象在函数之上再次组织进行抽象,属性和方法
<a>.<b>和<a>.<b>()
- 模块化设计 分而治之
通过函数或对象封装将程序划分为模块及模块间的表达;具体包括:主程序、子程序、和子程序间的关系;分而治之是一种分而治之,分层抽象,体系化的设计思想
紧耦合:两部分间交流很多,无法独立存在;松耦合:两部分间交流很少,可独立存在
模块内部紧耦合,模块之间松耦合 - 递归 — 数学归纳法在编程中的体现
关键特征存在链条(计算过程中递归链条)和基例(一个或多个不需要再次递归部分)
字符串反转;斐波那契;汉诺塔
切片 s[::-1]
递归
def rvs(s):
if s == "" :
return s
else :
return rvs[1:] + s[0]#第一步看成第一个字符与后面所有的反转
count = 0
def hanoi(n,src,dst,mid):
global count
if n == 1 :#基例
print("{}:{}->{}".format(1,src,dst))
else :#链条
hanoi(n-1,src,mid,dst)#n-1搬到mid
print("{}:{}->{}".format(n,src,dst))#最下面的搬到dst
count += 1
hanoi(n-1,mid,dst,src)
模块4:PyInstaller库的使用
系统未安装idle或者解释器,将.py源代码转换成无需源代码的可执行文件,如exe(windows)
PyInstaller第三方库需要用pip工具安装 download
windows cmd命令行pip install pyinstaller
pyinstaller -i curve.ico -F <**.py>
实例8:科赫雪花小包裹
分形集合是一种迭代的几何图形,广泛存在。科赫曲线也叫雪花曲线
取一条直线,中间去掉三分之一,并由60°夹角的两条线连接原来断裂的两个三分之一线段(共4段三分之一线段);新的每条小线段继续做科赫曲线----二阶
#KochDraw.py
import turtle as t
def koch(size,n):
if n == 0:
t.fd(size)
else :
for angle in [0,60,-120,60]#递归
t.left(angle)
koch(size/3,n-1)
def main():
t.setup(600,600)
t.penup()
t.goto(-200,100)
t.pendown()
t.pensize(2)
level=3
koch(400,level)#将一个400长度的等边三角形 每个边画出3阶科赫曲线
t.right(120)#转动 等边三角形边长夹角
koch(400,level)
t.right(120)#等边三角形边长夹角
koch(400,level)
t.hideturtle()
main()
科赫曲线基础设置修改如修改成凸形,封闭基础图不选等边三角选五边形八边形形成变化