python函数装饰器,迭代器,生成器+万能参数(动态参数)

万能参数

  • 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) <class 'tuple'>
    # 拆包,在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)
 
 
def b(a, b, c):
    print(a)
    print(b)
    print(c)

 一些概念:

  interable:可迭代的。

  interator:迭代器

  generator:生成器

  可迭代对象有__inter__方法,迭代器有__inter__和__next__方法,gennetor本质上是一个interator。

  

装饰器

  需求:在不改变func()函数的前提下,测试func函数运行所需要的时间。也可批量测试其他函数。

import  time
def times(f):#装饰函数
    def inner(*args,**kwargs):
        begain = time.time()
        ret = f(*args,**kwargs) #被装饰的函数,用万能参数传递参数
        end = time.time()
        ues_time = end - begain
        print(ues_time)
        return ret
    return inner
@times   #语法糖,相当于func =  times(func)
def func(a,b,c,d):
    time.sleep(0.01)
    total = a + b + c  + d
    print('这个程序运行用了多长时间')
    return total
ret = func(1,3,c = 4,d = 5)
print(ret)
View Code

装饰器模型

def times(f):#装饰函数
    def inner(*args,**kwargs):
        #在被装饰的函数之前加的内容
        ret = f(*args,**kwargs) #被装饰的函数,用万能参数传递参
        # 在被装饰的函数之后加的内容
        return ret
    return inner
@times   #语法糖,相当于func =  times(func)
def func():
    pass

 生成器

  该函数实现了,在g.send()一个数后,计算所有数(以前send的数)的平均值。

def ave_wra(func):
    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)
        ret.__next__()
        return ret
    return inner
@ave_wra
def ave_gene():
    sum = 0
    count = 0
    ave = 0
    while 1:
        num = yield ave
        sum += num
        count += 1
        ave = sum/count
g = ave_gene()
print(g.send(10))
View Code

  生成器函数:带有 yield 的函数是生成器函数。

  生成器:调用生成器函数后得到的是生成器。

  yield的做用形式和return相同,但执行yield后函数不会停止,在下次调用生成器时会继续执行。

转载于:https://www.cnblogs.com/gwwj/p/10832287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值