尝试在 python 中打印框架 '*' 和对角线

Try to print frame '*' and diagonal in python

我尝试在边框和对角线上打印“*”。

这是我做的:

x=10
y=10
def print_frame(n, m, c):
  print c * m
  for i in range(1, n - 1):
    print c ,' '*(n-2-i),c, ' '*i , c  , c
  print c * m

print_frame(10, 10, '*')

这是结果:

**********
*         *   * *
*        *    * *
*       *     * *
*      *      * *
*     *       * *
*    *        * *
*   *         * *
*  *          * *
**********

正如我在评论中指出的那样,只有方阵才有对角线。但即使是那些,事情也比看起来更复杂 "a bit":

  • 我本可以在一个循环中完成,但我认为最好看到所有 "sections"
  • (string) 计算本可以用更紧凑的方式编写,但为了清楚起见,我保留了它们
  • 还添加了递归变体。我更喜欢这个,因为它更清晰(虽然一般来说,递归有局限性),特别是考虑到问题的性质,递归不够深入以生成 Whosebug,或对性能产生负面影响
  • 我 "return" 不是打印函数内部的字符串。那是一种优化技术:如果不止一个地方需要它们,函数只需要调用一次
  • 函数是生成器(yield 而不是 return)。这也是一种优化(而且是Pythonic)

code01.py:

#!/usr/bin/env python3

import sys


def square_frame_iterative(side, char="*"):
    yield char * side  # Upper row
    for i in range(1, side - 1):
        edge_space = min(i - 1, side - 2 - i)
        mid_space = side - 2 * edge_space - 4
        mid_text = char if mid_space < 0 else char + " " * mid_space + char
        yield char + " " * edge_space + mid_text + " " * edge_space + char
    yield char * side  # Lower row


# Recursion
def _square_frame_recursive(side, char, i):
    if i == side // 2 - 1:
        if side % 2 :
            yield char + " " * ((side - 3) // 2) + char + " " * ((side - 3) // 2) + char  # Mid row
    else:
        s = char + " " * i + char + " " * (side - 2 * i - 4) + char + " " * i + char
        yield s
        yield from _square_frame_recursive(side, char, i + 1)
        yield s


def square_frame_recursive(side, char="*"):
    yield char * side  # Upper row
    if side <= 1:
        return
    yield from _square_frame_recursive(side, char, 0)
    yield char * side  # Lower row

# Recursion end


def main(argv):
    dim = 10
    square_frame_func = square_frame_iterative
    if argv:
        if argv[0].isdigit():
            dim = int(argv[0])
        if (len(argv) > 1) and argv[1].lower().startswith("rec"):
            square_frame_func = square_frame_recursive
    frame_string = "\n".join(square_frame_func(dim))
    print(frame_string)


if __name__ == "__main__":
    print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    main(sys.argv[1:])
    print("\nDone.")

输出:

[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q055342983]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code01.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32

**********
**      **
* *    * *
*  *  *  *
*   **   *
*   **   *
*  *  *  *
* *    * *
**      **
**********

Done.

[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q055342983]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code01.py 7 rec
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

Done.