目录
声明:本文只是个人的学习笔记,代码带源于中国大学
5.1函数的定义与使用
一、函数理解和定义
1.两个作用:降低编程难度和代码复用
2.def <函数名>(<参数(0个或多个)>):
<函数体>
return <返回值>
3.函数定义时,所指定的参数是一种占位符
二、函数的参数传递
1.可选参数传递(函数定义时可以为某些参数指定默认值,构成可选参数)
<非可选参数>,<可选参数>
2.可变参数传递(既不确定参数总数量)
<参数>,*b
def fact(n,*b): s=1 for i in range(1,n+1): s*=i for item in b: s*=item return s
3.函数调用时,参数可以按照位置或名称方式传递
三、函数的返回值
1.renturn可以传递0个返回值,也可以传递任意多个返回值
def fact(n,m=1): 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
四、局部变量和全局变量
规则1:局部变量和全局变量是不同变量
1.局部变量是函数内部的占位符,与全局变量可能重名但不同;函数运算结束后,局部变量被释放;
2可以使用global保留字在函数内部使用全局变量
n,s=10,100 def fact(n): global s for i in range(1,n+1): s*=i return s print(fact(n),s)
规则2:局部变量为组合数据类型且未创建,等同于全局变量
ls=["F","f"] def func(a): ls.append(a)#此处ls是列表类型,未真实创建则等同于全局变量 return func("C") print(ls) >>> ['F', 'f', 'C']
ls=["F","f"] def func(a): ls=[]#此处ls是列表类型,真实创建 ls.append(a)#此处ls是列表类型,未真实创建则等同于全局变量 return func("C") print(ls) ===== ['F', 'f']
3.lambda函数(lambda函数返回函数名作为结果)
-lambda函数是一种匿名函数,即没有名字的函数
-使用lambda保留字定义,函数名是返回结果
-lambda函数用于定义简单的,能够在一行内表示的函数
<函数名>=lambda <参数>:<表达式>
>>> f=lambda x,y:x+y >>> f(10,15) 25 >>> f=lambda:"lambda函数" >>> print(f()) lambda函数
lambda函数的应用(谨慎使用lambda函数)
-lambda函数主要用作一些特定函数或方法的参数
五、函数的定义与使用
-使用保留字def定义函数,lambda定义匿名函数
-可选参数(赋初值),可变参数(*b),名称传递
-保留字return可以返回任意多个结果
-保留字global声明使用全局变量,一些隐式规则
5.2实例7:七段数码管绘制
import turtle,time
def drawGap():#绘制数码管间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw):#绘制单端数码管
drawGap()
turtle.pendowm() 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,7,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)
draw.left(180)
turtle.penup()#为绘制后续数字确定位置
turtle.fd(20)#为绘制后续数字确定位置
def drawDate(date):#获得要输出的数字
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()
5.3代码复用与函数递归
一、代码复用(把代码当成资源进行抽象)
函数和对象是代码复用的两种主要形式
函数:将代码命名在代码层面建立了初步抽象
对象:属性和方法<a>.<b>和<a>.<b>()在函数之上再次组织进行抽象
二、模块化设计
通过函数或对象封装将程序划分为模块及模块间的表达
具体包括:主程序,子程序和子程序间关系
紧耦合:两个部分之间交流很多,无法独立存在
松耦合:两个部分之间交流较少,可以独立存在
模块内部紧耦合,模块之间松耦合
三、递归的定义
1.链条:计算过程存在递归链条
基例:存在一个或多个不需要再次递归的基例
2.字符串反转(将字符串s反转后输
def rvs(s):
if s=="":
return s
else:
return rvs(s[1:])+s[0]
5.4模块4:PyInstaller库的使用
1.将.py源代码转换成无需源代码的可执行文件
2.PyInstaller库是第三方库,使用前需要额外安装,安装第三方库需要使用pip工具