zoukankan      html  css  js  c++  java
  • 我的python菜鸟之路13

    ------------------------------函数的装饰器和推导式-----------------------------

    1.装饰器

    def bar():
        print(1)
    def base():
        print(2)
    bar = base
    bar()
    #输出的结果为2
    
    def func(arg):
        def inner():
            return arg()
        return inner
    
    def index():
        print('123')
        return '666'
    
    v1 = index() #123
    v2 = func(index)
    index =666 #在此之前已经将index函数赋值给arg所以不影响函数的结果
    v3=v2()
    #输出的结果为
    #123
    #123
    
    • 装饰器:在不改变原函数内部代码基础上,在函数执行之前和执行之后自动执行某个功能

      def func(arg):
          def inner():
              print('before')
              v = arg()
              print('after')
              return v
          return inner
      #第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
      #第二步:将func的返回值重新赋值给下面的函数名。index = func(index)
      @func
      def index():
          print('123')
          return '666'
      
      print(index)
      
    • 装饰器的基本结构

      #装饰器的编写
      def x(func):
          def y():
              ret = func()
              return ret
          return y
      #装饰器的应用
      @x
      def index():
          pass
      @x
      def manage():
          pass
      #执行函数
      v = index()
      print(v)
      
    • 装饰器应用案例

      import time
      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(1223)
      func1()
      
    • 装饰器应用场景:想要为函数扩展功能时,可以选择装饰器

    • 记住

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

        @外层函数
        def index():
            pass
        insex()
        

    2.推导式

    • 列表推导式

      • 目的:方便简便的生成一个列表

      • 基本格式

        #示例1
        vals = [i for i in "yang"]
        #变量 = [for循环变量 for循环一个可迭代对象]
        
        #示例2
        val = [i+100 for i in range(10)]
        print(val)
        
        #示例3 
        #与三元运算混用
        val = [99 if i >5 else 66 for i in range(10)]
        print(val)
        
        #示例4
        #与lambda函数结合
        v2 = [lambda x:x*i for i in range(10)]
        print(v2[0](2))
        #注意输出结果为18
        
        #示例5
        def num():
            return [lambda x:i*x for i in range(4)]
        print([m(2) for m in num()]) #注意此时的i为3,m()调用函数,此时参数X为2
        #输出结果为[6,6,6,6]
        
        #示例6
        #筛选
        v3 = [i for i in range(10) if i >5] #循环i,先执行判断语句在添加至列表中
        print(v3)
        #应与示例三做区分
        
    • 集合推导式

      • 其格式与列表生成式一样
      • 与列表生成式的区别是其元素不可重复
    • 集合推导式

      v = { 'k'+str(i):i for i in range(10) if i >5}
      print(v)
      #注意集合的特性,当键重复时后者取代前者
      

    3.模块

    import time
    v = time.time() #获取当前时间,返回值
    time.sleep(2) #代码睡两秒,无返回值
    
  • 相关阅读:
    [每日一题]:小猫爬山
    [每日一题]:Wannafly挑战赛1 -- Treepath
    JavaWeb学习(19): 文件的上传和下载
    [每日一题]:牛客练习赛61 A:打怪
    [十二省联考2019]春节十二响——长链剖分+堆
    BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流
    BZOJ4003[JLOI2015]城池攻占——可并堆
    BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点
    BZOJ3876[Ahoi2014&Jsoi2014]支线剧情——有上下界的最小费用最大流
    BZOJ2738矩阵乘法——整体二分+二维树状数组
  • 原文地址:https://www.cnblogs.com/yangzilaing/p/13237007.html
Copyright © 2011-2022 走看看