根据给定字符数和字符,打印输出“沙漏”和剩余数
Python 官网:https://www.python.org/
-
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- 1、题目
- 2、孤寒者解法——每行前插空格实现
- 3、我的解法——先求出半部“沙漏”
- 4、Math大佬解法——公式法

一、每行前插空格实现
寒佬博文有详尽解读和源码,可以点击蓝色文字移步寒佬博文赏析。
寒佬博文链接:http://t.csdn.cn/7a7hu
二、我的解决方案
解析思路:从寒佬的博文中得到启发,想到先求出“沙漏”的下半部。基于“沙漏”图形对称,反向打印下半部列表,即可完成上半部输出。
代码:
#!/sur/bin/env python
# coding: utf-8'''
filename: /sdcard/qpython/tem.py
梦幻精灵_cq的炼码场'''num, ch = input(f"\n{'数字 符号(如:19 *):':>12}").strip().split()try: # 拦截非法输入。n = (num := int(num) - 1)//2 # 不计算中间行一行,所以减一。
except Exception as e:print(f"\n{' 输入错误!':-^45}\nErrorType:{e}\n{'~'*50}\n")exit() # 打印错误提示后退出。if num < 0: # 拦截非法输入。print(f"\n{' 请输入正整数!':~^43}\n")exit() # 打印错误提示后退出。hourglass = [] # 沙漏列表初值。for k in range(3, n, 2): # 获取沙漏下半幅行(列表)。每行符号数量是差值为2的等差数列。hourglass.append(chr*k) # 记录当前行。n -= kif n < k + 2: break # 剩余可用符号数量不足再排一行,退出“定行”循环。remaining = num - ''.join(hourglass).count(ch)*2 # 计算剩余
print(f"\n{' 沙漏下半部列表:'}{hourglass}\n\n{' 沙漏图形 ':~^46}\n")for i in range(-1, -len(hourglass)-1, -1): # 打印上层print(hourglass[i].center(50))print(ch.center(50)) # 打印中间for i in hourglass: # 打印下层print(i.center(50))print(f"{remaining:^50}\n") # 打印余数。input(' Wait a moment ... '.center(50, '~'))


也可以用每行符号数量的整数列表来记录“沙漏”下半部,修改相应代码就好。
remaining = num - sum(hourglass)*2 # 计算剩余
print(f"\n{' 沙漏下半部列表:'}{hourglass}\n\n{' 沙漏图形 ':~^46}\n")for i in range(-1, -len(hourglass)-1, -1): # 打印上层print((hourglass[i]*ch).center(50))print(chr.center(50)) # 打印中间for i in hourglass: # 打印下层print((i*chr).center(50))


三、大佬高级“数学”解法
其代码是目前我认为的“最好”代码。
我背下的“较好的”代码:
num, ch = input(f"\n{'数字 符号(如:19 *):':>16}").strip().split() # 用字符串split方法分割数字和符号。
h = int((((n := int(num)) + 1)/2)**(1/2)) # 沙漏半部层高,n为总字符数量,用海象运算符赋值(Python3.x以下版本,请修改此条语句)。for i in range(1-h, h): print(((2 * abs(i) + 1) * ch).center(50)) # 字符串方法center居中打印每行符号。用层高h打印整个沙漏。
“较好的”代码详解及源码博文链接:http://t.csdn.cn/g8yeN

我的“沙漏”图形输出,出可以用“较好的”代码优化
num, ch = input(f"\n{'数字 符号(如:19 *):':>12}").strip().split()try: # 拦截非法输入。n = (num := int(num) - 1)//2 # 不计算中间行一行,所以减一。
except Exception as e:print(f"\n{' 输入错误!':-^45}\nErrorType:{e}\n{'~'*50}\n")exit() # 打印错误提示后退出。if num < 0: # 拦截非法输入。print(f"\n{' 请输入正整数!':~^43}\n")exit() # 打印错误提示后退出。hourglass = [] # 沙漏列表初值。for k in range(3, n, 2): # 获取沙漏下半幅行(列表)。每行符号数量是差值为2的等差数列。hourglass.append(k) # 记录当前行。n -= kif n < k + 2: break # 剩余可用符号数量不足再排一行,退出“定行”循环。h = len(hourglass) + 1 # 沙漏半部高h即半部行数+中间行。
remaining = num - sum(hourglass)*2 # 计算剩余
print(f"\n{' 沙漏下半部列表:'}{hourglass}\n\n{' 沙漏图形 ':~^46}\n")for i in range(1-h, h): print(((2 * abs(i) + 1) * ch).center(50)) # 字符串方法center居中打印每行符号。用层高h打印整个沙漏。print(f"{remaining:^50}\n") # 打印余数。input(' Wait a moment ... '.center(50, '~'))
两个for循环,被一条语句替代。
本练习感悟:代码,一般都是可以优化的。
__上一篇:__ 重建我的color工具——(用初通Python之class全新修葺)
__下一篇:__
我的HOT博:
- Hot:聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )(1011阅读)
- 练习:银行复利计算(用 for 循环解一道初中小题)(1082阅读)
- pandas 数据类型之 DataFrame(1514阅读)
- 班里有人和我同生日难吗?(概率probability、蒙特卡洛随机模拟法)(2116阅读)
- Python字符串居中显示(1624阅读)
- 练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(1656阅读)
- 用 pandas 解一道小题(1981阅读)
- 可迭代对象和四个函数(1074阅读)
- “快乐数”判断(1234阅读)
- 罗马数字转换器(构造元素取模)(1950阅读)
- Hot:罗马数字(转换器|罗生成器)(4012阅读)
- Hot:让QQ群昵称色变的代码(30059阅读)
- Hot:斐波那契数列(递归| for )(4053阅读)
- 柱状图中最大矩形(1658阅读)
- 排序数组元素的重复起止(1247阅读)
- 电话拨号键盘字母组合(1363阅读)
- 密码强度检测器(1829阅读)
- 求列表平衡点(1823阅读)
- Hot: 字符串统计(4293阅读)
- Hot:尼姆游戏(聪明版首发)(3441阅读)尼姆游戏(优化版)(1052阅读)
推荐条件 点阅破千
精品文章:
- 好文力荐:《python 完全自学教程》齐伟书稿免费连载
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室
Python 入门指南【Python 3.6.3】
好文力荐:
-
全栈领域优质创作者——寒佬(还是国内某高校学生)好文:《非技术文—关于英语和如何正确的提问》,“英语”和“会提问”是学习的两大利器。
-
【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
-
靠谱程序员的好习惯
CSDN实用技巧博文:
- 8个好用到爆的Python实用技巧
- python忽略警告
- Python代码编写规范
- Python的docstring规范(说明文档的规范写法)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
