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

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

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

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

代码语言:javascript
运行
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
运行
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
运行
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
运行
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
运行
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
运行
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

复制
相关文章

相似问题

修剪字符末尾*

30

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

23

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

24

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

13

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

127
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档