函数的装式器和推导式

2.装饰器

v = 1
v = 2 
# ########################
def func():
    pass 
v = 10
v = func

# ##########################
def base():
    print(1)

def bar():
    print(2)

bar = base
bar()

def func():
    def inner():
        pass
    return inner 

v = func()
print(v) # inner函数
# #########################################
def func(arg):
    def inner():
        print(arg)
    return inner 

v1 = func(1)
v2 = func(2)

# #########################################
def func(arg):
    def inner():
        arg()
    return inner

def f1():
    print(123)

v1 = func(f1)
v1()
# ###########################################
def func(arg):
    def inner():
        arg()
    return inner

def f1():
    print(123)
    return 666

v1 = func(f1)
result = v1() # 执行inner函数 / f1含函数 -> 123 
print(result) # None
# ###########################################
def func(arg):
    def inner():
        return arg()
    return inner

def f1():
    print(123)
    return 666

v1 = func(f1)
result = v1() # 执行inner函数 / f1含函数 -> 123
print(result) # 666


def func():
    print(1)
    
v1 = func
func = 666

===================装饰器=

def func(arg):
    def inner():
        print('before')
        v = arg()
        print('after')
        return v 
    return inner 

def index():
    print('123')
    return '666'


# 示例一
"""
v1 = index() # 执行index函数,打印123并返回666赋值给v1.
"""
# 示例二
"""
v2 = func(index) # v2是inner函数,arg=index函数
index = 666 
v3 = v2()
"""
# 示例三
"""
v4 = func(index)
index = v4  # index ==> inner 
index()
"""

# 示例四
index = func(index)
index()

def func(arg):
    def inner():
        v = arg()
        return v 
    return inner 

# 第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
# 第二步:将func的返回值重新赋值给下面的函数名。 index = func(index)
@func 
def index():
    print(123)
    return 666

print(index)

装饰器:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能。

应用:

# 计算函数执行时间

def wrapper(func):
    def inner():
        start_time = time.time()
        v = func()
        end_time = time.time()
        print(end_time-start_time)
        return v
    return inner

@wrapper
def func1():
    time.sleep(2)
    print(123)
@wrapper
def func2():
    time.sleep(1)
    print(123)

def func3():
    time.sleep(1.5)
    print(123)

func1()

总结

  • 目的:在不改变原函数的基础上,再函数执行前后自定义功能。

  • 编写装饰器 和应用
    # 装饰器的编写
    def x(func):
    def y():
    # 前
    ret = func()
    # 后
    return ret
    return y

    # 装饰器的应用
    @x
    def index():
        return 10
    
    @x
    def manage():
        pass
    
    # 执行函数,自动触发装饰器了
    v = index()
    print(v)
    
  • 应用场景:想要为函数扩展功能时,可以选择用装饰器。

  • 记住:

    • 装饰器编写格式
      def 外层函数(参数):
      def 内层函数(*args,**kwargs):
      return 参数(*args,**kwargs)
      return 内层函数

    • 装饰器应用格式
      @外层函数
      def index():
      pass

      index()
      
    • 问题:为什么要加 *args, **kwargs

3.推导式

  • 列表推导式
    • 基本格式
      “”"
      目的:方便的生成一个列表。
      格式:
      v1 = [i for i in 可迭代对象 ]
      v2 = [i for i in 可迭代对象 if 条件 ] # 条件为true才进行append
      “”"
      v1 = [ i for i in ‘alex’ ]
      v2 = [i+100 for i in range(10)]
      v3 = [99 if i>5 else 66 for i in range(10)]

      def func():
          return 100
      v4 = [func for i in range(10)]
      
      v5 = [lambda : 100 for i in range(10)]
      result = v5[9]()
      
      def func():
          return i
      v6 = [func for i in range(10)]
      result = v6[5]()
      
      v7 = [lambda :i for i in range(10)]
      result = v7[5]()
      
      
      v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题
      # 1.请问 v8 是什么?
      # 2.请问 v8[0](2) 的结果是什么?
      
      # 面试题
      def num():
          return [lambda x:i*x for i in range(4)]
      # num() -> [函数,函数,函数,函数]
      print([ m(2) for m in num() ]) # [6,6,6,6]
      
      # ##################### 筛选 #########################
      v9 = [i for i in range(10) if i > 5]
      
  • 集合推导式
    v1 = { i for i in ‘alex’ }
  • 字典的推导式
    v1 = { ‘k’+str(i):i for i in range(10)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值