函数的创建
def 函数名 ([输入参数]):
函数体
[return xxx]
函数的调用
函数名 ([实际参数])
函数的参数传递
函数调用的参数传递
1、位置实参
参数传递规则与c一致
2、关键字实参
def cal(a,b)
result = cal (b=10,a=20)
函数调用的参数传递内存分析
形参实参标识符可以不一样。
如果参数是不可变对象,函数中对临时变量的操作不会影响实参,函数运行结束后内存被释放;如果是可变对象,在函数体的修改会改变实参的值。
函数返回多个值时,结果为元组
1、不需要函数给调用处提供数据时,不写return
2、只需要返回一个数据时,直接返回类型
3、返回多个值时,返回结果为元组
函数的参数定义
函数定义默认值参数
函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参。
个数可变的位置参数
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数。
使用*定义个数可变的位置形参。
结果为一个元组。
个数可变的关键字形参
定义函数时无法事先确定传递的关键字实参的个数时,使用可变的关键字形参。
使用**定义个数可变的关键字形参。
结果为一个字典。
def fun(*args): #函数定义时的 可变的位置参数
print(args)
#print(args[0])
fun(10)
fun(10,30)
fun(30,405,50)
def fun1(**args):
print(args)
fun1(a=10)
fun1(a=20,b=30,c=40)
注:个数可变的参数只能定义一个。若既有个数可变的位置参数也有关键字参数可以这样定义:并且两形参的前后放置关系不能反
def fun2(*arg1,**arg2):
pass
特别地:
def fun(a,b,c):#a,b,c在函数的定义处,所以是形式参数
print('a=',a)
print('b=',6)
print('c=',c)
#函数的调用
fun(10,20,30) :#函数调用时的参数传递,称为位置传参
1st=[11,22,33]
fun(*1st)
#在函数调用时,将列表中的每个元素都转换为位置实参传入
fun(a=100,c=300,b=200):#关键字形参
dic={'a':111,' b':222,'c':333}
fun(**dic)
变量的作用域
变量的作用域
程序代码能访问该变量的区域
根据变量的有效范围可分为:
局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会变成全局变量。
全局变量:函数,体外定义的变量,可作用于函数内外。
def fun(a,b)
global age
age = 20
peint(age)
递归函数
什么是递归函数
如果在一个函数的函数体内调用了该函数,这个函数就称为递归函数。
递归的组成部分
递归调用与递归终止条件。
递归的调用过程
每递归调用一次函数,都会在栈内存分配一个栈帧。
每执行完一次函数,都会释放相应的空间。
递归的优缺点
缺点:占用内存多,效率低下。
优点:思路和代码简单。
应用1:使用递归计算阶乘
def fac(n)
if n==1
return 1
else
return m*fac(n-1)
应用2:使用递归计算斐波那契数列
#计算斐波那契数列第n位的数字
def fib(n):
if n==1:
return 1
elif n==2:
return 2
else:
return fib(n-1)+fib(n-2)
#输出这个数列的前6位上的数字
for i in range(1,7)
peintf(fib(i))