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 Iterablel = [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 = 1print('现在定义了a变量')yield ab = 2print('现在又定义了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():
for 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()

转载于:https://www.cnblogs.com/Murraya/p/10673542.html

day12 装饰器进阶相关推荐

  1. day12装饰器进阶

    1.复习 # 复习 # 讲作业 # 装饰器的进阶# functools.wraps# 带参数的装饰器# 多个装饰器装饰同一个函数 # 周末的作业# 文件操作# 字符串处理# 输入输出# 流程控制# 装 ...

  2. python基础学习-装饰器进阶

    #__author:"Feng Lin" #date: 2018/8/30 #装饰器进阶 # functool.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数from ...

  3. python进阶20装饰器

    原创博客地址:python进阶20装饰器 Nested functions Python允许创建嵌套函数,这意味着我们可以在函数内声明函数并且所有的作用域和声明周期规则也同样适用. 1 2 3 4 5 ...

  4. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  5. python重难点之装饰器详解

    背景 虽然之前看过装饰器的相关内容,但是今天想起来,一直没有好好总结一下,所以特地记录下关于装饰器的一系列用法. 要想理解装饰器首先要明确颇python中的三个概念: 1.一切函数皆为对象 2.高阶函 ...

  6. python之函数三装饰器

    装饰器形成的过程 装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能 原则:开发封闭原则 开发:对扩展是开发的 封闭:对修改是封闭的 装饰器的固定模式 计算运行时间 1 import ...

  7. python:装饰器

    前言 闭包 nonlocal 语句 装饰器 装饰器进阶:装饰器流程详解 装饰器进阶:带参数的装饰器 装饰器进阶:类装饰器 装饰器进阶:functools.wraps 装饰器进阶:多装饰器的执行顺序 装 ...

  8. python装饰器setter实现原理_python装饰器、描述符模拟源码实现

    概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人,请见谅,文章结尾贴有相关链接可以作为补充 全文分为三个部分装饰器理论知识.装饰器应用.装饰器延申 装饰理基础 ...

  9. Python-理解装饰器

    文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say():return "Hello" 打印出如 ...

最新文章

  1. python计算特征与目标的相关性并可视化
  2. 四十三、文件存储空间管理
  3. linear,swizzle,tile
  4. 【大数据-Hadoop】dbeaver
  5. Java学习--设计模式之创建型模式
  6. html 将两个标签绑在一起,基本标签2
  7. Linux服务器版本鼠标,安装GPM给Linux虚拟控制台提供配置鼠标支持
  8. Integer类的toBinaryString源码分析
  9. 在线图片水平/垂直均等切割工具
  10. Json转化的三种方式
  11. 免费好用的SNMP网管工具 Sugarnmstool
  12. xscan运行xscan_gui.exe无法打开
  13. 【整数规划算法】分支定界法及其Python代码实现
  14. 水哥王昱珩的教育语录:输不丢人,怕输才丢人
  15. day26 SQL注入神器—— Sqlmap
  16. 奋斗的小孩系列 FPGA学习altera系列: 第一篇 软件的安装与破解
  17. 大学计算机基础超详细知识点(高手总结),大学计算机基础超详细知识点(高手总结)免费-...
  18. 共享充电宝方案原理,具体部件组成以及主控MUC参数
  19. 计算机及应用可以评职称么,可以跨专业评职称吗?
  20. Linux服务器连接校园网

热门文章

  1. 搭建JMeter+Jenkins+Ant持续化
  2. mysql怎么写Connection_MySQL里面的CONNECTION_ID
  3. rk android8.1加密,Android 8.1RK平台增加自定义脚本,修改文件权限
  4. linux 脚本socket通信,Linux实例:用socket通讯远程执行命令
  5. php yield 个人小解_php 技术 yield 问题
  6. c# ssh到linux,C#通过SharpSSH库与Linux服务器建立SSH连接并执行命令
  7. Visio studio 2019中opencv 4.1.1运行环境配置(亲测可用)
  8. 【直播】如何学习计算机视觉各大方向,言有三6大直播集中上线
  9. 【AI初识境】什么是深度学习成功的开始?参数初始化
  10. lazada新手开店之后,怎样选择正确类目来发布产品?