函数的定义
函数是一段就具有特定功能的、可重复调用的语句组,用函数名来表示并通过函数名进行功能调用,而不需要在每个执行的地方重复编写这些语句。
函数能够完成特定功能,与黑盒类似,对函数的使用不需要了解函数内部实现的原理,只要了解函数的输入输出方式即可。严格地说,函数是一种功能抽象。
函数表示方式
def <函数名>(<输入参数>):
<函数体>
return <返回值>
参数列表是调用该函数时传递给它的数值,可以由零个、一个或者多个,当传递多个参数时,各参数采用逗号分隔,当没有参数时也要保留小括号。
函数的调用过程
1.调用程序在调用处暂停执行
2.在调用时将实参复制给函数的形参
3.执行函数体语句
4.函数调用结束给出返回值,程序回到调用前的暂停处继续执行
函数的参数传递
形参:全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。
实参:全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
b=[4,5,6]
print(b)
def test (d): #定义函数test,其中d为形参
b=[7,8,9]
print("函数内部变量",b)
print("输入参数",d,"并用0替换4")
d[0]=0
def main():
print("全局变量b",b)
print("现在调用函数test输入b")
test(b) #调用函数test,其中赋值给函数的b,就是实参
print("函数调用结束")
print("全局变量b",b)
main()
参数默认值:在函数定义时,如果有些参数存在默认值,即部分参数不一定需要调用程序输入,可以在定义函数时直接为这些参数指定默认值。当函数被调用时,如果没有传递对应的参数值,则使用函数定义时的默认值替代。
可选参数:由于函数调用时需要按顺序输入参数,可选参数必须定义在非可选参数的后面。(例如该形参已有默认值,函数调用时可以不输入参数值,所以该形参为可选参数)
可变数量参数:在函数定义时们可以设计可变数量参数,通过在参数前面增加星号(*)实现。带有星号的可变数量参数只能出现在参数列表的最后。
def test (a,d=1,*c):
<函数体>
'''
其中d是带默认值的参数,如果调用函数时不赋值给b,那么b默认等于1
*c是可变数量参数,它可以是零个或者多个输入,可变数量参数只能出现在参数列表的最后
'''
传递方式:函数调用时,实参默认采用按照位置顺序的方式传递给函数。同时,python提供了按照形参名称输入实参的方式,由于调用函数时指定了参数名称,所以参数之间的顺序可以任意调整。
函数对变量的作用
全局变量:全局变量是指在函数之外定义的变量,一般没有缩进,在程序执行全过程有效。
局部变量:指在函数内部使用的变量,只作用函数内部,函数一但结束,该变量即得到释放,即使函数多次调用,函数之间互不影响。
列表:列表的赋值和传递,仅仅是产生列表的一个新的引用。即,列表在内存中只有存在一个,对于该列表对其它地方赋值或者传递,只是对该内存的一个新的引用。所以,在函数中,列表有点类似全局变量。传递进函数内部进行计算的列表,对于该列表,只要函数中对列表进行修改了,该列表就修改了,函数外部的该列表也就修改了。
b=[4,5,6] #全局变量
print(b) #打印全局变量b
def test (d): #定义函数test,输入全局变量b
b=[7,8,9] #局部变量b
print("函数内部变量",b)
print("输入参数",d,"并用0替换4")
d[0]=0
def main():
print("全局变量b",b)
print("现在调用函数test输入b")
test(b)
print("函数调用结束")
print("全局变量b",b) #函数内部改变列表b,函数外部列表b发生改变
main()
输出:
递归
函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用,也就是函数调用函数本身。这种函数定义中调用函数自身的方式称之为递归。
递归的两个关键特征:
1.存在一个或多个基例,基例不需要再次递归,他是确定的表达式。
2.所有递归链要以一个或多个基例结尾
(递归函数是由限制的,当满足某个条件时结束递归调用,即递归函数不可以无限调用自身)
绘制多边形
import turtle
pi=3.1415926 #定义Π
def Astep(long,direction,angle): #画一条线,输入线的长度,之后的方向状态
turtle.pendown()
turtle.fd(long)
if direction==1:
turtle.right(angle)
else:
turtle.left(angle)
turtle.penup()
def Analyse(n,l=800): #n边形,计算多边形内角
angle=(n-2)*180/n
angle=180-angle
long=l/n
d=l/pi/2
x=pow(pow(d,2)/2,0.5)
turtle.goto(-x,x)
for i in range(n):
Astep(long,1,angle,)
def SetWin(wid=800,hig=600,startX=200,startY=200,Psize=5,Pcolor="black"): #窗口初始化设置
turtle.setup(wid,hig,startX,startY)
turtle.pensize(Psize)
turtle.pencolor(Pcolor)
turtle.speed(1)
turtle.penup()
def infor(): #用户需求信息收集
n=eval(input("请输入多边形边数(大于2且是整数):"))
r=eval(input("请输入多边形周长,不确定时请输入“0”"))
return n,r
def main(): #主函数
n,r=infor()
SetWin()
if r==0:
Analyse(n)
else:
Analyse(n,r)
main()