鱼C论坛

 找回密码
 立即注册
查看: 971|回复: 9

[已解决]循环的逻辑

[复制链接]
发表于 2017-9-13 16:57:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位,最近在自学python,之前也没接触过变成,关于下面这段代码的循环,我个人认为第二个for语句(即空格缩进的那句)应该放在if后面而不是else后面,但运行结果是要放在else后面。请哪位大神帮忙分析一下,谢谢!代码如下:
  1. def print0(the_list,level):
  2.     '''
  3. 这个函数取一个位置参数,名为‘the_list’,他可以是任何符合Python规则的列表。所指定
  4. 的列表中的每个列表项会(递归)的输出到屏幕上,每个列表项单独占一行。
  5. '''
  6.     for each_item in the_list:
  7.         if isinstance(each_item,list):
  8.             print0(each_item,level+1)#函数调用自身,重复上面的操作;此处的each_item可能是子列表
  9.         else:
  10.             for tab_stop in range(level):
  11.                 print('\t',end='')
  12.             print(each_item)
复制代码
最佳答案
2017-9-13 22:58:30
  1. def print0(the_list,level):
  2.     '''
  3. 这个函数取一个位置参数,名为‘the_list’,他可以是任何符合Python规则的列表。所指定
  4. 的列表中的每个列表项会(递归)的输出到屏幕上,每个列表项单独占一行。
  5. '''
  6.     for each_item in the_list: # 用for循环取出the_list中的值赋值给变量each_item
  7.         if isinstance(each_item,list): # 检查each_item的类型是否是列表(list) 如果是则调用执行函数print0 ;不是列表就执行else下面的语句块
  8.             print0(each_item,level+1)#函数调用自身,重复上面的操作;此处的each_item可能是子列表
  9.         else: # each_item不是列表的时候 执行下面的代码块儿
  10.             for tab_stop in range(level): # 使用range生成一个列表 并for循环赋值给tab_stop
  11.                 print('\t',end='')
  12.             print(each_item)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-9-13 16:57:42 | 显示全部楼层
自己顶了      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 17:17:07 | 显示全部楼层
函数要求:   每个列表项单独占一行
实现方式:   函数递归调用

外层for循环中,用于遍历整个大列表(可能包含列表的列表): 如果元素为列表,则遍历该列表,按要求输出其中的元素
如果不是列表,则直接打印.....

逻辑弄清楚了,就知道为什么第二个for循环要放在else后面了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-13 22:58:30 | 显示全部楼层    本楼为最佳答案   
  1. def print0(the_list,level):
  2.     '''
  3. 这个函数取一个位置参数,名为‘the_list’,他可以是任何符合Python规则的列表。所指定
  4. 的列表中的每个列表项会(递归)的输出到屏幕上,每个列表项单独占一行。
  5. '''
  6.     for each_item in the_list: # 用for循环取出the_list中的值赋值给变量each_item
  7.         if isinstance(each_item,list): # 检查each_item的类型是否是列表(list) 如果是则调用执行函数print0 ;不是列表就执行else下面的语句块
  8.             print0(each_item,level+1)#函数调用自身,重复上面的操作;此处的each_item可能是子列表
  9.         else: # each_item不是列表的时候 执行下面的代码块儿
  10.             for tab_stop in range(level): # 使用range生成一个列表 并for循环赋值给tab_stop
  11.                 print('\t',end='')
  12.             print(each_item)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 10:54:35 | 显示全部楼层
SuMo 发表于 2017-9-13 17:17
函数要求:   每个列表项单独占一行
实现方式:   函数递归调用

非常感谢!
就是因为有些逻辑关系不是很清楚或者是理解,所以经常会有类似的困惑。
关于上面的代码我可不可以这么理解:if后面else前面的这段代码就是循环判定整个列表里的每个列表项是否是list的,只是半段但不执行输出操作,如果是list就再重复对子列表的项进行判断,直到最后一个;如果不是list就转到else。最终的输出操作都是在else下面执行的。
这样理解对吗?谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 11:40:08 | 显示全部楼层

非常感谢!
经过各位的指点,现在对逻辑关系没有太多的疑问了,但是关于level的值还不是太清楚,希望能再次指教:
比如有个列表:cast=['a','b','c',['aa','bb','cc',['aaa','bbb']]],然后调用这个函数print0(cast,0),执行的结果会是
a
b
c
        aa
        bb
        cc
                aaa
                bbb
>>>
函数应该是通过range(level)来控制print(‘\t’,end='')执行的次数的,但是level的值是怎么取的,是取的else前的level+1的值吗?如果是的,当输出'a'的时候应该是range(0),输出'b'的时候是range(1),可为什么会到输出完'c'的时候才会执行一次print(‘\t’,end=''),然后后面的又是3次相同放步长?
如果不是取的level+1的值,又是取的哪里的值,来控制步长的?

可能问的问题都比较低级,但自己确实是想不通,见笑了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-14 11:46:29 | 显示全部楼层
chinahubo 发表于 2017-9-14 11:40
非常感谢!
经过各位的指点,现在对逻辑关系没有太多的疑问了,但是关于level的值还不是太清楚,希望能 ...

range(level)就是你调用函数是传递的值  你并没有对level做任何改变性的操作;

print0(each_item,level+1) 这个level只会单纯的按照level+1输出而不会自增

比如你的 level输入为:1

那么print0(each_item,level+1)  此处输出的level+1 只会是2 不会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 12:12:12 | 显示全部楼层
、尾指一勾 发表于 2017-9-14 11:46
range(level)就是你调用函数是传递的值  你并没有对level做任何改变性的操作;

print0(each_item,leve ...

非常感谢!
刚又重新把代码过了一下,我认为range(level)里level的值应该是取的前面的print0(each_item,level+1) 里的'level+1'的值,这里赋给level的初始值是‘0’,也就只有在if后面的值为true也就是each_item是子列表的时候才会执行一次print0(each_item,level+1) ,触发level+1,然后level的值就是前面level+1的结果即‘1’;否则的话就不会执行print0(each_item,level+1) ,level就会一直是初始值‘0’,也就不会执行内循环里的print('\t',end='');之前我是忽略了if后面的判断!
我写的可能比较啰嗦,不知道有没有说清楚,见谅!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-14 13:00:19 | 显示全部楼层
chinahubo 发表于 2017-9-14 12:12
非常感谢!
刚又重新把代码过了一下,我认为range(level)里level的值应该是取的前面的print0(each_ite ...

不会哦  如果要是取 print0(each_item,level+1) 取这个+1后的level 应该对level 进行自加1

print0(each_item,level+=1) 这样才对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 13:25:53 | 显示全部楼层
、尾指一勾 发表于 2017-9-14 13:00
不会哦  如果要是取 print0(each_item,level+1) 取这个+1后的level 应该对level 进行自加1

...

调用函数  print0(cast,0)
这样level的初始值就是0;
if isinstance(each_item,list)如果返回的值是true,就执行一次print0(each_item,level+1);下次循环的时候level的就是‘0+1’了;如果if返回的值是false,就不会执行print0(each_item,level+1),level的值仍然是初始值‘0’
这样可能更清楚点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 12:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表