python 基础系列篇:六使用 * 号做出一个数字点阵
Posted 文盲老顾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 基础系列篇:六使用 * 号做出一个数字点阵相关的知识,希望对你有一定的参考价值。
python 基础系列篇:六、使用 * 号做出一个数字点阵
来源于问答的题目
这个内容,来源自两个问答内容,其实也可以算作一个,分别是:
https://ask.csdn.net/questions/7914036
https://ask.csdn.net/questions/7903438/54117172?spm=1001.2014.3001.5501
这两个问答的内容其实是一致的,所以老顾偷懒直接粘贴网址回答了,另一个则实实在在的去实现了一遍。
题目内容:
使用设置好的字符宽度、高度,用星号显示指定的数字字符串
嗯,之前的题目由于是 js 里的,所以这两位题主也就没要求可以编辑的,即无需再控制台输出,无需在 textarea 里使用。所以老顾的实现其实有些想多了。
但是,这个题目还是比较有意思的,所以老顾准备拿过来用 python 再实现一遍。
实现分析
我们拿到了任何题目,都需要先做一遍需求分析,并把逻辑摆顺了,才能进行开发,老顾希望所有看到老顾文章的读者们,都能自主的完成需求分析。
下边就是老顾的分析过程了。先说说 js 第一版的内容。
数字怎么表示?
可以看到,我们需要按照液晶计算器的方式来展现数字,那么,我们就按照液晶计算器的数字格式,来区分数字需要显示的内容
在问答里,老顾给出了两个方式
numObj =
0 : ['***'
,'* *'
,'* *'
,'* *'
,'***'],
1 : [' *'
,' *'
,' *'
,' *'
,' *'],
2 : ['***'
,' *'
,'***'
,'* '
,'***'],
3 : ['***'
,' *'
,'***'
,' *'
,'***'],
4 : ['* *'
,'* *'
,'***'
,' *'
,' *'],
5 : ['***'
,'* '
,'***'
,' *'
,'***'],
6 : ['***'
,'* '
,'***'
,'* *'
,'***'],
7 : ['***'
,' *'
,' *'
,' *'
,' *'],
8 : ['***'
,'* *'
,'***'
,'* *'
,'***'],
9 : ['***'
,'* *'
,'***'
,' *'
,'***']
这种方式其实就是很直观的,自己按照最小尺寸写了一遍
而另一种,则简略的多了
numObj =
0 : [1,1,1,0,1,1,1],
1 : [0,0,1,0,0,1,0],
2 : [1,0,1,1,1,0,1],
3 : [1,0,1,1,0,1,1],
4 : [0,1,1,1,0,1,0],
5 : [1,1,0,1,0,1,1],
6 : [1,1,0,1,1,1,1],
7 : [1,0,1,0,0,1,0],
8 : [1,1,1,1,1,1,1],
9 : [1,1,1,1,0,1,1]
什么意思呢?那是因为液晶数字,一共有7个线段组成了,按照顺序书写其位置是否需要显示,则可以转成上边的数组了。
嗯,不管那一种方式,其实都是用了七个位置的信息,这个稍后再说
根据宽和高,确定数字高矮胖瘦及腰
宽度很容易,设置多少,就宽多少,高度则会影响到腰的位置,比如高度5,腰的索引就是 2,高度7,腰就在3 了,那么如果是6呢?根据问答题主的意思,就是腰要高一点,腿要长一点,那么,高度6,腰的位置也在2
例如
**** **** ****
* * * * * *
**** **** * *
* * * * ****
**** * * * *
**** * *
****
那么有了数字的描述,有了高矮胖瘦和腰,那么我们就可以列出数字的点阵了。
有兴趣的小伙伴可以看看 js 的实现,这里老顾先实现一次 python 的,这里老顾使用第二种方式的数组。
num = ['1110111','0010010','1011101','1011011','0111010','1101011','1101111','1010010','1111111','1111011']
w = 5
h = 7
s = '0123456789'
生成数字点阵
由于有了宽和高,所以,每个数字所使用的区域其实就已经确定了,一定是宽乘高个点,那么我们可以直接生成一个宽乘高的二维列表,默认全是空格即可。
r = [[' ' for _ in range(w)] for _ in range(h)]
然后根据我们每个数字的使用的区域,来重新替换到相应为止的空格变成星号。
# 假设当前数字是 8,那么所有7个位置都需要替换成星号
p = '1111111'
for i in range(7):
if p[i] == '1':
if i == 1:
for j in range((h - 1) // 2):
r[j][0] = '*'
elif i == 2:
for j in range((h - 1) // 2):
r[j][-1] = '*'
elif i == 4:
for j in range((h - 1) // 2,h):
r[j][0] = '*'
elif i == 5:
for j in range((h - 1) // 2,h):
r[j][-1] = '*'
elif i == 0:
r[0] = ['*'] * w
elif i == 3:
r[(h - 1) // 2] = ['*'] * w
elif i == 6:
r[-1] = ['*'] * w
for row in r:
print(''.join(row)
可以看到,单个数字很容易就可以被转换出来了。
使多个数字点阵在同一行呈现
现在问题来了,多个数字的话,我们应该怎么定义数字转点阵的自定义函数呢?
是返回成为点阵的内容,还是返回完整数组的内容,还是。。。嗯h行字符串的列表呢?
上一篇我们讲到了函数的定义,这次就是实战了。
我们来分析一下:
1、返回已经拼接成点阵的字符串
这个时候,我们还需要再到调用过程中,从新按照换行切割一下,否则我们很难实现将数字显示在同一行这个要求
2、返回完整的二维数组
嗯,这个时候,我们如果显示多个数字,我们只需要将每个数字转成二维数组,然后按高循环一遍,拿出所有返回结果中对应的行,然后拼接就好,这个时候,有点小问题,数字和数字之间的间隔还需要从新单独定义一下
3、返回高度行的字符串列表
这个方式,老顾觉得很赞,在按照高度循环拿出对应行的数据时,我只需要再次 join 一个间隔就很nice的完成了同一行现实的方式了。
num = ['1110111','0010010','1011101','1011011','0111010','1101011','1101111','1010010','1111111','1111011']
w = 5
h = 7
s = '0123456789'
def numPoint(n,w,h):
r = [[' ' for _ in range(w)] for _ in range(h)]
p = num[int(n)]
for i in range(7):
if p[i] == '1':
if i == 1:
for j in range((h - 1) // 2):
r[j][0] = '*'
elif i == 2:
for j in range((h - 1) // 2):
r[j][-1] = '*'
elif i == 4:
for j in range((h - 1) // 2,h):
r[j][0] = '*'
elif i == 5:
for j in range((h - 1) // 2,h):
r[j][-1] = '*'
elif i == 0:
r[0] = ['*'] * w
elif i == 3:
r[(h - 1) // 2] = ['*'] * w
elif i == 6:
r[-1] = ['*'] * w
return [''.join(row) for row in r]
for i in s:
print(numPoint(i,w,h))
那么,我们现在只需要将返回的数字点阵换成横行显示就可以了
ps = []
for i in s:
ps.append(numPoint(i,w,h))
for i in range(h):
print(' '.join([n[i] for n in ps]))
可以看到,很 easy 的就实现了这个数字转点阵的方式了。
然后,我们就可以显示我们定制的数字字符了
num = ['1110111','0010010','1011101','1011011','0111010','1101011','1101111','1010010','1111111','1111011']
def numPoint(n):
r = [[' ' for _ in range(w)] for _ in range(h)]
p = num[int(n)]
for i in range(7):
if p[i] == '1':
if i == 1:
for j in range((h - 1) // 2):
r[j][0] = c
elif i == 2:
for j in range((h - 1) // 2):
r[j][-1] = c
elif i == 4:
for j in range((h - 1) // 2,h):
r[j][0] = c
elif i == 5:
for j in range((h - 1) // 2,h):
r[j][-1] = c
elif i == 0:
r[0] = [c] * w
elif i == 3:
r[(h - 1) // 2] = [c] * w
elif i == 6:
r[-1] = [c] * w
return [''.join(row) for row in r]
def showNumPoint(s):
ps = []
for i in s:
ps.append(numPoint(i))
for i in range(h):
print(' '.join([n[i] for n in ps]))
w = 5
h = 7
s = '5201314'
c = '♥'
showNumPoint(s)
小结
其实任何问题,我们需要自己去寻找到解决方案,而解决方案则是根据你的分析内容得出来的,需求分析永远是开发人员绕不过去的第一步,如果这一步都做不好,逻辑无法理顺,那么后续的开发一定是错漏百出的。
一些在小说中的文字
记得在一篇小说中看到了这样的文字,老顾分享给初学者们。
知识重要吗?
大家都觉得知识很重要吗?”
“错!”
“在现在的社会,最廉价的就是知识,你去度娘上搜一搜,各种你想要的知识应有尽有。更重文献,稍微花个十几二十块,注册个会员,都是可以查询下载的。”
可是这有用吗?”
解决问题
“学习知识的目的,就是为了解决现实中的问题,你们拥有了解决问题的能力,你们自己才对别人有价值。”
“而在大学,真正要学习的,并不是枯燥,乏味,单一,和没有竞争壁垒的知识。”
“因为在这个社会,这些东西很快就会被人工智能所替代,而只有一样东西是人工智能永远无法替代的,那就是解决问题的能力!”
“知识只是原材料,架构在知识之上的解决问题的能力,才是核心竞争力!这才是大学真正要学习的东西。”
学科思维
“当春运的时候,火车票买不到,经济学就会认为:提高票价,就是解决问题的唯一办法,用价格来筛选需求。”
“这,就是经济学的学科思维。”
“为什么很多人学会计,他们赚钱的方式是做假账,把自己成功的快递到了监狱里面。”
“但真正的精英,却可以用会计知识,进行资产重组,税务包装。”
“这就是会计学的学科思维。”
以上文字摘自一个小说,嗯,名字很羞耻《颠覆了,这是皇帝聊天群》,第255章内容。话虽然白了点,也略有偏激,但意思其实还真是这个意思。
各位既然进入了编程的学习,那么我想大家的目的并不是当一个纯粹的码农吧,那么解决问题的能力就很重要了,而解决问题的第一步,就是分析问题,并罗列其中的关系、顺序、解决方式等等。这才是一个开发人员所应具备的第一个能力,而不是写代码。
望各位都能学会自己解决问题。
时时彩三星组六走势杀号技巧基础篇
竞彩看你怎样对待,是打酱油还是稳重的对待,假如仅仅打酱油,那我就劝你不要花太多心思在竞彩上面了,不适合你赚不到钱的,你还不如把竞彩的钱拿去买双色球说不定还有中500万的机会,能给自己一点期望,最起码买了不会有那么大的心理压力,比竞彩好多了!要么就不要玩!要想在这儿赚到钱的,你就得作为投资来对待,否则就不要搞,想要在这个行业里边赚到钱,你必须用心思来仔细对待!
所以时机的介入很重要,基本的走势基础是要必备的。把握走势的精准才能有效的投注,才能盈利。盲目的投注只会让你的心态改变?总想着一把×××一把肥就收,这样的心态形成后那就很危险了。
所以请我们竞彩的兄弟面对现实,不要一向针对那些啥稳赚办法窍门没含义的东西去死搞,眼光放长远点,想疑问想的全面点,你想开了,一切疑问迎刃而解,太限制自个了,所谓的知己知彼攻无不克!下面讲解下我个人一直的玩法三星组六走势分析和判断组三的防患基础经验。
观察走势法:
看走势图是竞彩必须做的一件事,根据走势总结规律,判断下期的开奖号码,分析重码、斜码、跳码,形态组合等出号规律。
首先我们要观察当天或者当前时间段30期的三星组六走势图:
上图是今天的走势图?大家可以发现走势不是很好但凭着自己的一些技巧和经验就难不倒赚钱。
首先介绍一下出组3的一些号码组合,走势形态。
连号:如上图45期开奖号码《567》那么我们要做好两期防组3的计划
重号:两期后3开奖号码至少2个数字是重复的例如上图41,42 ,50、51期都是重号那么做好防组3两期计划如果本金雄厚就可以抓抓组3毕竟组三的奖金是很吸引人的,本金少可以防。
组合形态:大家可以看上图组3过后每1期或者2期等开出一个组3这种形态我统称为S形态,如果在玩的时候我们就能有效防止挂到组3上面或者抓取组3 。但这种S形态期数不定每天常见的最多的是1期S形态。
号码组合法:每天在开奖5个数里经常观察的人会发现出组3前都有一定的规律比如号码形态有AABCC、AABBC、ABBCC、ABCAB、和周期号码比如036、139、369、及连号和重号后一期百位开0或者1这些形态在每天或者某个时间段出组3很准.所以大家做好防组3准备。注意:《以上方法只能在走势差时管用,组六长龙无组三这是铁的定律》以上方法是一个大神玩家QQ:248,1055,951的个人多年经验都属于固定方法,需要灵活运用准确率每种方法分周期性希望大家理解谢谢!下面介绍两种简单的杀号法。
垂直走势杀号法:
大家看到上图就会发现这垂直走势的特点是,走势有规律重号比较多,一般出现垂直走势杀号就很简单直接挑选两个冷号杀到挂。连中是常见的有时候碰到冷号20期都有。
斜号走势杀号法:
斜号走势杀号比垂直杀号有点难度对于新手可能无法理解。但是对于经常观察走势图的人来说就不难发现这种赚钱的规律 。0--4为小号5--9为大号如果开奖号码倾斜于小号那我们杀号的重心放在大号以此反之。《但是走势一定是斜号走势》这些都是基本的看走势杀号法?稳定性一般,不管是垂直走势或者斜号走势大家一定注意别杀热号。但是如果你玩的是胆拖那就死劲杀热号吧?但注意热变冷的转折点。
以上是关于python 基础系列篇:六使用 * 号做出一个数字点阵的主要内容,如果未能解决你的问题,请参考以下文章
Python从入门到精通五万六千字对Python基础知识做一个了结吧!(二十八)值得收藏