免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2676 | 回复: 9
打印 上一主题 下一主题

python循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-23 10:30 |只看该作者 |倒序浏览
  1. >>> a = 0
  2. >>> b = 1
  3. >>> a
  4. 0
  5. >>> b
  6. 1
  7. >>> while b < 10:
  8. ...     print b
  9. ...     b = a+b
  10. ...     a = b
  11. ...
  12. 1
  13. 1
  14. 2
  15. 4
  16. 8
复制代码
  1. >>> a = 0
  2. >>> b = 1
  3. >>> while b < 10:
  4. ...     print b
  5. ...     a, b = b, a+b
  6. ...
  7. 1
  8. 1
  9. 2
  10. 3
  11. 5
  12. 8
复制代码
为什么写在一行和不写在一行结果不同呢?
我怎么感觉第一个是对的呢?

论坛徽章:
0
2 [报告]
发表于 2013-10-23 12:17 |只看该作者
  1. a, b = b, a+b
复制代码
应该等价于:

  1. a = b
  2. b= a+b
复制代码
吧?
这和你的:

  1. b = a+b
  2. a = b
复制代码
明显是:
顺序都不一样了。
而输出结果不一样,
那很正常吧?

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
3 [报告]
发表于 2013-10-23 12:30 |只看该作者
如果你写的是斐波那契数列,那么第一个的算法弄错了。
这里a应该等于“上上个”b,而你第一个算法中,a等于“上一个”b的值了。
相当于f(0) = 0, f(1) = 1, f(n) = f(n-1)+ f(n-1)。
而你的第二个算法才是正确的,f(n) = f(n-1)+ f(n-2)

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
4 [报告]
发表于 2013-10-23 13:18 |只看该作者

  1. b = a+b
  2. a = b
  3. 上面这个。。。我觉得就相当于 a = b = a + b
  4. a, b = b, a+b  相当于:
  5. c = a
  6. a = b
  7. b = c + b
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-10-23 13:40 |只看该作者
回复 2# crifan
  1. >>> a = 0
  2. >>> b = 1
  3. >>> while b < 10:
  4. ...     print b
  5. ...     a = b
  6. ...     b = a+b
  7. ...
  8. 1
  9. 2
  10. 4
  11. 8
复制代码
好像不是顺序的问题,输出结果是一样的。。

论坛徽章:
0
6 [报告]
发表于 2013-10-23 15:01 |只看该作者
本帖最后由 crifan 于 2013-10-23 15:02 编辑

回复 5# pzw1985


    从你贴出的结果,就能看到:
  1. 1
  2. 1
  3. 2
  4. 4
  5. 8
复制代码

和:
  1. 1
  2. 2
  3. 4
  4. 8
复制代码

这样的结果,可以叫做:
一样的
???

当然,如果要讨论你的:
1.本意是什么
2.算法实现是否有错
那就是另外一回事了。
就需要搞清楚你:
1.本地到底如何,想要实现什么效果,什么算法
2.然后再去讨论,你写的代码,是否有错,应该怎么改
了。
你说呢?

论坛徽章:
3
卯兔
日期:2013-08-15 13:17:31处女座
日期:2014-01-10 11:35:23双子座
日期:2014-01-25 02:16:06
7 [报告]
发表于 2013-10-23 15:55 |只看该作者
本帖最后由 sunny7476 于 2013-10-23 15:56 编辑

回复 5# pzw1985
  1. a, b = b, a+b
  2. 等价于
  3. a = 原来的b
  4. b = 原来的a + 原来的b
复制代码
  1. a = b
  2. b = a + b
  3. 中,第二个a的值变化了,其实上式就等于
  4. b = b + b
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-10-23 17:16 |只看该作者
回复 6# crifan

不好意思,结果是不一样。谢谢!

原意就是得到菲波那契数列的结果,本来以为
  1. a, b = b, a+b

  2. a = b
  3. b = a+b
  4. 是一样的
复制代码
谢谢!

论坛徽章:
0
9 [报告]
发表于 2013-10-23 17:21 |只看该作者
回复 7# sunny7476
谢谢你!

在python文档中看到
  1. >>> a, b = 0, 1
  2. >>> while b < 10:
  3. ...     print b
  4. ...     a, b = b, a+b
  5. ...
  6. 1
  7. 1
  8. 2
  9. 3
  10. 5
  11. 8
复制代码
  1. 第一行包括了复合参数:变量a和b同时被赋值为0和1。最后一行又一次使用了这种技术,证明了在赋值之前表达式右边先进行了运算。右边的表达式从左到右运算。
复制代码
右边先计算的话应该就是使用的原来的a和原来的b相加了。

谢谢!

论坛徽章:
0
10 [报告]
发表于 2013-11-07 11:12 |只看该作者
回复 4# stanley_tam

个人觉得这个解释是正确的,翻看书本:

a,b = b,a+b  这是 元组 赋值,只是省略了()
元组赋值Python会建立临时的元组,来储存右面变量的原始的值

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP