在重复程序中实现递归(或其他)

时间:2017-02-10 10:15:15

标签: python recursion

我正在学习Python中的递归,我写了一个小程序,我想为了博学而改进。

程序重复打印改变颜色的星号线。程序一直运行直到我停止它。现在它按预期工作,但只是通过查看它我可以告诉必须有一个更好的方式来递归地写这个,或者可能使用另一种方法。

请发布一些演示如何改进此计划的答案。如果您不想,则不必使用termcolor模块。

以下是我的代码:

import random
from termcolor import colored

s = random.choice('*******************',)
colors = ['red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']
text_color = ""

def set_color(colors):
    global text_color
    text_color = random.choice(colors)

while True:
    for a in s:
        for b in s:
            for c in s:
                for d in s:
                    for e in s:
                        for f in s:
                            for g in s:
                                for h in s:
                                    for i in s:
                                        for j in s:
                                            for k in s:
                                                for l in s:
                                                    for m in s:
                                                        for n in s:
                                                            for o in s:
                                                                for p in s:
                                                                        print(colored(a, text_color)), (colored(b, text_color)), (colored(c, text_color)), (colored(d, text_color)), (colored(e, text_color)), (colored(f, text_color)), (colored(g, text_color)), (colored(h, text_color)), (colored(i, text_color)), (colored(j, text_color)), (colored(k, text_color)), (colored(l, text_color)), (colored(m, text_color)), (colored(n, text_color)), (colored(o, text_color)), (colored(p, text_color)), (colored(a, text_color)), (colored(b, text_color)), (colored(c, text_color)), (colored(d, text_color)), (colored(e, text_color)), (colored(f, text_color)), (colored(g, text_color)), (colored(h, text_color)), (colored(i, text_color)), (colored(j, text_color)), (colored(k, text_color)), (colored(l, text_color)), (colored(m, text_color)), (colored(n, text_color)), (colored(o, text_color)), (colored(p, text_color)); set_color(colors)

1 个答案:

答案 0 :(得分:3)

所以random.choice('*******************',)会从字符串中选择一个随机字符。由于所有字符都是'*',因此您基本上可以用s = '*'替换整个表达式。

嵌套循环位于for x in s窗体上。自s = '*'起,这相当于for x in '*'。对于单字母字符串,这是一个只有一次迭代的循环 - 因此可以用x = 's'替换它。

现在要注意的第三件事是,名为ap的所有变量都是相同的,并且包含一个星号。它们都可以删除,而是在使用s的任何地方使用。

最后,巨大的print语句充满了colored(s, text_color)。它们可以由' '.join(colored(s, text_color) for _ in range(32))

替换

所以你最终得到了以下程序:

import random
from termcolor import colored

s = '*'
colors = ['red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']
text_color = ''

def set_color(colors):
    global text_color
    text_color = random.choice(colors)

text_color = set_color(colors)
while True:
    print(' '.join(colored(s, text_color) for _ in range(32)))
    set_color(colors)

可以进一步简化:

import random
from termcolor import colored, COLORS
while True:
    color = random.choice(COLORS.keys())
    print(' '.join(colored('*', color) for _ in range(32)))

这更有趣,它将使用背景和前景色,而不使用任何空格:

import os
from random import choice
from termcolor import colored, COLORS, HIGHLIGHTS
r, c = os.popen('stty size', 'r').read().split()
WIDTH=int(r+c) # actual terminal width under Linux
while True:
    print ''.join(colored('▄', choice(COLORS.keys()), choice(HIGHLIGHTS.keys())) for _ in range(WIDTH)),

输出: random colors everywhere!