Python的一些小程序

Python的一些小程序

初级:打印十行十列的*

#方式一
num = 0
while num < 100:
    print("*",end=" ")
    if (num+1) %10 == 0:
        print()
    num +=1
#方式二
for i in range(10):
 for j in range(10):
     print('*',end=" ")
 print('')

效果:
打印十行十列的*

补充:

  1. range()方法
    range函数定义:range(start , stop , step)
    start:起始数字
    stop:终止数字(不包括此数字)
    step:间距
    range就是形成了一个左闭右开区间[start , stop)
    其中的step就是从当前数字(不包括当前数字)开始数,取第step个数
    如:
    [1,2,3,4,5,6,7,8,9,10] 若step为2:
    1开始,3是第2个;
    3开始,5是第2个;

  2. print( [输出内容] , end=’’ )
    print默认是以\n为end,也就是默认换行。
    如果设为end=‘’将不换行。

进阶1:每隔一列换符号输出

最终效果:
在这里插入图片描述
代码如下

num = 0
while num < 100:
    if num % 2 == 0:
        print("*",end=" ")
    else:
        print("#",end=" ")
    if (num+1) % 10 == 0:
        print()
    num += 1

思路:

  1. 要求两个符号交替打印,可以考虑奇偶列,通过mod2操作确定是奇数列还是偶数列。
  2. 每打印十个符号就要换行。

进阶2:每隔一行换符号输出

最终效果:
在这里插入图片描述
代码如下:

num = 0
while num < 100:
    if num // 10 % 2 == 0:
        char = '*'
    else:
        char = "#"
    print(char,end=" ")
    if (num + 1) % 10 == 0:
        print()
    num += 1

思路:

  1. 上一个例子是隔列换符号,考虑的是奇偶列;那么这个例子是隔行换符号,因此可以考虑奇偶行。如何判断奇偶行就成了问题。
    第一行的下标为:0~9
    第二行的下标为:10~19
    第三行的下标为:20~29


    对每行的下标进行除以10的操作就可以得到每行下标的十位数字。
    通过这个十位数字,我们就可以继续mod2来判断是奇还是偶。
  2. 对于奇数行,使用一种符号打印;对于偶数行,使用另一种符号打印。
  3. 每打印十个符号记得换行。

小结一下

对于打印一个n×n的符号阵来说,可以有两种方法:
方法一:使用双重循环
方法二:使用单循环,但是需要对输出进行换行控制
抽象出两个计算方法:
判断是奇偶列:num % 2 == 0
判断是奇偶行:num // [每行的元素个数] % 2 == 0

拓展

打印三角形
  • 打印“贴在边上的”三角形
    这种三角形比较好理解,第一行打印一个,第二行打印两个…
# 打印三角形1
num = 1
while num < 15:
    varNum = num
    while varNum > 0:
        print('*',end=" ")
        varNum -= 1
    print()
    num += 1

思路:
使用两个循环,内层的控制打印符号数量,外层的控制打印的行数。
其中使用变量varNum是为了打印符合行号的符号数。
效果如下:
在这里插入图片描述

  • 打印“立在中间的”三角形
    这种三角形有些麻烦。因为需要在输出符号前在符号的前面打出足够的空格数。
    因此需要考虑行号与空格数行号与符号数 之间的关系。
    结合效果图来考虑:
    在这里插入图片描述
    • 符号数并不是单调增加,而是呈差值为2的等差数列,即:1,3,5…
    • 将三角形看做以中间轴对称的图形,那么对称轴两边的空格数量相等,进而可以将三角形抽象在一个矩形中,每行需要打印的空格数为:(最大符号数-每行需要打印的符号数) // 2
    • 每次循环需要执行三个功能。第一步是打印空格,第二步是打印符号,第三步是换行。

首先来看第一个问题:每行的符号数是等差数列
假设下标从1开始:
第1行 ==> 1个符号
第2行 ==> 3个符号
第3行 ==> 5个符号

第n行 ==> n+(n-1)个符号
如此,就可以根据行号确定需要打印几个符号了。

然后再来看第二个问题:每行需要打印多少个空格
前面提到,可以将三角形抽象在一个大矩形中。
空格数 = (矩形长边符号数 - 每行要打印的符号数) // 2
而每行要打印的符号数上面已经推出,那么就需要计算出最长边的符号数
换言之,最长边的符号数也就是第n个奇数是多少的问题.
通过查询相关内容,得到一个求第n个奇数的公式:n**2 - (n-1)**2
那么空格数也就解决了。

至于循环打印空格和符号,有了之前循环的铺垫相信也不难做到。
直接给出代码:

# 打印三角形2
num = 1
while num <= 15:
    line_num = 15**2 - (15 - 1)**2 # 求第n个奇数
    tokenNum = num + (num-1)  # 计算每一行应出现的符号数
    space_num = (line_num-tokenNum)//2 # 计算每一行应出现的空格数
    while space_num > 0:  #这个循环用于在输出符号前输出足够数量的空格
        print(" ",end=" ")
        space_num -= 1
    while tokenNum > 0: # 这个循环用于输出符号
        print("*",end=" ")
        tokenNum -= 1
    print()   # 输出完一行后换行
    num += 1
打印菱形

有了上面打印第二种三角形的经验,打印菱形其实可以看做打印两个三角形,一个正着打印,一个倒着打印。
菱形从中间分开,包括中间线及以上的部分用上面的方法打印三角形。
中间线以下的部分规律如下:空格增加,符号减少。

中间线以下的符号数可以参考中间线上的符号数,离中间线越远的,与中间线上符号数的差也就越大;相反的,空格数就会增加。

# 打印菱形
num = 1
while num < 15:
    midLine = 15 // 2 # 计算中间线的行号
    MaxNum = midLine**2 - (midLine-1)**2 # 计算中间线上需要多少个符号
    if num > midLine:
        # 倒着打印
        tokenNum = MaxNum -2*(num - midLine) # 过了中间线就该用最大符号数去减 和离中间线的距离有关
        space_num = (MaxNum - tokenNum) // 2 # 空格数与符号数有关,调整好符号数即可
        while space_num>0:
            print(' ',end=" ")
            space_num -= 1
        while tokenNum>0:
            print('*',end=" ")
            tokenNum -= 1
        print()
    else:
        # 正着打印
        tokenNum = num + (num - 1)  # 计算当前行要打印多少个
        space_num = (MaxNum - tokenNum) // 2 # 计算当前行要打印多少个空格
        while space_num>0:
            print(' ',end=" ")
            space_num -= 1
        while tokenNum>0:
            print("*",end=" ")
            tokenNum -= 1
        print()

    num += 1

效果图如下:
在这里插入图片描述
其实也可以将其抽象为在一个矩形内打印出的菱形。
矩形的最长边符号数就是中间线上的符号数。
中间线上面的符号数用行号去加:num + (num-1)
中间线下面的符号数用最大符号数去减:MaxNum - (num-midLine)*2
(这里乘2的原因是每次都会减少两个符号)
空格数与符号数的关系一直都是:(MaxNum - tokenNum) // 2

这样,就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值