• day12 装饰器进阶


    day12 装饰器进阶
    #装饰器进阶
    #functools.wraps
    #带参数的装饰器
    #多个装饰器装饰用一个函数

    def outer(*args,**kwargs):#接收的时候是聚合(成元祖的形式)
    print(args)
    print(*args)
    def inner(*args):
    print('inner:',args)
    inner(*args) #调用的时候是打散

    outer(1,2,3,4) #outer(*[1,2,3,4])
    outer(*[1,2,3,4])

    #可迭代对象包括:字符串、列表、元祖、字典、集合

    from collections.abc import Iterable
    
    l = [1, 2, 3, 4]
    t = (1, 2, 3, 4)
    d = {1: 2, 3: 4}
    s = {1, 2, 3, 4}
    
    print(isinstance(l, Iterable))
    print(isinstance(t, Iterable))
    print(isinstance(d, Iterable))
    print(isinstance(s, Iterable))

    #迭代:可以将某个数据集内的数据“一个挨着一个的取出来”
    #3.可迭代协议:就是内部实现了__iter__方法

    print(dir([1,2]))
    print(dir((2,3)))
    print(dir({1:2}))
    print(dir({1,2}))
    
    l = [1,2,3,4]
    l_iter = l.__iter__()
    item = l_iter.__next__()
    print(item)
    item = l_iter.__next__()
    print(item)
    item = l_iter.__next__()
    print(item)
    item = l_iter.__next__()
    print(item)
    item = l_iter.__next__()
    print(item)

    #这是一段会报错的代码,如果我们一直取next取到迭代器里已经没有元素了,
    # 就会抛出一个异常StopIteration,告诉我们,列表中已经没有有效的元素了。

    l = [1,2,3,4]
    l_iter = l.__iter__()
    while True:
        try:
            item = l_iter.__next__()
            print(item)
        except StopIteration:
            break                

    #迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
    #还账:next和iter方法
    '''Python中提供的生成器:
    1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
    2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表'''

    import time
    def genrator_fun1():
        a = 1
        print('现在定义了a变量')
        yield a
        b = 2
        print('现在又定义了b变量')
        yield b
    g1 = genrator_fun1()
    print('g1 : ',g1) #打印g1可以发现g1就是一个生成器
    print('-'*20) #我是华丽的分割线
    print(next(g1))
    time.sleep(1) #sleep一秒看清执行过程
    print(next(g1))
    
    
    
     

    #普通函数
    def generator():
      print(1)
      return 'a'
    ret = generator()
    print(ret)
    #生成器函数
    #只要含有yield关键字的函数都是生成器函数
    #yield不可以跟return共用,函数里有了yield就不能用return,且需要写在函数内部


    def generator():
      print(1)
      yield 'a'
    #生成器函数:执行之后会得到一个生成器作为返回值(函数内部代码不会执行)
    ret = generator()
    print(ret)
    print(ret.__next__())
    # ret.__iter__()

    def generator():
      print(1)
      yield 'a'
      print(2)
      yield 'b'
      yield 'c'
    g=generator()
    for i in g:
      print(i)
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())

    #哇哈哈
    def wahaha():
      or i in range(2000000):
        yield '娃哈哈%s'%i
    g = wahaha()
    count = 0
    for i in g:
      count+=1
      print(i)
      if count > 50:
      break
      print('***********',g.__next__())
    for i in g:
      count+=1
      print(i)
      if count > 100:
      break

    #监听文件输入
    def tail(file):
      f = open('file', encoding='utf-8')
    while 1:
      line = f.readline()
      if line.strip():
      yield line.strip()
    g= tail('file')
    for i in g:
      if 'python' in i:
      print(i)

    #带参数的装饰器(三层装饰器:最多三层)
    import time
    FLAG = True
    def timmer_out(flag):
      def timmer(func):
        def inner(*args,**kwargs):
          if flag:
            start=time.time()
            ret = func(*args,**kwargs)
            end = time.time()
            print(end-start)
            return ret
          else:
            ret = func(*args, **kwargs)
            return ret
          return inner
        return timmer
    #timmer = timmer_out(FLAG)等同于timmer_out=timmer_out(func)
    @timmer_out(FLAG)
    # @timmer
    def wahaha():
      time.sleep(0.1)
      print('aaaaaaaaaaaaaaaaa')

    @timmer_out(FLAG)
    # @timmer
    def erguotou():
      time.sleep(0.1)
      print('bbbbbbbbbbbbbbbbbb')

    wahaha()
    FLAG=False
    erguotou()

    #多个装饰器装饰一个函数
    def wrapper1(func): #func===>f
      def inner1():
        print('wrapper1 ,before func')
        ret = func() #f
        print('wrapper1 ,after func')
        return ret
      return inner1

    def wrapper2(func): #func--->inner1
      def inner2():
        print('wrapper2 ,before func')
        ret = func() #inner1
        print('wrapper2 ,after func')
        return ret
      return inner2

    def wrapper3(func): #func--->inner1
      def inner3():
        print('wrapper3 ,before func')
        ret = func() #inner1
        print('wrapper3 ,after func')
        return ret
      return inner3
    @wrapper3
    @wrapper2 #f=wapper2(f)--->wrapper(inner1)
    @wrapper1 #f=wapper1(f)=inner1
    def f():
      print('in f')
      return 'hahaha'

    print(f())#===>inner()

  • 相关阅读:
    98. 验证二叉搜索树
    236. 二叉树的最近公共祖先
    leetcode 字符串转换整数 (atoi)
    LeetCode 寻找两个正序数组的中位数 (找第k个数的变种)
    Leetcode 面试题 16.18. 模式匹配(逻辑题)(转)
    深入学习Redis(4):哨兵(转)
    【BAT面试题系列】面试官:你了解乐观锁和悲观锁吗?(转)
    CentOS 7.5 使用 yum 方式安装 MySQL 5.7
    CentOS7 安装 PHP7 完全详细教程
    ubunutu 18.04 编译php7.4.1
  • 原文地址:https://www.cnblogs.com/Murraya/p/10673542.html
Copyright © 2020-2023  润新知