目录
一.什么是函数
· 函数就是执行特定任务以完成特定功能的一段代码
二.为什么需要函数
· 复用代码
· 隐藏实现细节
· 提高可维护性
· 提高可读性便于调试
三.函数的创建
def 函数名(输入参数):
函数体
return xxx
函数的创建:
def sum(a,b):
c =a+b
return print(c)
函数的调用:
sum(10,20)
打印:
30
-----------------------------------------------
def sum(a,b):
c =a+b
return c
print(sum(10,20))
四.函数调用的参数传递
- 位置实参
- 根据形参对应的位置进行实参传递
def calc(a,b):
calc(10,20) #10对应a,20对应b
- 关键字实参
- 根据形参名称进行实参传递
def calc(a,b):
calc(b=10,a=20)
五.函数调用的内存分析
'''在函数调用过程中,进行参数传递 如果是不可变对象,在函数体的修改不会影响实参的值 如果是可变对象,在函数体的修改会影响到实参的值 '''
n1=11
n2=[22,33,44]
print('n1:',n1)
print('n2:',n2)
print('------------------------------------------------')
def fun(arg1,arg2):
print('arg1:',arg1)
print('arg2:',arg2)
arg1=100
arg2.append(10)
print('arg1:',arg1)
print('arg2:',arg2)
fun(n1,n2)
'''在函数调用过程中,进行参数传递
如果是不可变对象,在函数体的修改不会影响实参的值
如果是可变对象,在函数体的修改会影响到实参的值
'''
print('-------------------------------------------------')
print('n1',n1)
print('n2',n2)
打印:
n1: 11
n2: [22, 33, 44]
------------------------------------------------
arg1: 11
arg2: [22, 33, 44]
arg1: 100
arg2: [22, 33, 44, 10]
-------------------------------------------------
n1 11
n2 [22, 33, 44, 10]
六.return函数返回值为多个时,结果为元组
def fun2(num):
odd=[]
even=[]
for i in num:
if i % 2:
odd.append(i)
else:
even.append(i)
return odd,even
lis=[1,2,3,4,5]
print(fun2(lis))
打印:
([1, 3, 5], [2, 4])
---------------------------------------------
def fun2(num):
odd=[]
even=[]
for i in num:
if i % 2:
odd.append(i)
else:
even.append(i)
return odd
lis=[1,2,3,4,5]
print(fun2(lis))
打印:
[1, 3, 5]
七.函数的返回值
- 如果函数没有返回值【函数执行完毕之后,不需要给调用处提供数据】return可以省略不写
- 函数的返回值,如果是1个,直接返回类型
- 函数的返回值,如果是多个,返回的结果为元组
- 函数在定义时,是否需要返回值,视情况而定
def fun1():
print("hello")
fun1()
def fun2():
return 'hello,word'
print(fun2())
def fun3():
return 'hell','word'
print(fun3())
打印:
hello
hello,word
('hell', 'word')
八.函数的参数定义
1.函数定义默认值参数
- 函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参
def fun1(a,b=10):
print(a,b)
fun1(30)
fun1(30,20)
打印:
30 10
30 20
2.个数可变的位置参数 *
- 定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
- 使用 * 定义个数可变的位置形参
- 结果为一个元组
- 有多个参数时,只能给最后一个参数定义 *
- * 和 ** 同时使用时,需 * 在前 ** 在后
- 每个函数中只能有1个
def fun1(*a):
print(a)
fun1(10,220,30)
打印:
(10, 220, 30)
----------------------------
def fun1(a,*b):
print(a,b)
fun1(10,220,30)
打印:
10 (220, 30)
- 可反向调用,把列表中的元素转为实参传入 *list
- 列表中的元素需要与函数中的参数个数对应
def fun1(a,b,c):
print(a,b,c)
lis=[10,20,30]
fun1(*lis)
打印:
10 20 30
3.个数可变的关键字形参 **
- 定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参
- 使用 ** 定义个数可变的关键字形参
- 结果为一个字典
- 有多个参数时,只能给最后一个参数定义 **
- * 和 ** 同时使用时,需 * 在前 ** 在后
- 每个函数中只能有1个
def fun1(**a):
print(a)
fun1(小明=10,小李=20)
打印:
{'小明': 10, '小李': 20}
-----------------------------------
def fun1(a,**b):
print(a,b)
fun1(10,小明=10,小李=20)
打印:
10 {'小明': 10, '小李': 20}
------------------------------------
def fun1(*a,**b): #* 和 ** 同时使用时,需*在前 ** 在后
pass
def fun1(**a,*b): # 报错
pass
- 可反向调用,把列表中的元素转为实参传入 **dict
- 列表中的元素需要与函数中的参数个数对应
- key值需要与函数中的参数名一致
def fun1(a,b,c):
print(a,b,c)
dic={"a":50,"b":20,"c":60}
fun1(**dic)
打印:
50 20 60
4.def fun1(a,b,*,c,d):#在参数的前面加 * 号,代表*号后面的参数只能采用关键字传递
def fun1(a,b,*,c,d):
print(a)
print(b)
print(c)
print(d)
fun1(10,20,c=30,d=40)
打印:
10
20
30
40
---------------------------
def fun1(a,b,*,c,**d): #可以
pass
def fun1(a,b,*,c,*d): #不可以
pass