您将打印字符串"Buzz"
一次if (i % 5 == 0)
为 True 或返回i
:
In [5]: "foo" * 2
Out[5]: 'foofoo'
In [6]: "foo" * 3
Out[6]: 'foofoofoo'
In [7]: i = 5
In [8]: "foo" * (i % 5 == 0) or i
Out[9]: 'foo'
In [9]: "foo" * (i % 5 == 1) or i
Out[22]: 5
同样的逻辑适用于“Fizz”有时(i % 3 == 0)
会是 True,所以我们只看到一次,当它是 False 时,我们看不到它。
当您*
在字符串上使用运算符时,它将重复字符串n
次数,在这种情况下,它最多会重复一次,因为任一字符串仅根据布尔测试的结果打印。
True
你可以在 ipython 中看到和发生了什么False
:
In [26]: "foo" * True
Out[26]: 'foo'
In [27]: "foo" * False
Out[27]: ''
基本上True * "foo"
相当于1 * "foo"
"foo" * False
相当于0 * "foo"
Bool 是 int 的子类,因此代码利用了这一事实,您有时会看到类似的逻辑用于基于测试索引列表,但不推荐:
In [31]: d = ["bar","foo"]
In [32]: d[3<2] # False so we get 0 the first element
Out[32]: 'bar'
In [33]: d[3>2] # True so we get 1 the second element
Out[33]: 'foo'