根据给定字符数和字符,打印输出“沙漏”和剩余数

155 篇文章 3 订阅

Python 官网https://www.python.org/




  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


根据给定字符数和字符,打印输出hourglass和剩余数


目 录

在这里插入图片描述


回目录

一、每行前插空格实现

  寒佬博文有详尽解读和源码,可以点击蓝色文字移步寒佬博文赏析。

寒佬博文链接: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 -= k
    if 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 -= k
    if 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博:
推荐条件 点阅破千

回目录


老齐漫画头像

精品文章:

来源:老齐教室


回目录

Python 入门指南【Python 3.6.3】

好文力荐:

CSDN实用技巧博文:


  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值