各种星星金字塔

line = int(input('please tell how many lines: '))
#单边 直角三角形
for i in range(1,line+1):
    print(i*'*')
#双边 等腰三角形
for i in range(1,line+1):
    print(' '*(line-i),'*'*(2*i-1))
#双边 另解 全用循环
for i in range(1,line+1):
    for a in range(1,line-1+1):
        print(' '*(line-i))
    for b in range(1,line+1):
        print('*'*(2*i-1))


第二个双边是有问题的。
为什么要用for语句?就是为了不在print里面包含乘号,而是把每行‘ ’或‘*’的个数在range里面体现出来。
#双边 另解 全用循环
for i in range(1,5+1):
    for j in range(1,5-i+1):
        print(' ',end='')
    for j in range(1,2*i-1+1):
        print('*',end='')
    print()

以line = 5,i = 1为例。这里面for a in range(1,5-1+1)的意思是,
    在第1行内部,[1, 5-1] 区间内,1,2,3,4次都要打印一个‘ space', 共计打印4个' ',[1,4]闭区间的循环就结束了,这时代码继续往下走,这时仍在第一行,继续for j in range(1, 2*1-1+1), 即在区间[1,1]闭区间内每次打印一个星号,共计1个星号。

    第二行内部,[1, 3]闭区间内,打印三个' ',结束;往下走,在[1, 3]闭区间内打印3个'*',第二行结束。以此类推

所以这种方法是用循环来限定空格和星号的次数,是分次打印的。而用乘法的话是计算后一次打印出来的。可以用函数计算两种的时长。

用循环的好处是,如果要打印下半部分,不需要更改很多“通项公式”,直接通过改变循环的行数就可以,因为它是一步步执行的,而不是算好之后再统一打出来。

for i in range(1,5+1):
    for j in range(1,5-i+1):
        print(' ',end='')
    for j in range(1,2*i-1+1):
        print('*',end='')
    print()
for i in range(5,1-1,-1):
    for j in range(1,5-i+1):
        print(' ',end='')
    for j in range(1,2*i-1+1):
        print('*',end='')
    print()

注意逆向range的时候的步长,一定要是-1.
特别要注意,在三个for in range语句里面,闭区间的末尾一定要+1,否则会少个1. 

不要以为自己不会犯这种错,一个小时后我在做题的时候就忘记加1,得到了奇怪的图形。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值