一、函数的定义
(1)一段具有特定功能的、可重用的语句组
(2)一种功能的抽象,一般函数表达特定功能
(3)两个作用:降低编程难度和代码复用
二、自定义函数:
def <函数名>(<参数(0个或多个)>):
<函数体>
return <返回值>
#例1:n的阶乘
def fact(n):
s=1
for i in range(1,n+1):
s*=i
return s
三、函数的参数传递
1.函数可以没有参数,但必须保留括号:
def <函数名>():
...
2.必选参数与可选参数:
(1)可选的意思是不指定的话就采用默认值
(2)必选参数放在可选参数前面。
(3)def <函数名>(<必选参数>,<可选参数>):
#例:n!//m
def fact(n,m=1):
s=1
for i in range(1,n+1):
s*=i
return s//m
print(fact(4))
#24
print(fact(4,5))
#4
(4)调用方法:
def fact(n,m=1):
s=1
for i in range(1,n+1):
s*=i
return s//m
#位置调用
print(fact(10,5)) #725760
#名称调用
print(fact(m=5,n=10)) #725760
3.可变数量参数:
(1)可变数量参数的意思是不给的话就没有这个参数
(2)def <函数名>(<参数>,*b):
b是随便起的名字
#例:n!再乘别的数
def fact(n,*b):
s=1
for i in range(1,n+1):
s*=i
for item in b:
s*=item
return s
print(fact(2,3))
#6
print(fact(2,3,4))
#24
四、函数的返回值
(1)可以有返回值,也可以没有
直接不写return ...或者返回空值return
(2)可以有一个返回值,也可以有多个返回值
def fact(n,m=1):
s=1
for i in range(1,n+1):
s*=i
return s//m,n,m
print(fact(10,5))
#(725760,10,5),这种类型是元组类型
#将值分别赋给a,b,c
a,b,c=fact(10,5)
print(a,b,c)
#725760 10 5
五、局部变量与全局变量
1.局部变量和全局变量是不同的变量:
-局部变量是函数内部的占位符,与全局变量可能重名但不同
-函数运算结束后,局部变量被释放。
-可以使用global保留字在函数内部使用全局变量
-是函数内外,不是循环体内外
#例1:
n,s=10,100 #n和s是全局变量
def fact(n):
s=1 #fact()函数中的n和s是局部变量
for i in range(1,n+1):
s*=i
return s
print(fact(n),s) #n和s是全局变量,s还是100
#运行结果是3628800 100
#例2:
n,s=10,100 #n和s是全局变量
def fact(n):
global s #声明此处s是全局变量s
s=1
for i in range(1,n+1):
s*=i
return s
print(fact(n),s) #此处全局变量s被函数修改
#运行结果是3628800 3628800
2.局部变量为组合数据类型且未创建,等同于全局变量
ls =["F","f"] #通过使用[]真实创建了一个全局变量列表ls
def func(a):
ls.append(a) #此处ls是列表类型,未真实创建则等同于全局变量,调用的就是外部的ls
func("C") #全局变量ls被修改
print(ls)
#运行结果是['F', 'f', 'C']
ls =["F","f"]
def func(a):
ls=[] #此处ls是列表类型,真实创建了,则ls是局部变量
ls.append(a)
func("C") #局部变量ls被修改,但不管全局变量的事
print(ls)
#运行结果是['F', 'f']
3.总结
基本数据类型,无论是否重名,局部变量与全局变量都不同
组合数据类型,如果局部变量未真实创建,则是全局变量;如果真实创建,则不是
六、lambda函数
lambda函数介绍;
(1)lamda函数是一种匿名函数,即没有名字的函数
(2)使用lamda函数保留字定义,函数名是返回结果
(3)lamda函数用于定义简单的、能够在一行内表示的函数
(4)<函数名>=lamda <参数> : <表达式>
f=lambda x,y : x+y
print(f(10,15))
#25
f=lambda : "lambda函数"
print(f())
#lambda函数
七、函数递归的理解
1.递归的定义:
(1)特征:
-链条:计算过程存在递归链条
-基例:存在一个或多个不需要再次递归的基例
(2)类似数学归纳法
-数学归纳法:证明当n取第一个值n(0)时命题成立。假设当n(k)时命题成立,证明当n=n(k+1)时命题也成立
-递归是数学归纳法思维的编程体现
2.函数递归的调用过程
递归的实现:
(1)函数+分支:
-递归本身是一个函数,需要函数定义方式描述
-函数内部,采用分支语句对输入参数进行判断
-基例和链条,分别编写对应代码
(2)过程:
-每执行一次递归,便分配一段新内存给不同的递归
-调用的是自身代码的多个副本
#n的递归:
def fact(n):
if n==0:
return 1 #注意这个n的意思:这个n是上一次函数传入的参数n-1
else:
return n*fact(n-1)
print(fact(4))
#24
3.函数递归实例解析
#例1:字符串反转:
#-切片:s[::-1]更简单
#-递归;
def rvs(s):
if s=="":
return s
else:
return rvs(s[1:])+s[0]
print(rvs("python"))
#nohtyp
#例2:斐波那契数列1,1,2,3,5,8,13,...
def f(n):
if n==1 or n==2:
return 1
else:
return f(n-1)+f(n-2)
for i in range(1,8):
print(f(i))
#例3:汉诺塔:把n圆盘从原柱搬到目标柱,就要把n-1圆盘搬到目标柱
count=0
def hanoi(n,src,dst,mid): #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","C","B")
print("次数:",count)