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()

posted @ 2019-04-08 21:25  Murraya  阅读(90)  评论(0编辑  收藏  举报