万能参数
args:接收的是按照位置传参的值,然后组成一个元组
**kwargs:接收的是按照关键字传参的值,然后组成一个字典
传参的时候必须先按照位置传,然后是默认参数,然后再按照关键字传递(形参和实参中的都一样)
在参数前面加*,这样可以传入多个参数,默认以元组的形式储存
如果直接传入一个list=[1,2,3,4],即func(list),则将list作为一个整体传入,即a=([1,2,3,4])
如果这样传入:func(*list),则是将list中的元素一一传入,即a=(1,2,3,4)
def func(a,*args,**kwargs):print(a)print(args) #这是一个元组print(*args) #加*传参,就将元组拆分开来,一个一个传过去print(kwargs) #以字典的形式存储print(*kwargs)#加一个*表示表示字典的键,func1(**kwargs)可传入另一个函数#print(**kwa rgs)
func(1,2,3,b = 4,c = 5)
1(2, 3)2 3{'b': 4, 'c': 5}
b c
def a(*args, **kwargs):#此处的args表示装包,即将1,34,5装包成一个元组
print(args, type(args)) #(1, 34, 5)
#拆包,在args前加入*
print(*args) #1 34 5
#一个*时表示获取键值key
print(*kwargs) #a b c
#注意直接将字典拆开时时无法打印的,此时借助一个函数打印
#此时相当直接使用b(a=1,b=24,c=5)进行赋值,如果函数b中不是a,b,c会报错
b(**kwargs)defb(a, b, c):print(a)print(b)print(c)
一些概念:
interable:可迭代的。
interator:迭代器
generator:生成器
可迭代对象有__inter__方法,迭代器有__inter__和__next__方法,gennetor本质上是一个interator。
装饰器
需求:在不改变func()函数的前提下,测试func函数运行所需要的时间。也可批量测试其他函数。
importtimedef times(f):#装饰函数
def inner(*args,**kwargs):
begain=time.time()
ret= f(*args,**kwargs) #被装饰的函数,用万能参数传递参数
end =time.time()
ues_time= end -begainprint(ues_time)returnretreturninner
@times#语法糖,相当于func = times(func)
deffunc(a,b,c,d):
time.sleep(0.01)
total= a + b + c +dprint('这个程序运行用了多长时间')returntotal
ret= func(1,3,c = 4,d = 5)print(ret)
View Code
装饰器模型
def times(f):#装饰函数
def inner(*args,**kwargs):#在被装饰的函数之前加的内容
ret = f(*args,**kwargs) #被装饰的函数,用万能参数传递参
#在被装饰的函数之后加的内容
returnretreturninner
@times#语法糖,相当于func = times(func)
deffunc():pass
生成器
该函数实现了,在g.send()一个数后,计算所有数(以前send的数)的平均值。
defave_wra(func):def inner(*args,**kwargs):
ret= func(*args,**kwargs)
ret.__next__()returnretreturninner
@ave_wradefave_gene():
sum=0
count=0
ave=0while 1:
num= yieldave
sum+=num
count+= 1ave= sum/count
g=ave_gene()print(g.send(10))
View Code
生成器函数:带有 yield 的函数是生成器函数。
生成器:调用生成器函数后得到的是生成器。
yield的做用形式和return相同,但执行yield后函数不会停止,在下次调用生成器时会继续执行。