gpt4 book ai didi

python - 奇怪的 if 语句

转载 作者:IT老高 更新时间:2023-10-28 20:23:24 25 4
gpt4 key购买 nike

我在别人的代码中发现了这个奇怪的 if 语句:

if variable & 1 == 0:

我不明白。应该有两个==吧?

谁能解释一下?

最佳答案

条件是 bitwise operator比较:

>>> 1 & 1
1
>>> 0 & 1
0
>>> a = 1
>>> a & 1 == 0
False
>>> b = 0
>>> b & 1 == 0
True

正如许多评论所说,对于整数,这个条件对于偶数是 True,对于赔率是 False。常用的写法是 if variable % 2 == 0:if not variable % 2:

使用 timeit 我们可以看到性能上并没有太大差异。

n & 1("== 0"and "not")

>>> timeit.Timer("bitwiseIsEven(1)", "def bitwiseIsEven(n): return n & 1 == 0").repeat(4, 10**6)
[0.2037370204925537, 0.20333600044250488, 0.2028651237487793, 0.20192503929138184]

>>> timeit.Timer("bitwiseIsEven(1)", "def bitwiseIsEven(n): return not n & 1").repeat(4, 10**6)
[0.18392395973205566, 0.18273091316223145, 0.1830739974975586, 0.18445897102355957]

n % 2("== 0"and "not")

>>> timeit.Timer("modIsEven(1)", "def modIsEven(n): return n % 2 == 0").repeat(4, 10**6)
[0.22193098068237305, 0.22170782089233398, 0.21924591064453125, 0.21947598457336426]

>>> timeit.Timer("modIsEven(1)", "def modIsEven(n): return not n % 2").repeat(4, 10**6)
[0.20426011085510254, 0.2046220302581787, 0.2040550708770752, 0.2044820785522461]

重载运算符:

%& 运算符都被重载了。

对于 set,位和运算符被重载. s.intersection(t) 等价于 s & t 并返回一个“包含 s 和 t 共有元素的新集合”。

>>> {1} & {1}
set([1])

这不会影响我们的条件:

>>> def bitwiseIsEven(n):
... return n & 1 == 0

>>> bitwiseIsEven('1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in bitwiseIsEven
TypeError: unsupported operand type(s) for &: 'str' and 'int'
>>> bitwiseIsEven({1})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in bitwiseIsEven
TypeError: unsupported operand type(s) for &: 'set' and 'int'

对于大多数非整数,模运算符也会抛出 TypeError: unsupported operand type(s)

>>> def modIsEven(n):
... return n % 2 == 0

>>> modIsEven({1})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in modIsEven
TypeError: unsupported operand type(s) for %: 'set' and 'int'

它被重载为旧 %-formatting 的字符串插值运算符.如果使用字符串进行比较,则会抛出 TypeError: not all arguments changed during string formatting

>>> modIsEven('1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in modIsEven
TypeError: not all arguments converted during string formatting

如果字符串包含有效的转换说明符,则不会抛出此错误。

>>> modIsEven('%d')
False

关于python - 奇怪的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29663428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com