免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1542 | 回复: 5

菜鸟问题,请帮忙看一下! [复制链接]

论坛徽章:
0
发表于 2012-04-05 22:47 |显示全部楼层
  1. def fib1(n):
  2.     a, b = 0, 1
  3.     while a < n:
  4.         yield a
  5.         a, b = b, a+b
复制代码
菲波拉契数列,就是没有搞明白a, b=b, a+b是怎么解释的~~!在下菜鸟,请高手帮忙解释一下,感谢!!

论坛徽章:
0
发表于 2012-04-06 08:30 |显示全部楼层
回复 1# 1514_louluo
a, b=b, a+b就是一个简单的赋值语句啊!没什么其他特点,将b的值赋给a,将a+b的值赋给b
无非这个函数使用了yield,使它成为了生成器函数,函数返回的是一个迭代器,且这个迭代器可以控制生成器函数的运行。所以,你可以如下使用:
  1. for i  in fib1(10):
  2.     print i
复制代码

论坛徽章:
0
发表于 2012-04-06 09:34 |显示全部楼层
回复 2# 追忆的风筝

谢谢你~!不过我还是对
  1. a,b=0,1
  2. a, b=b, a+b
复制代码
这种写法感到很困惑啊。。。为什么这种写法就和
  1. a,b=0,1
  2. tmp = b
  3. b = a+b
  4. a = tmp
复制代码
相同啊,大侠再稍微从语法上解释一下吧。。。

论坛徽章:
0
发表于 2012-04-06 09:37 |显示全部楼层
回复 3# 1514_louluo

你这是用C语言的思维再写Python...要学会Pythonic
   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2012-04-06 10:45 |显示全部楼层
回复 3# 1514_louluo
这里和赋值语句本身无关,而是Python的一个特性,至少C/C++中不存在。

分为两步理解:
1.tuple packing。等号右边b, a + b被pack为一个tuple
2.sequence unpacking。对tuple进行unpack,tuple的每个元素依次对等号右边的变量赋值,tuple的长度应与左边变量个数相同

所以这个特性可以简化某些参数传递和赋值


   

论坛徽章:
0
发表于 2012-04-06 12:36 |显示全部楼层
回复 1# 1514_louluo
谢谢各位大侠耐心讲解!在下明白了,原来我把a, b=b, a+b这条语句看成用逗号分隔的3个语句,所以一直没有想通。。。明明都知道a,b = 0,1的意思的。。。不得不承认自己很傻~.~!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP