【问题标题】:Drawing box around message在消息周围绘制框
【发布时间】:2017-02-19 08:30:12
【问题描述】:

我正在处理这个我无法弄清楚的 Python 任务。它是 3 个功能中的最后一个,前 2 个比这个更容易编程。指令是 “给定一条可能包含多行的消息,利用 split() 函数来识别各个行,并使用 format() 函数,以便在打印时,它会在消息的行周围绘制一个框,所有行都居中。框使用垂直条 &两侧的破折号(|,-),角上的+(+),并且在消息的最宽行的左侧和右侧始终有一列空格。”

这个函数需要做什么的一些例子:

测试:border_msg('a') == '+---+\n|一个 |\n+---+\n'

测试:border_msg('hello') == '+-------+\n|你好|\n+--------+\n'

测试一下:border_msg("嗨!\n你好吗?\n安全驾驶!") == '+---------------+\n|你好! |\n|你好吗? |\n|安全驾驶! |\n+---------------+\n'

我认为需要打印上面的测试,以便中间的单词被顶部和底部的“+------+”和侧面的“|”包围。

这是我到目前为止的代码。我不确定我会从这里去哪里。

def border_msg(msg):
    border_msg.split("\n")
    '%s'.format(msg)
    return border_msg(msg)
    print border_msg(msg)

【问题讨论】:

  • 修复缩进。那么无限递归呢?
  • 刚刚修复了缩进,如果您要返回然后打印,我只是不确定要使用哪一个,我想两者都可以工作
  • famguy74:@Jean-François Fabre 正在谈论您的 border_msg() 函数无条件调用自身(因此永远不会返回)这一事实。
  • 也许只有我一个人,但我看不出递归在这种情况下有什么帮助——正如其他人提到的,你的代码不会终止,这是一个问题,一方面。当有一些嵌套的意义时,递归是有帮助的。例如,如果我们需要在消息周围制作多个相同的墙。

标签: python drawing message rectangles


【解决方案1】:
def border_msg(msg):
    msg_lines=msg.split('\n')
    max_length=max([len(line) for line in msg_lines])
    count = max_length +2 

    dash = "*"*count 
    print("*%s*" %dash)

    for line in msg_lines:
        half_dif=(max_length-len(line))
        if half_dif==0:
            print("* %s *"%line)
        else:
            print("* %s "%line+' '*half_dif+'*')    

    print("*%s*"%dash)



border_msg('first_line\nsecond_line\nthe_ultimate_longest_line') # without print

【讨论】:

    【解决方案2】:

    我已经编写了一小段代码来实现盒装消息。老实说,这不是最好的代码,但它可以完成这项工作,并希望能帮助您自己完成(并且做得更好)。为此,我决定不发表评论,所以你必须自己考虑清楚。也许不是最好的教育方法,但还是让我们试试吧:]

    Github 上的代码。

    from math import ceil, floor
    
    def boxed_msg(msg):
        lines = msg.split('\n')
        max_length = max([len(line) for line in lines])
        horizontal = '+' + '-' * (max_length + 2) + '+\n'
        res = horizontal
        for l in lines:
            res += format_line(l, max_length)
        res += horizontal
        return res.strip()
    
    def format_line(line, max_length):
        half_dif = (max_length - len(line)) / 2 # in Python 3.x float division
        return '| ' + ' ' * ceil(half_dif) + line + ' ' * floor(half_dif) + ' |\n'
    
    print(boxed_msg('first_line\nsecond_line\nthe_ultimate_longest_line'))
    # +---------------------------+
    # |         first_line        |
    # |        second_line        |
    # | the_ultimate_longest_line |
    # +---------------------------+
    

    【讨论】:

    • 我没有说这是可能的最佳答案,但您能否评论一下投票的反对意见 - 还是不言自明?
    • 谢谢,这绝对是最全面、最有帮助的答案。我不确定是谁对所有这些答案投了反对票。下午 3 点到 6 点给任何阅读这篇文章的人发个便条,这不是发布问题的好时机,这是我唯一一次在一天中的所有其他时间都投反对票,人们都很友好,只是想提供帮助
    • 也许问题是,这个网站不是为其他人做作业的。我不是在指责你。但如果是的话,我提供给你。但我允许自己相信你,你会做更多的事情,而不仅仅是复制代码。如果没有,这种方法将来会让你受益。编码愉快!
    • 我可以看到你来自哪里。我被允许接受外部帮助,因为这只是一项练习/任务,而不是一项主要任务。通常我自己想出一个解决方案并将其发布在 stackoverflow 上以获取反馈,但对于这个特定的功能,它真的很令人困惑
    【解决方案3】:

    找出你最长的线N的长度; (N+2) * '-' 为您提供顶部和底部边框。在每行之前添加一个条:'|';用N - n 空格填充每一行,其中n 是该行的长度。在每一行附加一个条形图。按正确顺序打印:顶部、第 1 行、第 2 行、...、L 行、底部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多