斐波那契数列python编程_我的Python编写斐波那契数列为什么跑不动?

简短的回答:

判断条件应该改为 (a == 1) or (a == 2) ,或者是 a in (1, 2) 。实际上后者是更加推荐的写法。

只知道答案当然不行,作为新手不应该止步于此。

更长的回答:

这是一个在新手可能常见的失误:python中的or运算符可能和你想的不太一样。先看下面的例子:

为什么 a == 1 or 2 这个表达式总是返回2?实际上,从第5式可以看出来,由于判断相等的运算符优先级比or更高,所以实际上等价于 (a == 1) or 2 ,其中(a == 1)的值为假的时候,实际上就成了:False or 2。题主可能把这个表达式理解成了与(a == 1) or (a == 2)等价,但事实并非如此。

你可能听说过,对于非零的数字都被当做布尔真值True。但是如果这样的话你可能会疑惑,False or 2那就相当于False or True,也应该返回True啊,怎么会是2呢?

这是因为在Python的二元逻辑运算(指使用or、and运算符的运算)中,并不会把参与运算的值转换成布尔类型的值。有些抽象,举个例子:对于表达式A or B,程序会先检查A的值是不是True,如果为真的话,就直接返回A本身的值,而不是返回True;如果A为假,就继续检查下一个,也就是B,如果为真则返回B的值;如果B也为假,那么仍然返回B的值。

也就是说,在逻辑或运算(or运算)中,实际上是:如果A的逻辑值为真,那么返回A的值,否则返回B的值。这样做的好处是,它保留了参与运算的值本身,这样可以用于下一步的其它运算,而不是一律“碾平”成为True或者False这样的布尔值并丢失了原本的信息。

比如,你可能在一些代码中见到这样的写法:

some_val = a or b

# 甚至:

some_val = a or b or c

我们且不论这样做的好坏。第一个表达式实际上的意思是,如果a的布尔值为真的话,就直接把a赋值给some_val;否则,就把b赋值给some_val。这是一种可行的给some_val设置默认值的办法。

逻辑与运算(and运算)也是类似:

类比上面的or运算,题主可以自己体会并分析一下and运算的逻辑。

抽象地概括,一连串的or运算实际上是返回表达式中第一个逻辑值为真的值,或是表达式中的最后一个值;而一连串的and运算则是返回表达式中第一个逻辑值为假的值,或者表达式中的最后一个值。如果还是觉得不好理解,题主可以亲自在python的交互式解释器中尝试一下。

这个逻辑还有一个“副作用”是短路运算,简单地说,对于表达式 A or B or C,如果一开始A就为真、直接返回A,那么B和C就根本不会被求值。这个是什么意思呢?如果B和C是具有其它副作用的函数时就会体现出区别,还是直接上代码:

and运算也是类似:

最后要说的是,打好基础是非常重要的。其实我本来是不太想回答这个问题的。

结论:

判断一个变量是否等于多个值的其中一个,应该使用in运算符,也就是改为:

if n in (1, 2):

...

这样对于n为1或者n为2的情况都会判断为真,是最推荐、最简洁明确的写法。对于能使用in来判断的情况,应当总是使用in,而不是用 (n == 1) or (n == 2) 来判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值