函数的创建和调用:
函数的创建和调用
为什么需要函数:复用代码
隐藏实现细节
提高可维护性
提高可读性便于调试函数的创建:
def 函数名([输入参数]):
函数体
[return xxx]
def calc(a,b):#a b为形式参数,简称为形参,形参的位置是在函数的定义处
c=a-b
return c
result=calc(10,20)#输出-10,10,20称为实际参数的值,简称为实参,实参的位置是函数的 调用处
print(result)
res=calc(b=10,a=20)#10,会根据等号左侧的变量名字(关键字)来传参
print(res)
函数调用的参数传递内存分析
def fun(arg1,arg2):
print('arg1:',arg1)
print('arg2:',arg2)
arg1=100
arg2.append(10)
print('arg1',arg1)
print('arg2',arg2)
n1=11
n2=[22,33,44]
fun(n1,n2)#按照位置顺序传参,arg1,arg2是函数定义处的形参,n1,n2是函数调用处的实参,总结,实参名称与形参名称可以不一致
print('n1',n1)
print('n2',n2)
在函数的调用过程中,进行参数的传递,是否影响实参的值取决于其是否为可变对象
如果是不可变对象,在函数体的修改不会影响实参的值,arg1的值修改为100,不会影响n1的值
如果是可变对象,在函数体的修改会影响到实参的值,arg2的修改,append(10)会影响n2的值
函数参数的定义:
函数的参数定义:
函数的参数定义默认值参数:
函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参个数可变的位置参数:
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
使用*定义个数可变的位置形参
结果为一个元组个数可变的关键字形参:
定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
使用**定义个数可变的关键字形参
结果为一个字典
'''
'''
def fun(a, b=10): # b为默认值参数
print(a, b)
# 函数的调用
fun(100) # 100赋给a
fun(20, 30) # 20赋给a,30赋给b
print('hello',end='\t')#print的默认end值是换行,可以进行修改为其他值
print('world')
#个数可变的位置参数
def fun1(*args):#函数定义时,可变的位置参数
print(args)
print(args[0])#输出第一个参数
fun1(10)
fun1(10,20)
fun1(10,30,405,50)
#个数可变的关键字形参
def fun2(**args):
print(args)
fun2(a=10)#{'a': 10}
fun2(a=20,b=30,c=40)#{'a': 20, 'b': 30, 'c': 40}
'''def fun3(*args,*a):#报错:SyntaxError: invalid syntax,个数可变的位置参数只可以定义一个
pass'''
'''def fun3(**args,**args):
pass
以上代码,程序也会报错,说明函数中个数可变的关键字形参也只能有一个
'''
def fun3(*args1,**args2):
pass
'''def fun4(**args1,*args2):
pass
SyntaxError: invalid syntax,上述代码报错,说明
'''
'''
上述代码fun3不报错fun4报错,说明在函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求个数可变的位置形参放在个数可变的关键字形参之前
'''
函数返回值
def fun(num):
odd=[] #存奇数
even=[] #存偶数
for i in num:
if i%2:
odd.append(i)
else:
even.append(i)
return odd,even
print(fun([10,29,34,43,53,55]))
'''
函数的返回值:
(1)如果函数没有返回值【函数执行完毕之后不需要给调用处提供数据,此时return可以省略不写】
(2)函数的返回值,如果是1个,直接返回原值
(3)函数的返回值如果是多个,返回的结果为元组
'''
def fun1():
print('hello')
return
fun1()
def fun2():
return 'hello'
res=fun2()
print(res)
def fun3():
return 'hello','world'
print(fun3())#('hello', 'world')
'''
函数在返回时是否需要返回值,视情况而定
'''
参数传递小结
def fun(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
#函数的调用
fun(10,20,30)
lst=[11,22,33]
'''
fun(lst)#程序会报错
'''
fun(*lst)#在函数调用时,将列表中的每个元素都转换为位置实参传入,输出a=11 b=22 c=33
fun(a=100,c=300,b=200)#函数的调用,所以是关键字实参,输出a=100 b=200 c=300
dic={'a':111,'b':222,'c':333}
'''
fun(dic)
也会报错
'''
fun(**dic)#在函数调用中,将字典中的键值对都转换为关键字实参传入,输出a=111 b=222 c=333
def fun1(a,b=10): #b实在函数的定义处,所以b是形参,而且进行了赋值,所以b称为默认值形参
print('a=',a)
print('b=',b)
def fun2(*args): #个数可变的位置形参
print(*args)
def fun3(**args2): #个数可变的关键字形参
print(args2)
fun2(10,20,30,40)#输出10 20 30 40
fun3(a=11,b=22,c=33,d=44,e=55)#输出{'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
def fun4(a,b,c,d):
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
#调用fun4函数
fun4(10,20,30,40) #位置实参传递
fun4(a=10,b=20,c=30,d=40) #关键字实参传递
fun4(10,20,c=30,d=40) #前两个参数采用位置实参传递,cd采用关键字实参传递
'''
需求:c,d只能采用关键字实参传递,那么需要在b和c之间加入*,变成:
def fun4(a,b,*,c,d):
例如fun5:
'''
def fun5(a, b, *,c, d):#从*之后的参数在函数调用时,只能采用关键字传递
print('a=', a)
print('b=', b)
print('c=', c)
print('d=', d)
# 调用fun5函数
#fun5(10, 20, 30, 40) # 位置实参传递,报错fun5() takes 2 positional arguments but 4 were given
fun5(a=10, b=20, c=30, d=40) # 关键字实参传递
fun5(10, 20, c=30, d=40) # 前两个参数采用位置实参传递,cd采用关键字实参传递
'''函数定义时的形参的顺序问题:以下几种方式皆可'''
def fun6(a,b,*,c,d,**args):
pass
def fun7(*args):
pass
def fun8(a,b=10,*args,**args1):
pass
变量的作用域
'''
变量的作用域:
局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会变为全局变量
全局变量:函数体外定义的变量,可作用于函数内外
'''
def fun(a,b):
c=a+b #c即为局部变量,因为c是在函数体内进行定义的变量,a,b为函数的形参,作用范围也是函数内部,相当于局部变量
print(c)
name='杨老师' #name为全局变量,函数内部和外部都可以使用
print(name)
def fun2():
print(name) #输出杨老师
fun2()
def fun3():
age=20
global age2 #global声明的age2为全局变量,可以在函数内外部使用
age2 = 19
print(age)
fun3()
print(age2)#输出19
递归函数
'''
递归函数:
如果在一个函数体内调用了该函数本身,则这个函数称为递归函数
递归的组成部分:
递归调用与递归终止条件
递归的调用过程:
每递归调用一次函数,都会在栈内存分配一个栈帧
每执行完一次函数,都会释放相应的空间
递归的优缺点:
缺点:占用内存多,效率低下
优点:思路和代码简单
'''
def fac(n):
if n==1:
return 1
else:
return n*fac(n-1)
print(fac(6))
def fib(n):
if n==1 or n==2:
return 1
else:
return fib(n-1)+fib(n-2)
print(fib(6))
for i in range(1,7):
print(fib(i))