1、函数的创建
def calc(a,b): #定义的函数名叫calc
c = a+b
return c
#位置实参
result = calc(10,20) #实参和形参名字可以不同
print (result) #输出:30
#关键字实参
res = calc(b = 20,a = 10)
print (res) #输出:30
#混合实参
def fun(a,b,c,d):
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
fun(10,20,30,40) #不报错
fun(10,20,c=30,d=40) #前两个参数采用的是位置参数传递,而后两个参数采用的是关键字参数传递。
def fun2(a,b,*,c,d): #c,d只能采用关键字参数传递。
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
fun2(10,20,30,40) #报错
2、函数运算后实参的变化
def fun(arg1,arg2):
print("arg1=",arg1)
print("arg2=",arg2)
arg1+=1
arg2.append(10)
print("arg1=",arg1)
print("arg2=",arg2)
n1=11
n2=[22,33,44]
print("n1=",n1) #输出:n1= 11
print("n2=",n2) #输出:n2= [22,33,44]
fun(n1,n2) #输出:arg1= 11
#输出:arg2= [22,33,44]
#输出:arg1= 12
#输出:arg2= [22,33,44,10]
print("n1=",n1) #输出:n1= 11,不可变对象在函数体内部的修改不会影响函数体外的值
print("n2=",n2) #输出:n2= [22,33,44,10],可变对象在函数体内部的修改会影响函数体外的值
3、函数的返回值
def fun(num):
odd = []
even = []
for i in num:
if i % 2:
odd.append(i)
else:
even.append(i)
return odd,even
lst = [11,22,33,44,55,66,77,88]
print(fun(lst)) #输出:([11,33,55,77],[22,44,66,88]),返回的类型为元组。
'''
函数的返回值:
1.如果函数不需要返回值,不用写return。
2.函数有一个返回值,按原类型返回返回值。
3.函数有多个返回值,返回值的类型为元组。
'''
4、函数的形参定义方式
def fun(a,b=10):
print(a,b)
fun(100) #输出:100,10,只传一个则b采用默认值。
fun(20,30) #输出:20,30,30将10替换掉。
5、函数可变的的参数定义
#个数可变的位置参数,结果是元素。
def fun(*args):
print(args)
fun(10) #输出:(10,)
fun(10,20,30) #输出:(10,20,30)
#个数可变的关键字参数,结果是字典。
def fun(**args): #两个星号让python创建一个名为args的空字典,并将函数接受的所有信息都放入这个字典中。
print(args)
fun(a==10) #输出:{'a':10}
fun(a==10,b==20,c==30) #输出:{'a':10,'b':20,'c':30}
def fun1(*a,*b):
pass #报错,可变的位置参数只能定义一个。
def fun2(**a,**b):
pass #报错,可变的关键字参数只能定义一个。
def fun3(*a,**b):
pass #不报错,个数可变的位置形参要放在个数可变的关键字形参的前面。
def fun4(**a,*b):
pass #报错
def fun5(a,b=10,*,c,d,*e,**f):
pass #报错,因为*后面的只能用关键字参数传递,而*e是个数可变的位置参数。
def fun6(a,b=10,*,c,d,e,**f):
pass #不报错
def fun7(a,b=10,*c,**d):
pass #不报错
6、将列表和字典中的元素作为参数传入函数
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,b=200,c=300) #不报错
dic={'a':111,'b':222,'c':333}
fun(dic) #报错,因为只传入了一个元素。
fun(**dic) #不报错,传字典要加两颗星。
7、变量的作用域
#局部变量
def fun(a,b):
c = a+b
print(c)
print(c) #报错
#全局变量
name = '张三'
def fun( ):
print(name)
print(name) #输出:张三
fun( ) #输出:张三
#在函数外部使用函数内部定义的函数
def fun( ):
global age #将局部变量变成全局变量
age = 21
print(age)
fun( ) #输出:21,执行函数后,age才被赋上值,下一句才不会报错。
print(age) #输出:21
8、递归函数
函数在内部调用了自己。
但是得有出口。
#利用递归函数计算阶乘
def fac(n):
if n==1:
return 1 #出口
else:
return n*fac(n-1) #递归
print(fac(7)) #输出:5040
#利用递归函数计算斐波那契数列
def fib(n):
if n==1:
return 1 #出口
elif n==2:
return 1 #出口
else:
return fib(n-1)+fib(n-2) #递归
print(fib(7)) #输出:13
for i in range(1,8):
print(fib(i)) #输出斐波那契数列的前7位数字