Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >修剪装饰器末尾的零个元素

修剪装饰器末尾的零个元素
EN

Stack Overflow用户
提问于 2020-05-15 08:30:27
回答 2查看 36关注 0票数 2

为了漂亮地打印我的计算结果,我编写了一个装饰器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from functools import wraps

def print_disp(f):
    @wraps(f)
    def wrapping(*args, **kwargs):
        disp, disp_std = f(*args, **kwargs)
        labels = ('GD', 'GDD','TOD', 'FOD', 'QOD')
        for i, (label, disp_item, disp_std_item) in enumerate(zip(labels, disp, disp_std)):
            print(f'{label} = {disp_item:.5f} ± {disp_std_item:.5f} fs^{i+1}')
        return disp, disp_std
    return wrapping

它可以通过以下方式使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np

@print_disp
def calc():
    disp = np.array([1, 0, 7, 0, 0])
    disp_std = np.array([0.1, 0, 0.7, 0, 0])
    return disp, disp_std

然后它会返回

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GD = 1.00000 ± 0.10000 fs^1
GDD = 0.00000 ± 0.00000 fs^2
TOD = 7.00000 ± 0.70000 fs^3
FOD = 0.00000 ± 0.00000 fs^4
QOD = 0.00000 ± 0.00000 fs^5

这很好。但是,我希望避免打印多余的0行,但我只希望修剪末尾的零,因此GDD =0行应该保留。由于这个原因,我不能在装饰器主体中添加像if disp item != 0: print(..)这样的东西。所需的行为是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GD = 1.00000 ± 0.10000 fs^1
GDD = 0.00000 ± 0.00000 fs^2
TOD = 7.00000 ± 0.70000 fs^3

我该如何解决这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-15 08:49:37

如果只想打印第一行,可以像这样修改装饰器,以跟踪是否打印这样的行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def print_disp(f):
    @wraps(f)
    def wrapping(*args, **kwargs):
        zero_printed = False
        disp, disp_std = f(*args, **kwargs)
        labels = ('GD', 'GDD','TOD', 'FOD', 'QOD')
        for i, (label, disp_item, disp_std_item) in enumerate(zip(labels, disp, disp_std)):
            if disp_item == 0 and zero_printed:
                continue
            zero_printed |= disp_item == 0
            print(f'{label} = {disp_item:.5f} ± {disp_std_item:.5f} fs^{i+1}')
        return disp, disp_std
    return wrapping
票数 1
EN

Stack Overflow用户

发布于 2020-05-15 08:43:29

你可以这样做

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from functools import wraps

def print_disp(f):
    @wraps(f)
    def wrapping(*args, **kwargs):
        disp, disp_std = f(*args, **kwargs)
        labels = ('GD', 'GDD','TOD', 'FOD', 'QOD')
        for i, (label, disp_item, disp_std_item) in enumerate(zip(labels, disp, disp_std)):
            if sum(disp[i:])+sum(disp_std[i:]) == 0:
              break
            print(f'{label} = {disp_item:.5f} ± {disp_std_item:.5f} fs^{i+1}')
            last_item = disp_item+disp_std_item
        return disp, disp_std
    return wrapping
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61815010

复制
相关文章
函数的装饰器,两层装饰器和三层装饰器
两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是不能减少他的程序内容,他的原来程序不变只能增不能减少,然后返回装饰好的子函数,再全局定义一个变量名与要装饰的函数名相同名字,并且将装饰后的函数调用赋予改变量.
小小咸鱼YwY
2019/07/24
7890
python装饰器2:类装饰器
"类装饰器"有两种解读方式:用来装饰类的装饰器;类作为装饰器装饰其它东西。你如何认为取决于你,两种说法都有出现在其它的文章中。我的文章中是将"类装饰器"解读为第一种方式,即装饰类的东西。而“类作为装饰器装饰其它东西”,我都会为其标注"类作为装饰器"或"作为装饰器的类"以避免歧义。
py3study
2020/01/19
1.2K0
Python高级编程-装饰器1.装饰器的理解 2.多个装饰器 3.装饰器(decorator)功能 4.装饰器示例
装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了,然后面试问到了就挂了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python,看了下面的文章,保证你学会装饰器。
Python攻城狮
2018/08/23
5380
Python高级编程-装饰器1.装饰器的理解
2.多个装饰器
3.装饰器(decorator)功能
4.装饰器示例
装饰器
def fun(): def fun1(num): return num+1 return fun1 c = fun() print(c(1)) 在主函数中不能直接调用嵌套函数里的子函数如:fun1(num),需要先调用嵌套中的母函数如:fun(),然后把fun()函数中的子函数fun1()的地址传递给一个变量,然后才可以直接调用子函数fun1 一下是装饰器函数的标准模式,可以采用断点debug来一步步运行深入理解函数执行步骤 装饰器编码思路:将新的函数地址赋值给旧的函数,
IT人一直在路上
2019/09/18
3660
装饰器
 一、装饰器的简单介绍 1 # /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 ''' 装饰器 ''' 4 ''' 5 装饰器的工作原理 6 1. python的执行顺序是从上到下顺序执行. 7 2. 当执行到outer函数的时候, 将其内容放入内存, 执行到f1的时候.在f1上发现@outer装饰器. 8 3. 执行outer函数, 并将其下的函数名f1作为参数传递给outer 9 4. 将out
