目录
函数的定义及函数的参数调用
def calc(a,b):
return a+b
print(calc(1,2))
实参和形参与C语言相同
1.位置传参:
def calc(a,b):
return a+b
print(calc(1,2))
2.关键字传参
def calc(a,b):
return a+b
print(calc(a=2,b=1))
注意函数参数的默认值
def calc(a,b=10):
return a+b
print(calc(1))
print(calc(1,2))
#11
#3
如果调用函数时,不传入默认值,则函数将按照内置的默认值进行计算
如果调用函数时,传入默认值,则函数以传入的默认值为主
函数参数传递的内存分析
先分析示例
def fun(arg1,arg2):
print(arg1)
print(arg2)
arg1 = 100
arg2.append(10)
print(arg1)
print(arg2)
n1 = 10
n2 = [1,2,3,4]
print(n1)
print(n2)
fun(n1,n2)
print(n1)
print(n2)
"""10
[1, 2, 3, 4]
10
[1, 2, 3, 4]
100
[1, 2, 3, 4, 10]
10
[1, 2, 3, 4, 10]"""
我们可以发现在无返回值的函数内,改变形参的值,不会影响实参
而对于列表n2,fun函数进行的增删改操作后,列表内的值发生改变。
所以我们可以得出结论:
在函数调用的过程中,进行参数传递 如果实参是不可变对象(字符串,元组),在函数体的修改不会影响实参的值。 如果实参是可变对象(列表,字典,集合),在函数体的修改(增/删/改/替换操作)会影响实参的值。
函数的返回值
def fun(num):
odd = []
even = []
for i in range(0,num+1):
if i%2:
odd.append(i)
else:
even.append(i)
return odd,even
print(fun(10))
#([1, 3, 5, 7, 9], [0, 2, 4, 6, 8, 10])
我们可以看见,当函数返回值为多个时,函数的返回值类型为元组
个数可变的位置形参和关键字形参
1.个数可变的位置形参
def fun(*args):#函数定义时,可变的位置参数
print(args)
print(args[0])
fun(10)
fun(20,30)
#返回值是元组
'''(10,)
10
(20, 30)
20'''
有多个返回值,则返回类型为元组
2.个数可变的关键字形参
def fun(**args):#函数定义时,可变的位置参数
print(args)
print(args['a'])
fun(a=10)
fun(a=20,b=30)
有多个返回值,则返回类型为字典
注意:如果函数参数有上述两种类型的传参,则位置形参需要放在前面
函数的传参的总结
1.将列表中所有的元素转换为位置形参,只需在列表前加*
#将序列中所有的元素转换为位置形参
def fun1(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
lst = [10,20,30]
#fun1(lst)报错,因为只传入了一个参数
fun1(*lst)
2.将字典中所有的元素转换为形参,只需要在字典前加**
def fun1(a,b,c):
print('a=',a)
print('b=',b)
print('c=',c)
dic = {'a':111,'b':333,'c':332}
#fun1(dic)报错
fun1(**dic)
全局变量和局部变量
在函数内定义的变量为局部变量,global 变量名,可以将其改变为全局变量
def fun(name):
global age
age = 20
print(name)
print(age)
fun('hehe')
#hehe
#20
#print(age)NameError: name 'age' is not defined
#因为age为局部变量
print(age)
递归函数
def fac(n):
if n == 1:
return 1
else:
return n * fac(n - 1)
print(fac(3))