《Automate the Boring Stuff》Colorama心形网格打印着色异常排查
问题描述
- 完成《Automate the Boring Stuff》教材的网格翻转打印挑战时,已掌握嵌套列表实现网格的逻辑,基础翻转功能可正常输出心形轮廓
- 计划拓展功能:使用Colorama库将代表心形的
O字符设置为红色,代表背景的.字符设置为绿色 - 实际运行情况:心形轮廓可正常显示,彩色效果生效,但着色逻辑完全不符合预期
原实现代码
from colorama import Fore, init init() # 教材给定的原始网格,需要翻转后打印心形 grid = [['.', '.', '.', '.', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['O', 'O', 'O', 'O', 'O', '.'], ['.', 'O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['.', '.', '.', '.', '.', '.']] heart=[] # 翻转网格存入新列表 for x in range(len(grid[1])): for i in range(len(grid)): heart.append(grid[i][x]) # 用于判断字符对应颜色 dot=['.'] circle=['O'] # 按每行9个字符打印,嵌套判断实现着色 for index, item in enumerate(heart): if ((index+1)%9==0): if item in dot: print(Fore.GREEN+item) else: print(Fore.RED+item) else : if item in dot: print(Fore.GREEN+item, end=" ") else: print(Fore.RED+item, end=" ")
问题根因
- 最核心的bug:Colorama的
Fore颜色设置是全局持久生效的状态,不是只绑定在你当前拼接的单个字符串上。你每次设置完颜色打印字符后从来没有重置过颜色状态,后面所有打印的内容都会沿用最后一次设置的颜色,自然会出现着色混乱的问题。 - 无意义冗余:专门定义
dot=['.']、circle=['O']两个单元素列表做成员判断完全多余,直接判断字符是否相等就行,平白增加没必要的代码。 - 排版瑕疵:打印非行尾字符时额外加了空格,会把原网格的横向间距拉宽,让心形变形走样。
- 逻辑绕路:本来直接按列遍历二维网格就能逐行打印,你非要先把网格拍平成一维列表,再靠索引取模判断什么时候换行,平白增加了逻辑复杂度,也容易出索引判断的bug。
修正参考代码
from colorama import Fore, init # 初始化时开启自动重置,每次打印后自动恢复默认颜色,从根源避免颜色状态乱窜 init(autoreset=True) grid = [['.', '.', '.', '.', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['O', 'O', 'O', 'O', 'O', '.'], ['.', 'O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O', '.'], ['O', 'O', 'O', 'O', '.', '.'], ['.', 'O', 'O', '.', '.', '.'], ['.', '.', '.', '.', '.', '.']] # 直接按列遍历打印,不需要拍平成一维列表再靠取模判断换行 for col in range(len(grid[0])): current_line = [] for row in range(len(grid)): char = grid[row][col] if char == 'O': current_line.append(Fore.RED + char) else: current_line.append(Fore.GREEN + char) # 拼接整行后一次性打印,逻辑更简洁 print(''.join(current_line))
内容的提问来源于stack exchange,提问作者dadagario
相关产品推荐
相关产品推荐

