尝试在 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.
我尝试在边框和对角线上打印“*”。
这是我做的:
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.