文章要点
🍺前言🔆参数扩展
🛸关键词参数
def list(x,y,z): print('x:{},y:{},z:{}'.format(x,y,z)) list(6,7,5) #按顺序传值 list(z = 5,x = 6,y = 7) #利用关键词参数乱序传值
结果:
🛸默认值参数
def list(name,age="未知"): print('name:{},age:{}'.format(name,age)) list('苏凉',21) list('hacker')
结果:
在这里可以看到如果我们设置了参数默认值,即使不传入参数也是不会报错的!!
注意:给参数设置默认值时,只能从后往前设置!!
🛸形参和实参
def list(a): a = a+1 print(a) x = 5 list(x) #结果:6 print(x) #结果:5
在上例中a为形式参数,x为实际参数。
思考:为什么将x的值赋给a,结果最后打印的x的值还是5,并没有改变呢?
def list(a): a.append(4) print(a) x = [0, 1, 2, 3] list(x) print(x)
此时可以看到在函数体内并没有对参数进行赋值,因此函数外的x就可以被修
改。
🔆可变参数
def list(*args): print(args) list(1,2,3,4) #结果:(1,2,3,4)
def list(a ,b ,*args,c,d): print(a) print(b) print(args) print(c) print(d) list(1,2,3,4,c=5,d=6)
结果:
注意:在可变参数之前必须按照顺序赋值,不可以使用关键字参数传值,在可变参数后则必须使用关键字参数传值!!否则后面的值默认为可变参数的值!
🔆可变关键词参数
def list(**kwargs): print(kwargs) for k ,v in kwargs.items(): print(f'{k}:{v}') list(a =1 ,b = 2, c = 3)
结果:
注意:可变关键词参数在和其他参数使用时只能放在最后一个!!
def list(a,b,**kwargs): print(a,b,kwargs) # for k ,v in kwargs.items(): # print(f'{k}:{v}') list(a =1 ,b = 2,x = 5 ,y = 6 )
结果:
🔆元组解包
name,age,QQ_num,*others,c = ('苏凉','21','787991021',4,5,6,7) print(name, age, QQ_num,*others,c) print(*others) print('*'*30) # ============================== def list(): return '苏凉','21','787991021',4,5,6,7 name,age,QQ_num,*others,c =list() print(name, age, QQ_num,*others,c)
结果:
注意:在进行解包时*参数只能存在一个,当同时与普通参数使用时,优先给普通参数赋值,最后剩余的值再给到定义的 * 参数
a , b ,*c = {'name':"苏凉",'age':21,'QQ_num':'787991021','other':'none'}.items() print(a,b,*c) print(*c)
结果:
可以看出对字典解包返回的对象时元组类型,在对字典解包时默认对字典的键进行解包,若想对值进行解包则加上.values方法,若想对键值都解包,则加上.items()方法。
🔆函数类型参数
def list1(num1,num2): print(num1) num2() def list2(): print('执行完毕!') list(3,list2)
结果:
这里调用函数list1时将函数list2作为一个参数,传递给num2,最后执行函数list1时在执行list2。
🔆高阶函数
🛸嵌套函数
def list1(): def list2(): print('已执行') list2() list1()
结果:
注意:在函数内定义的任何变量,以及嵌套的函数都只能在函数内使用!即在上例中不能直接在函数外调用list2()
🛸函数返回值
下面利用一个小案例说明:三次机会猜数字!!
count = 0 while True: count = count +1 if count>3: break def list1(num): def list2(): nonlocal num if num>5: return '比这个数大!!' elif num==5: return '猜对了!!' return '比这个数小!!' return list2 i= int(input('输入整数:')) a = list1(i) print(a())
结果:
在上述代码中nonlocal声明局部变量,在调用函数list1时,函数list1返回了list2,于是list2的值就赋给了a,最后调用a(),即在list1中调用list2()。
上述的操作也叫闭包操作。详解还看后续内容输出,在这里就不多赘述了。
🔆匿名函数
🛸lambda语法
def f(x): return x*10 a = lambda x:x*10 print(f(3)) print(a(3))
结果:
在这里可以看到两者效果时一样的。
注意:在lambda语法中不能换行,即只能定义一些简单的方法或者表达式,另外lambda也是可以含有多个参数的。
🔆递归函数
def list1(i): if i<=1: return 1 else: return list1(i-1)*i b = list1(5) print(b)
🍻结语