0

0

如何将字母星形图案函数与用户输入循环无缝集成

花韻仙語

花韻仙語

发布时间:2026-03-15 20:31:03

|

124人浏览过

|

来源于php中文网

原创

如何将字母星形图案函数与用户输入循环无缝集成

本文详解如何重构星形图案生成函数,使其接收用户输入的单词作为参数,并嵌入循环交互流程,支持连续输入、校验与即时渲染,为后续扩展完整字母表奠定模块化基础。

本文详解如何重构星形图案生成函数,使其接收用户输入的单词作为参数,并嵌入循环交互流程,支持连续输入、校验与即时渲染,为后续扩展完整字母表奠定模块化基础。

在构建字符艺术(ASCII Art)类程序时,核心挑战之一是解耦逻辑与交互:图案生成应专注“如何画”,而输入控制应负责“何时画、画什么”。原始代码将 name 和 list2 设为全局变量,导致函数无法复用、难以测试,且与主流程强耦合。下面我们将通过三步完成专业级重构——参数化、局部化、流程化。

✅ 第一步:使 pattern() 成为纯函数

原函数隐式依赖全局 name 和 list2,需改为显式接收字符串参数,并在函数内部初始化结果容器:

def pattern(name):
    list2 = []  # ✅ 局部变量,避免副作用
    for char in name:  # ✅ 使用更清晰的变量名替代 i
        if char == "B":
            grid = [[" " for _ in range(5)] for _ in range(5)]
            for row in range(5):
                for col in range(5):
                    if (col == 0) or \
                       (col == 4 and row not in {0, 2, 4}) or \
                       ((row in {0, 2, 4}) and 0 < col < 4):
                        grid[row][col] = "*"
            list2.append(grid)

        elif char == "A":
            grid = [[" " for _ in range(5)] for _ in range(5)]
            for row in range(5):
                for col in range(5):
                    if (row == 0 and 1 < col < 3) or \
                       ((row == 1) and (0 < col < 2 or 2 < col < 4)) or \
                       (row == 2) or \
                       ((row in {3, 4}) and (col == 0 or col == 4)):
                        grid[row][col] = "*"
            list2.append(grid)

        elif char == "L":
            grid = [[" " for _ in range(5)] for _ in range(5)]
            for row in range(5):
                for col in range(5):
                    if col == 0 or (row == 4 and col > 0):
                        grid[row][col] = "*"
            list2.append(grid)

        else:
            print(f"Warning: '{char}' is not supported. Skipping.")
            continue  # ✅ 跳过非法字符,不中断整个流程

    return list2

? 关键改进说明

B12
B12

B12是一个由AI驱动的一体化网站建设平台

下载
  • 所有 print_X 变量统一为 grid,语义更通用;
  • 条件表达式使用反斜杠 \ 换行 + 逻辑分组,大幅提升可读性;
  • continue 替代 print("INVALID") 避免因单个字符失败而终止整个单词渲染;
  • 移除冗余括号与模糊索引(如 0<=col<1 → col == 0),增强健壮性。

✅ 第二步:整合输入验证与主循环

information_gathering_phase() 已具备良好的输入过滤能力(仅允许 'B', 'A', 'L'),我们只需在 main() 中将其输出直接传入 pattern(),并复用其返回的二维字符网格列表进行逐行横向拼接打印

def main():
    print("? Letter Pattern Generator (B / A / L only)")
    print("Type 'stop' to exit.\n")

    while True:
        word = information_gathering_phase()
        if word is None:
            print("Thanks for trying my program... Bye for now!")
            break

        # ✅ 调用纯函数,获取每个字母的5×5网格列表
        grids = pattern(word)

        # ✅ 按行渲染:对每一行(0~4),遍历所有字母网格的该行,横向拼接
        for row_idx in range(5):
            line = ""
            for grid in grids:
                # 将当前行的5个字符转为字符串,后加空格分隔
                line += "".join(grid[row_idx]) + " "
            print(line.rstrip())  # ✅ rstrip() 清除末尾多余空格
        print()  # ✅ 字母组间空行,提升可读性

✅ 第三步:注意事项与扩展建议

  • 性能提示:当前实现对每个字符重建 5×5 网格。若追求更高效率,可预先定义 CHAR_MAP = {'A': [...], 'B': [...], ...},实现 O(1) 查表;
  • 可维护性:每个字母的绘制逻辑可进一步封装为独立函数(如 draw_A()),便于单元测试与协作开发;
  • 健壮性增强:建议在 pattern() 开头添加 if not isinstance(name, str): raise TypeError("Input must be a string");
  • 扩展准备:当添加新字母(如 'C', 'D')时,仅需在 if/elif 链中追加分支,无需修改主流程或打印逻辑。

最终,该结构清晰分离了「数据输入」、「模式生成」和「结果输出」三层职责,符合单一职责原则(SRP),为后续支持大小写兼容、自定义尺寸、文件导出等功能提供了坚实基础。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

262

2025.10.24

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

98

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

106

2025.09.18

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号