函数的创建和调用:
函数的创建和调用
为什么需要函数:
复用代码
隐藏实现细节
提高可维护性
提高可读性便于调试
函数的创建:
def 函数名([输入参数]):
函数体
[return xxx]
def calc(a,b):
c=a-b
return c
result=calc(10,20)
print(result)
res=calc(b=10,a=20)
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)
print('n1',n1)
print('n2',n2)
在函数的调用过程中,进行参数的传递,是否影响实参的值取决于其是否为可变对象
如果是不可变对象,在函数体的修改不会影响实参的值,arg1的值修改为100,不会影响n1的值
如果是可变对象,在函数体的修改会影响到实参的值,arg2的修改,append(10)会影响n2的值
函数参数的定义:
函数的参数定义:
函数的参数定义默认值参数:
函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参
个数可变的位置参数:
定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
使用*定义个数可变的位置形参
结果为一个元组
个数可变的关键字形参:
定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
使用**定义个数可变的关键字形参
结果为一个字典
'''
'''
def fun(a, b=10):
print(a, b)
fun(100)
fun(20, 30)
print('hello',end='\t')
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)
fun2(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())
'''
函数在返回时是否需要返回值,视情况而定
'''
参数传递小结
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)
fun(a=100,c=300,b=200)
dic={'a':111,'b':222,'c':333}
'''
fun(dic)
也会报错
'''
fun(**dic)
def fun1(a,b=10):
print('a=',a)
print('b=',b)
def fun2(*args):
print(*args)
def fun3(**args2):
print(args2)
fun2(10,20,30,40)
fun3(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(10,20,30,40)
fun4(a=10,b=20,c=30,d=40)
fun4(10,20,c=30,d=40)
'''
需求: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(a=10, b=20, c=30, d=40)
fun5(10, 20, c=30, d=40)
'''函数定义时的形参的顺序问题:以下几种方式皆可'''
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
print(c)
name='杨老师'
print(name)
def fun2():
print(name)
fun2()
def fun3():
age=20
global age2
age2 = 19
print(age)
fun3()
print(age2)
递归函数
'''
递归函数:
如果在一个函数体内调用了该函数本身,则这个函数称为递归函数
递归的组成部分:
递归调用与递归终止条件
递归的调用过程:
每递归调用一次函数,都会在栈内存分配一个栈帧
每执行完一次函数,都会释放相应的空间
递归的优缺点:
缺点:占用内存多,效率低下
优点:思路和代码简单
'''
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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)