用户7798898
2022/05/06
2530
装饰器
一。关于装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 二.实现装饰器知识必备技能: 1.函数即“变量” 2.高阶函数 a.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码下为其添加功能) b.返回值中包含函数名(不修改函数的调用方式) 3.嵌套函数 高阶函数 +嵌套函数=》装饰器 2.1函数即“变量”(一切皆对象) 在 python中,一切皆对象,变量是对象,函数是对象,类是对象,所有的一切都是对
用户1679793
2018/04/28
7240
装饰器
登录的装饰器
def login_decorator(func): ''' 这个函数是一个登录验证的装饰器,它还包含了对ajax登录的验证 :param func: func是对谁去装饰,这个参数是被装饰的一个函数 :return: 装饰器装饰过后,返回的一个新功能函数 ''' def login_handler(request,*args,**kwargs): if request.user.is_authenticated(): return func(request,*args,**kwargs) else: if request.is_ajax():#这个方法可以判断当前的请求是不是ajax请求 return JsonResponse({'status':'nologin'}) url = request.get_full_path() # request.get_full_path()这个方法可以获取全的路径,包含协议和ip、get请求参数 #request.path它获取的只是路径部分,不包含协议和ip也不包含get请求参数 ret = redirect(reverse('users:user_login')) ret.set_cookie('url',url) return ret
用户2337871
2019/07/19
4780
装饰器
初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作、redis调用、监控API等功能。业务部门使用基础功能时,只需调用基础平台提供的功能即可。如下:
hankleo
2022/05/10
2410
装饰器
装饰器Decorators是Python的重要组成部分。 简而言之:它们是修改另一个函数功能的函数。 他们有助于使我们的代码更简洁,更Pythonic。
Helloted
2022/06/07
3060
装饰器
def f2(func): #定义一个函数加参数,其中的func参数为装饰器的函数体 def f3(w1,w2) #这个函数可以进行w1,w2参数 print("吴永聪") #输出吴永聪 ret = func(w1,w2) #装饰函数体的参数并将其赋给ret print("123") #输出123 return ret #返回ret的值 return f3 #返回f3函数的参数 @f2 #@使用装饰器
Wyc
2018/09/11
3510
Python 装饰器装饰类中的方法
目前在中文网上能搜索到的绝大部分关于装饰器的教程,都在讲如何装饰一个普通的函数。本文介绍如何使用Python的装饰器装饰一个类的方法,同时在装饰器函数中调用类里面的其他方法。本文以捕获一个方法的异常为例来进行说明。
青南
2019/01/09
1.4K0
Python装饰器的实现和万能装饰器
在Python中,装饰器是在不改变已有函数的代码的前提下,给函数增加新的功能的一种函数。
Python碎片公众号
2021/02/26
5360
Python装饰器的实现和万能装饰器
python装饰器1:函数装饰器详解
假如你已经定义了一个函数funcA(),在准备定义函数funcB()的时候,如果写成下面的格式:
py3study
2020/01/19
6940
设计模式(6)-装饰器(认识程序中的装饰器)
之前已经看过装饰器模式,但是感觉不是很清晰,但是有一种情况下出的代码,一定是装饰器。 Widget* aWidget = new BorderDecorator( new BorderDecorator( new ScrollDecorator( new TextField( 80, 24 )))); 可以看到,层层嵌套,每个类都可以按照一定的顺序嵌套多次。 比如将顺序改为如下: Widget* bWidget = new ScrollDecorator( new BorderDecorat
cloudskyme
2018/03/20
8050
设计模式(6)-装饰器(认识程序中的装饰器)
TypeScript系列教程十一《装饰器》 -- 属性装饰器
属性装饰器和其他装饰器功能类似,其设计也是为了统一的、复用度更高的去监听,改变属性。
星宇大前端
2022/05/06
1.1K0
TypeScript系列教程十一《装饰器》 -- 属性装饰器
ArkTS-@Observed装饰器和@ObjectLink装饰器
上文所属的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的 数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。这就引出了@Observed/@ObjectLink装饰器
酒楼
2023/07/05
7510
TypeScript系列教程十一《装饰器》 -- 类装饰器
类装饰器顾名思义是对类的内容进行修饰,在Typescript 类其实就是对象,这样配合原型对象操作可以达到操作类的目的。
星宇大前端
2022/05/06
7970
TypeScript系列教程十一《装饰器》 -- 类装饰器
TypeScript系列教程十一《装饰器》 -- 参数装饰器
系列教程 TypeScript系列教程一《开篇》 TypeScript系列教程二《安装起步》 TypeScript系列教程三《基础类型》 TypeScript系列教程四《扩展类型》 TypeScript系列教程五《对象类型》》 TypeScript系列教程六《泛型》 TypeScript系列教程七《接口》 TypeScript系列教程八《类》 TypeScript系列教程九《高级类型》 TypeScript系列教程九《类型转换》-- keyof和typeof 操作 TypeScript系列教程九《类型转换》
星宇大前端
2022/05/06
6380
TypeScript系列教程十一《装饰器》 -- 参数装饰器
ArkTS-@Provide装饰器和@Consume装饰器
@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过明明参数机制传递,@Provide和@Consume拜托参数传递机制的舒服,实现跨层级传递。其中@Provide装饰的变量是在祖先结点中,可以理解为被”提供“给后代的状态变量。@Consume装饰的变量是在后代组件中,去“消费(绑定)”祖先节点提供的变量。
酒楼
2023/06/27
4840
Python基础语法-函数-函数装饰器-带参数的装饰器
装饰器可以接受参数,这意味着我们可以在运行时指定一些配置选项。例如,下面是一个带有参数的装饰器,它可以接受一个消息并打印该消息:
玖叁叁
2023/04/17
1K0

相似问题

修剪字符末尾*

30

为什么“内嵌块”要在元素的末尾修剪空间?

23

修剪单词,但如果找到html元素的末尾,则停止

24

从字节数组的末尾修剪空元素- Java

13

从字节数组末尾修剪空元素- Kotlin

127
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文