1、函数定义
(1)函数:完成特定功能的一个语句组,通过调用函数名来完成语句组的功能。
为函数提供不同的参数,可以实现对不同数据的处理
函数可以反馈结果
(2)分类:
自定义函数:用户自己编写的
系统自带函数: Python内嵌的函数(如abs()、eval())、 Python标准库中的函数(如math库中的sqrt())、图形库中的方法(如myPoint.getX())等
(3)函数定义:使用def语句
def ():
函数名:可以是任何有效的Python标识符
参数列表:是调用函数时传递给它的值(可以由多个,一个,或者零个参数组成,当有多个参数时,各个参数用逗号分隔)
参数个数大于等于零,多个参数由逗号分隔
(4)形参,实参
形式参数:定义函数时,函数名后面圆括号中的变量,简称“形参”。形参只在函数内部有效
实际参数:调用函数时,函数名后面圆括号中的变量,简称 “实参”。
2、示例
1 defhappy():2 print("happy birthday to you!")3
4 defsing(person):5 print("happy birthday to"+person+‘!‘)6 happy()7 happy()8 sing(‘hanmeimei‘)9 happy()
调用两个函数
1 defsing(person):2 print("happy birthday to you!")3 print("happy birthday to you!")4 print("happy birthday to"+person+‘!‘)5 print("happy birthday to you!")6
7 sing(‘hanmeimei‘)
只调用一个函数的程序,明显比两个函数要繁琐,所以重复性质的代码,定义函数可以减少工作量。
3、函数的返回值
return语句:程序退出该函数,并返回到函数被调用的地方。return语句返回的值传递给调用程序
Python函数的返回值有两种形式:
返回一个值
返回多个值
(1)无返回值的return语句等价于return None。
(2)返回值可以是一个变量,也可以是一个表达式。
1 defsquare(x):2 y=x*x3 returny4 defsquare1(x):5 return x*x6 a=square(2)7 b=square1(3)8 print(a)9 print(b)
(3)三角形周长函数
1 importmath2
3 defsquare(x):4 return x*x5 defdistance(x1,y1,x2,y2):6 L=math.sqrt(square(x1-x2)+square(y1-y2))7 returnL8 defisTriangle(x1,y1,x2,y2,x3,y3):9 flag=((x1-x2)*(y3-y2)-(x3-x2)*(y1-y2))!=010 returnflag11
12 defmain():13 print("输入三个点的坐标:")14 x1,y1=eval(input("x1,y1="))15 x2,y2=eval(input("x2,y2="))16 x3,y3=eval(input("x3,y3="))17 if(isTriangle(x1,y1,x2,y2,x3,y3)):18 perim=distance(x1,y1,x2,y2)+distance(x1,y1,x3,y3)+distance(x2,y2,x3,y3)19 print(‘the primeter is‘,perim)20 else:21 print(‘this is not triangle‘)22 main()
1 importmath2
3 defsquare(x):4 return x*x5 defdistance(x1,y1,x2,y2):6 L=math.sqrt(square(x1-x2)+square(y1-y2)) #嵌套了求平方的函数
7 returnL8 defisTriangle(x1,y1,x2,y2,x3,y3):9 if ((x1-x2)*(y3-y2)-(x3-x2)*(y1-y2))!=0: #比例算法,三点在不在一条线
10 return 1
11
12 defmain():13 print("输入三个点的坐标:")14 x1,y1=eval(input("x1,y1="))15 x2,y2=eval(input("x2,y2="))16 x3,y3=eval(input("x3,y3="))17 if(isTriangle(x1,y1,x2,y2,x3,y3)):18 perim=distance(x1,y1,x2,y2)+distance(x1,y1,x3,y3)+distance(x2,y2,x3,y3)19 print(‘the primeter is:{0:0.3f}‘.format(perim))20 print(‘the primeter is %0.3f‘%perim)#两种输出方法
21 else:22 print(‘this is not triangle‘)23 main()
将简化后的判断是否是三角形的布尔语句补充完整了,用了两种输出方式来输出内容;注意将比例式写成乘法式简化判断条件。
4、函数的返回值return
(1)
1 defisTriangle(num):2 if num!=0: #比例算法,三点在不在一条线
3 return 1
4 else:5 return06
7 a=eval(input("输入数字:"))8 print(isTriangle(a))
defisTriangle(num):if num!=0: #比例算法,三点在不在一条线
return 1a=eval(input("输入数字:"))print(isTriangle(a))
不符合条件时输出None。
1 defisTriangle(num):2 length=num!=03 returnlength4
5 a=eval(input("输入数字:"))6 print(isTriangle(a))
length=num!=0,这个布尔表达式,是先判断num是否等于0,如果不等于零,则True,如果等于0,则False,length等于这两种情况。
(2)
1 defaddinterest(balance,rate):2 newBalance=balance*(1+rate)3 returnnewBalance4 defmain():5 amount=1000
6 rate=0.05
7 amount=addinterest(amount,rate)8 print(amount)9 main()
(3)单个数和列表返回数的区别
1 defaddinterest(balance,rate):2 balance=balance*(1+rate)3
4 defmain():5 amount=1000
6 rate=0.05
7 addinterest(amount,rate)8 print(amount)9 main()
可以看出函数形参的值并没有返回给实参,所以最后出来的还是1000,需要像上面的程序一样,明确表明返回值,才能运行出来1050.
1 defaddinterest(balances,rate):2 for i inrange(len(balances)):3 balances[i]=balances[i]*(1+rate)4 defmain():5 amounts=[1000,900,830,400]6 rate=0.05
7 addinterest(amounts,rate)8 print(amounts)9 main()
对比上面,数组类型的值可以直接返回。视频中介绍说是原来数值被掩盖,本质原理搞不懂。?????
将这段代码改为有返回值的情况如下。
1 defaddinterest(balances,rate):2 for i inrange(len(balances)):3 balances[i]=balances[i]*(1+rate)4 returnbalances5 defmain():6 amounts=[1000,900,830,400]7 rate=0.05
8 amounts=addinterest(amounts,rate)9 print(amounts)10 main()
(4)函数的拆分
1 print("this program plots the growth of a 10-years investment")2 #principal=eval(input("enter the initial principal"))
3 #apr=eval(input("enter the annualized interest rate"))
4 principal=1000
5 apr=0.2
6 for year in range(1,11):7 principal=principal*(1+apr)8 print("%2s"%year,end=‘‘)#前面是输出年份,后者是保留一行
9 total=int(principal*4/1000) #四个~代表1000
10 print("~"*total)#前面是输入符号,后面是数量,中间用*链接
11 print("0.0k 2.5k 5.0k 7.5k 10.0k")
将部分功能拆分出来,形成单独函数
1 deftotalnum(principal):2 total=int(principal*4/1000)3 returntotal4
5 defcreatTable(principal,rate):6 for year in range(1,11):7 principal=principal*(1+rate)8 print("%d"%year,end="")9 total=totalnum(principal)10 print("~"*total,end=‘‘)11 print("%.2f"%principal)12
13 defmain():14 principal=1000
15 apr=0.2
16 creatTable(principal,apr)17
18 main()
注意,想要不换行的联接 end=‘‘,输入符号‘~’*num,的形式
5、递归
(1)递归的定义递归不是循环
最后计算基例:0!。 0!是已知值
递归定义特征 :有一个或多个基例是不需要再次递归的;所有的递归链都要以一个基例结尾。
(2)阶乘
1 deffact(n):2 if n==0:3 return 1
4 else:5 return n*fact(n-1)6 n=2
7 print(fact(n))
递归和循环不一样,递归时多次调用一个函数,而循环是在一个函数中多次重复计算。
(3)字符串反转
Python列表有反转的内置方法
方法1:字符串转换为字符列表,反转列表,列表转换回字符串
方法2:递归
1 defreverse(s):2 if s=="":3 returns4 else:5 return s[1:]+s[0]6
7 s=‘hello‘
8 s=reverse(s)9 print(s)
一定要给递归一个初值,要不会造成死循环。
(4)树
1 from turtle import *
2
3 def tree(plist,l,a,f):#l 画的初始长度,a角度
4 if l>5:5 lst=[]6 for p inplist:7
8 p.forward(l)9 q=p.clone()#克隆p
10 p.left(a)11 q.right(a)12 lst.append(p)13 lst.append(q)14 tree(lst,l*f,a,f)15
16 defmain():17 p=Turtle()18 p.color(‘green‘)19 p.pensize(5)20 p.hideturtle() #隐藏箭头
21 p.speed(9)22 #p.getscreen().tracer(3,0)
23 p.left(90) #向左转90度,竖直向上
24 p.penup() #提起画笔
25 p.goto(0,-200) #26 p.pendown()27 t=tree([p],110,65,0.6375)28
29 main()
Python——函数