消息周围的绘图框

Drawing box around message

我正在处理这个我无法理解的 Python 任务。它是 3 个功能中的最后一个,前 2 个比这个更容易编程。说明是 "Given a message that may contain multiple lines, utilize the split() function to identify the individual lines, and the format() function so that when printed, it draws a box around the message's lines, all centered. Box uses vertical bars & dashes on the sides (|, -), +'s in the corners (+), and there is always a column of spaces to the left and right of the widest line of the message."

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

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

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

测试:border_msg("hi!\nhow are you?\ndrive safely!") == '+--------------+\n|你好! |\n|你好吗? |\n|安全驾驶! |\n+----------------+\n'

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

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

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

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

我拼接了一小段代码来实现装箱消息。老实说,这不是最好的代码,但它完成了工作,并希望能帮助您自己完成(并且做得更好)。为此,我决定不包含评论,因此您必须自己考虑清楚。也许不是最好的教育方式,但我们还是试试吧:]

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 |
# +---------------------------+
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