Python学习之循环--绕圈圈(蛇形盘)

效果图:

注意哦,右边多出来的一点不是程序有问题,是打印的时候我用的\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*sum+1))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 += 1        if(c == 1):continue        #如果是拐角处(我的判断是内层循环的第一次肯定是拐角)则跳过后面的语句进行下一次循环        end[b][m] = num[0]        num.pop(0)

    for mm in reversed(list(range(CS+1,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 = nn        e += 1        if(e == 1):continue        end[d][mm] = num[0]        num.pop(0)    XH -= 1    CS += 1if(sum % 2 != 0):    add = sum // 2    end[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循环迭代器方法,每次循环都是重新创建一个新的元素,而不是*那种的直接引用。说实话,这一次也给我不少教训,就上面那个初始化列表,我看了上半部分就没再往下看,当我弄完程序测试的时候屡屡出问题,我一直觉得是我的循环有问题,真没往列表方向想,然后就是拆解,一步步来,拆到最后才发现,我改一个元素整个列表都跟着变,才意识到这个列表写法有问题,如果我能一次性读完了解清楚那篇文章写得内容,那么我这么长时间的排错是完全可以避免的,毕竟时间就是金钱,时间就是生命嘛!能省时间还是省时间来的好。

原文地址:https://www.cnblogs.com/zhurs/p/11625991.html

时间: 2024-10-06 00:40:15

Python学习之循环--绕圈圈(蛇形盘)的相关文章

python学习笔记——循环里的else

与之前接触过的语言不同,python有针对循环的else,表示如果循环结束都没有执行里面的break语句就进入到这个else,所以这个else在格式上是与for对齐的. 例: import math for i in range(85, 99): root = math.sqrt(i) if root == int(root): break else: print 'no int root' 版权声明:本文为博主原创文章,未经博主允许不得转载.

python学习之循环

为什么需要循环,假如设想这样一种情况,如果你需要打印一条语句1000次,如果没有循环,你必须输出这条语句1000次,而使用循环只需要二行代码就可以完成这个目的. 所有的循环方式都是类C语言的,除过语言特性不一样 while循环:当一个条件保持为真时while循环重复执行语句 while循环的语法: while loop--continuation-condition: Statement(s) 一个循环体单次执行被称作循环的一次迭代,每个循环都包含一个循环继续条件,这是控制循环体执行的布尔表达式

python学习日记-循环和键值对

循环:python循环有两个,for和while for循环表示某一项变量在集合内,就继续执行循环,直到变量不在几个内了,就跳出循环. 比如一个集合a=[1,2,3,4]; for i in a: do sth: while循环是条件循环,当满足条件才执行循环.否则就不执行. 比如 a=[1,2,3,4] i=0; while i<len(a):#就是说i的值比a的长度值小. do sth; i++;#必须控制变量. 键值对: 键值对就想c#里面的hashtable一样,一个键对应一个值. 要想

Python学习笔记(Ⅱ)——循环/选择/函数

一.循环结构 python中提供了for循环和while循环两种操作,没有do--while语句. 1.for循环: 与其他语言中for循环的常见的写法如for (int i=0;i<10;i++)不同,python中的for循环更加类似于foreach结构: ##举例:遍历输出一个单词的所有字母for letter in 'Python': print('当前字母 :'+letter) 对比: string str = "Python"; foreach(char c in s

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

python学习第五天 - for...in...循环

for..in语句是另一个循环语句,它迭代一个对象的序列,例如经历序列中的第一项.在后面的章节,我们将会看到更多关于序列的细节.现在,你需要知道的是一个序列只是一个有序的项目的集合. 例如 (保存为 for.py): for i in range(1,5): print(i) else: print('for循环结束') >>> ================================ RESTART ================================ >&g

王亟亟的Python学习之路(四)-循环,条件,Range,list和tuple

转载请注明出处:王亟亟的大牛之路 这是本次Python学习历程的第4篇,之前的文章:传送门 这篇主要讲以下几个知识点 - 循环 - 条件语句 - range函数 - list - tuple 循环 Python中的循环语句有 for 和 while.同样需要注意冒号和缩进.另外,在Python中没有do..while循环. 需要注意冒号和缩进,因为没有{}来帮助我们把循环里面的内容封起来 while循环 while 判断逻辑: 业务内容 或者for-in循环 names = ['12',12,

Python学习杂记_4_分支和循环

分支 和 循环 分支和循环这俩结构在各语言中都有着很重要的地位,当然我之前都没有学好,这里总结一下在Python学习中对这俩结构的认识. 分支结构 # 单分支 if 条件判断: 执行语句- # 双分支 if 条件判断: 执行语句- else: 执行语句- #多分支 if 条件判断: 执行语句- elif: 执行语句- else: 执行语句- 循环结构 1. while循环 ,需要定义循环变量来控制循环. i = 0初始化一个控制循环的变量 while 有关循环变量的条件判断: 执行循环语句 -

python学习[第十三篇] 条件和循环

python学习[第十三篇] 条件和循环 if语句 单一if 语句 if语句有三个部分构成,关键字if本身,判断结果真假的条件表达式,以及表达式为真或非0是执行的代码 if expression: expr_true_suite 条件表达式可以是多重的 通过布尔操作符 and or not来实现 单一语句的if 代码块,如果if语句的执行代码只有一行,可以放在一行来写 if expresssion: expr_tru_suite >>> if True: print True ... T