网站建设捌金手指下拉一,重庆 网站定制,软件工程师培训学校,免费网站空间申请效果图#xff1a;注意哦#xff0c;右边多出来的一点不是程序有问题#xff0c;是打印的时候我用的\t#xff0c;但100#xff0c;三个字符顶格的时候给顶出去的#xff0c;我太懒了#xff0c;不想再调输出格式了#xff0c;就这么凑合看吧实现代码#xff1a;sum …效果图注意哦右边多出来的一点不是程序有问题是打印的时候我用的\t但100三个字符顶格的时候给顶出去的我太懒了不想再调输出格式了就这么凑合看吧实现代码sum int(input(Please input a num:))end [[0 for i in range(sum)] for i in range(sum)]#初始化二维数组(列表)num list(range(1,sum*sum1))XH sum / 2#用于记录循环次数CS 0#用于记录当前层数(从0开始)for i in range(int(XH)):b 0#用于卡住嵌套循环让其每次循环不是全部n*n遍历而是1*1走直角c 0#用于记录跳跃防止在直角处进行两次赋值(因为我的竖排横排设置的长度是一样的在直角处会叠加)e 0#同变量c是反直角使用的记录跳跃d 100#同变量b是用来反直角卡住嵌套循环的for m in range(CS,sum-CS):if (b ! sum-1-CS):for n in range(CS,sum-CS):end[n][m] num[0]num.pop(0)#为了便于赋值全部统一采用pop弹出列表的形式进行取值不容易出现索引混乱b n#记录拐角的行数然后为该行逐一赋值c 1if(c 1):continue#如果是拐角处(我的判断是内层循环的第一次肯定是拐角)则跳过后面的语句进行下一次循环end[b][m] num[0]num.pop(0)for mm in reversed(list(range(CS1,sum-CS))):#为了便于反直角的遍历我采用了reverse方法将列表内容进行反序reverse是列表的方法range没有所以先转型if (d ! CS):for nn in reversed(list(range(CS,sum-CS-1))):end[nn][mm] num[0]num.pop(0)d nne 1if(e 1):continueend[d][mm] num[0]num.pop(0)XH - 1CS 1if(sum % 2 ! 0):add sum // 2end[add][add] num.pop()#当输入为奇数时最中间的是个单独的一个没有直角所以要单独赋值for x in range(sum):for y in range(sum):print(end[x][y],‘\t‘,end ‘‘)print(‘\n‘)总结代码不长但解决问题时想了很久尤其是在搞循环的时候头疼我觉得我的方法不太好一开时有另一个思路但觉得有点不能实现于是就搞了这么一个有些牵强的法子尤其是“直角”“反直角”的处理墨迹了好半天。在做这个的时候遇到个好玩的事情怎么初始化二维列表啊因为Python也没有数组的概念只有嵌套列表但列表想要改值必须初始化好固定的大小的列表否则很容易报索引超出列表范围的错。我开启的时候真不知道只会挨个手敲于是网上查了下发现一个方法end [[0] * sum]*sum这个写法有点让人信服哦一个初始化为0的小列表重复n次然后外面再把重复后得到的多个0合成的列表再重复n次得到一个含n个列表每个列表含n个0。但是问题来了这个写法问题很大第二层没什么问题但第一层全是一个元素举例构建2*2得到end [[0,0],[0,0]],当进行修改end[0][0] 100结果为end [[100,0][100,0]]原因是除了第一个元素列表后面的元素列表是第一个的引用即他们相当于是指针都指向了第一个元素列表当第一个进行修改时(改其他指针也一样)其他指针的值也会改变因为本质上只有一个元素正常的应该是新的指针指向新构建的元素列表而不是直接指原来的。所以我又在同一个网页上往下看了看发现发布者知道这个问题。。。然后我又换了新的写法end [[0 for i in range(6)] for i in range(6)] 这是最标准最正确的写法。内层列表元素0通过for循环迭代器重复6次得到6个0的列表外层列表通过for循环迭代器循环6次得到6个列表最外层层一个列表括起来。重点在于通过for循环迭代器方法每次循环都是重新创建一个新的元素而不是*那种的直接引用。说实话这一次也给我不少教训就上面那个初始化列表我看了上半部分就没再往下看当我弄完程序测试的时候屡屡出问题我一直觉得是我的循环有问题真没往列表方向想然后就是拆解一步步来拆到最后才发现我改一个元素整个列表都跟着变才意识到这个列表写法有问题如果我能一次性读完了解清楚那篇文章写得内容那么我这么长时间的排错是完全可以避免的毕竟时间就是金钱时间就是生命嘛能省时间还是省时间来的好。