2017-02-10 103 views
0

我正在学习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) 
+4

真实的阶梯....这更适合[codereview.se] – MYGz

+0

将您的建议带到答案框! – celestialroad

+0

'random.choice('*******************',)'应该实现的是什么? –

回答

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!

+0

非常好,这真的很有见地。 – celestialroad

+0

不错,你有终端大小:) –